我知道guarded_open_np是一个私有API,我既没有找到头文件也没有关于它的文档.我想在guarded_open_np上进行拦截(Cydia的MSFunctionHook),所以我需要知道什么是参数,而不仅仅是函数名.
我使用IDA Pro对libsqlite3.dylib进行了逆向工程,这就是它所谓的guarded_open_np:
sub_79c1c: push {r7,lr} mov r7,sp sub sp,#0x4 mov r3,r1 movw r1,#0xc57e movt r1,#0x0 str r2,[sp,#0x4 + var_0] add r1,pc movs r2,#0xf blx imp___picsymbolstub4__guarded_open_np add sp,#0x4 pop {r7,pc}
但是,目前尚不清楚它可能采取什么样的准则.如果有一些官方网站提到guarded_open_np及其所有参数,我很感激.
解决方法
也就是说,这里有一些参考资料可能有助于您找到自己找到的工具:
首先,您可能已经知道,但了解寄存器和堆栈.
在汇编中,要调用一个函数,你通常会遵循一个叫做应用程序二进制接口(ABI)的东西,它只是设置了函数期望它们的参数(寄存器,堆栈等)的约定,这些寄存器允许函数调用改变等等. .
由于这是iOS,你应该看看Procedure Call Standard for ARM Architecture和iOS ABI Function Call Guide.
查看上面第一个链接中的“基本过程调用标准”部分,可以看出函数调用期望它们的前四个参数分别位于寄存器r0~r4中.
因此,对于您的调查,您可能希望在分支到guarded_open_np存根之前找出这些寄存器中的内容. XCode可以为你吐出文件的程序集,你应该可以在它上面设置断点;然后使用llvm中的register read命令向您显示所有寄存器内容(注意一些寄存器可能只包含您希望使用内存读取lldb命令检查的内存位置).
为了进一步深入iOS组装,我推荐Mike Ash的三部分博客文章“拆卸大会”部分1,2和3.然后你可能会喜欢他最近的帖子在ARM 64 bit updates.这些是非正式的资源,但确实可以帮助你通过扫描组件快速掌握,并且通常知道发生了什么.