0x17 Fishhook

注:原文---念茜的博客

眾所周知,Objective-C的首選hook方案為Method Swizzle,于是大家紛紛表示核心內(nèi)容應(yīng)該用C寫。

接下來進(jìn)階說說iOS下C函數(shù)的hook方案,先介紹第一種方案-fishhook.

什么是fishhook

fishhook是facebook提供的一個(gè)動(dòng)態(tài)修改鏈接Mach-O符號(hào)表的開源工具。

什么是Mach-O

Mach-O為Mach Object文件格式的縮寫,也是用于iOS可執(zhí)行文件,目標(biāo)代碼,動(dòng)態(tài)庫,內(nèi)核轉(zhuǎn)儲(chǔ)的文件格式。

Mach-O有自己的dylib規(guī)范。

fishhook的原理

詳見官方的How it works,這里我作個(gè)簡(jiǎn)要說明。

dyld鏈接2種符號(hào),lazy和non-lazy,fishhook可以重新鏈接/替換本地符號(hào)。

如圖所示,__DATA區(qū)有兩個(gè)section和動(dòng)態(tài)符號(hào)鏈接相關(guān):__nl_symbol_ptr 、__la_symbol_ptr。__nl_symbol_ptr為一個(gè)指針數(shù)組,直接對(duì)應(yīng)non-lazy綁定數(shù)據(jù)。__la_symbol_ptr也是一個(gè)指針數(shù)組,通過dyld_stub_binder輔助鏈接。的section頭提供符號(hào)表的偏移量。

圖示中,1061是間接符號(hào)表的偏移量,*(偏移量+間接符號(hào)地址)=16343,即符號(hào)表偏移量。符號(hào)表中每一個(gè)結(jié)構(gòu)都是一個(gè)nlist結(jié)構(gòu)體,其中包含字符表偏移量。通過字符表偏移量最終確定函數(shù)指針。

fishhook就是對(duì)間接符號(hào)表的偏移量動(dòng)的手腳,提供一個(gè)假的nlist結(jié)構(gòu)體,從而達(dá)到hook的目的。

fishhook替換符號(hào)函數(shù):

關(guān)鍵函數(shù)是 _dyld_register_func_for_add_image,這個(gè)函數(shù)是用來注冊(cè)回調(diào),當(dāng)dyld鏈接符號(hào)時(shí),調(diào)用此回調(diào)函數(shù)。 rebind_symbols_for_image 做了具體的替換和填充。

fishhook替換Core Foundation函數(shù)的例子

以下是官方提供的替換Core Foundation中open和close函數(shù)的實(shí)例代碼

注釋//fishhook用法處

傳入rebind_symbols的第一個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體數(shù)組,大括號(hào)中為對(duì)應(yīng)數(shù)組內(nèi)容。

不得不說,facebook忒NB。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 13. Hook原理介紹 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語...
    Flonger閱讀 1,530評(píng)論 0 3
  • 關(guān)注倉庫,及時(shí)獲得更新:iOS-Source-Code-AnalyzeFollow: Draveness · Gi...
    Draveness閱讀 6,106評(píng)論 5 33
  • 這是Mach-O系列的第三篇 閱讀 FishHook源碼之前,你可能需要對(duì)以下知識(shí)有個(gè)簡(jiǎn)單的了解 Mach-O文件...
    Joy___閱讀 7,938評(píng)論 9 45
  • 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語言,調(diào)用一個(gè)方法其實(shí)就是跳...
    泰克2008閱讀 2,361評(píng)論 1 6
  • 眾所周知,Objective-C 的首選 hook 方案為 Method Swizzle,于是大家紛紛表示核心內(nèi)容...
    無灃閱讀 718評(píng)論 0 0

友情鏈接更多精彩內(nèi)容