guarded_open_np 的参数
Posted
技术标签:
【中文标题】guarded_open_np 的参数【英文标题】:Parameters of guarded_open_np 【发布时间】:2013-08-18 17:29:06 【问题描述】:我发现libsqlite3.dylib使用guarded_open_np
函数来打开数据库文件。我查看了 sqlite3 开源,没有这样的东西。所以肯定苹果已经修改它使用guarded_open_np
而不是unix的open
。
我知道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
及其所有参数,我将不胜感激。
【问题讨论】:
我最好的猜测是它看起来像 UNIX 的 open(3):gist.github.com/CodaFi/7c73abd9dfb602dcc26e @Krypton 您能否将其挂接到调试器中并在 blx 语句之前检查寄存器 r0~r3 的内容(如果它们指向内存,则内存的内容)?调用约定通常使用 r0 作为第一个参数,r1 作为第二个参数,以此类推。 【参考方案1】:从这里的信息来看,我不相信我们能够给出一个可靠的答案,尽管 CodaFi 是一个很好的建议。
也就是说,这里有一些参考资料可能有助于为您提供了解自己的工具:
首先,您可能已经知道,但要了解寄存器和堆栈。
在汇编中,要调用函数,您通常遵循称为应用程序二进制接口 (ABI) 的东西,它只是设置约定,例如函数期望其参数的位置(寄存器、堆栈等),允许注册函数调用改变等等。
由于这是 ios,您应该查看 Procedure Call Standard for ARM Architecture 和 iOS ABI Function Call Guide。
查看上面第一个链接中的“基本过程调用标准”部分,您可以看出函数调用期望它们的前四个参数分别位于寄存器 r0~r4 中。
因此,对于您的调查,您可能希望在分支到 guarded_open_np 存根之前找出这些寄存器中的内容。 XCode 可以为你吐出一个文件的程序集,你应该可以在上面设置断点;然后在 llvm 中使用 register read
命令向您显示所有寄存器内容(请注意,某些寄存器可能只包含您希望使用 memory read
lldb 命令检查的内存位置)。
为了更深入地了解 iOS 程序集,我推荐 Mike Ash 的三篇博文“拆卸程序集”部分 1、2 和 3。那么你可能会喜欢他最近在ARM 64 bit updates 上的帖子。这些是非正式资源,但确实可以帮助您快速掌握扫描程序集并大致了解在哪里发生了什么。
【讨论】:
感谢 Wilson 提供的材料和参考资料。我想消化这些东西需要相当长的时间:D @Krypton 感谢您的信任!真的没想到。上面引用的博客文章实际上是一个相当不错的起点(ABI 参考和内容非常密集,并不是真正用于学习汇编)。但是,如果您真的想了解自己的东西,那么强烈推荐阅读 Randall Hyde 的著作《汇编语言的艺术》。【参考方案2】:见https://opensource.apple.com/source/xnu/xnu-7195.81.3/libsyscall/wrappers/guarded_open_np.c
int guarded_open_np(const char *path,
const guardid_t *guard, u_int guardflags, int flags, ...)
(顺便说一句,问题和答案之间最长持续时间的记录是什么?:))
【讨论】:
以上是关于guarded_open_np 的参数的主要内容,如果未能解决你的问题,请参考以下文章
underscorejs之_.contains(list, item, fromIndex, guard)