2013-08-16 15 views
8

我发现guarded_open_np函数被libsqlite3.dylib用来打开数据库文件。我看了一下sqlite3开源,没有这样的事情。所以肯定苹果已经修改它使用guarded_open_np而不是unix的openguarded_open_np的参数

我知道guarded_open_np是一个私人API,我没有发现头文件或文档。我想在guarded_open_np上做拦截(Cydia的MSFunctionHook),所以我需要知道什么是参数,而不仅仅是函数名。

我逆向工程libsqlite3.dylib使用IDA Pro的,这是怎么叫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}  

但是,目前还不清楚是什么PARAMS它可能需要。我很感激,如果有一些官方网站提及guarded_open_np及其所有参数。

+3

我最好的猜测是,它看起来像UNIX的开放(3):https://gist.github.com/CodaFi/7c73abd9dfb602dcc26e – CodaFi

+1

@Krypton你能够钩住这个调试器,并检查什么内容的寄存器r0〜r3(如果它们指向内存,内存的内容)在blx语句之前?调用约定通常使用r0作为第一个参数,r1作为第二个等。 – Ncat

回答

2

从这里的信息,我不相信我们能够给出一个坚实的答案,虽然CodaFi是一个很好的建议。

也就是说,这里有一些参考文献,可能是在给你的工具,找出自己有所帮助:

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

在汇编中,为了调用一个函数,你通常会遵循一个叫做应用程序二进制接口(ABI)的应用程序接口(ABI),它只是建立一些约定,比如函数期望它们的参数在哪里(寄存器,堆栈等)以改变等等

由于这是iOS版,您应该查看Procedure Call Standard for ARM ArchitectureiOS ABI Function Call Guide

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

因此,为了您的调查,您可能想要在分支到guarded_open_np存根之前找出这些寄存器中的内容。 XCode可以为你提供一个文件的汇编,你应该可以在其上设置断点;然后使用llvm中的register read命令向您显示所有寄存器内容(注意一些寄存器可能只包含您想要使用memory read lldb命令检查的存储器位置)。

为了深入了解iOS程序集,我建议Mike Ash的3部分博客文章“Disassemble the Assembly”部分1,23。那么你可能会喜欢他最近的帖子ARM 64 bit updates。这些都是非正式的资源,但是可以帮助您快速掌握扫描装配并知道在哪里发生了什么。

+0

感谢Wilson提供的材料和参考资料。我想这需要相当长的一段时间来消化这些东西:D – Krypton

+0

@Krypton感谢信用!没有真正期待这一点。上面提到的博客文章实际上是一个相当不错的出发点(ABI参考和东西非常密集,并不适用于学习汇编)。然而,如果你真的想知道你的东西,那么兰德尔海德的文章,艺术汇编语言是一个强烈推荐阅读。 – Ncat