9

我发现guarded_open_nplibsqlite3.dylib 使用该函数来打开数据库文件。我查看了 sqlite3 开源,没有这样的东西。所以肯定苹果已经修改它来guarded_open_np代替 unix 的open.

我知道这guarded_open_np是一个私有 API,我没有找到关于它的标题和文档。我想在 上进行拦截(Cydia 的 MSFunctionHook)guarded_open_np,所以我还需要知道参数是什么,而不仅仅是函数名。

我使用 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及其所有参数,我将不胜感激。

4

2 回答 2

2

从这里的信息来看,我不相信我们能够给出一个可靠的答案,尽管 CodaFi 是一个很好的建议。

也就是说,这里有一些参考资料可能有助于为您提供了解自己的工具:

首先,您可能已经知道,但要了解寄存器和堆栈。

在汇编中,要调用函数,您通常遵循称为应用程序二进制接口 (ABI) 的东西,它只是设置约定,例如函数期望其参数在哪里(寄存器、堆栈等),注册函数调用允许更改等等.

由于这是 iOS,您应该查看ARM 体系结构的过程调用标准iOS ABI 函数调用指南

查看上面第一个链接中的“基本过程调用标准”部分,您可以看出函数调用期望它们的前四个参数分别位于寄存器 r0~r4 中。

因此,对于您的调查,您可能希望在分支到 guarded_open_np 存根之前找出这些寄存器中的内容。XCode 可以为你吐出一个文件的程序集,你应该可以在上面设置断点;然后使用register readllvm 中的命令向您显示所有寄存器内容(请注意,某些寄存器可能只包含您希望使用memory readlldb 命令检查的内存位置)。

为了更深入地了解 iOS 程序集,我推荐 Mike Ash 的由 3 部分组成的博文“拆卸程序集”第1、23部分。那么您可能会喜欢他最近关于ARM 64 位更新的帖子。这些是非正式资源,但确实可以帮助您快速掌握扫描组件并大致了解在哪里发生了什么。

于 2013-10-09T08:54:13.717 回答
0

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, ...)

(顺便说一句,问题和答案之间最长持续时间的记录是什么?:))

于 2021-08-10T10:54:33.537 回答