2013-08-16 12 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