0x17 Fishhook

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

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

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

什么是fishhook

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

什么是Mach-O

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

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

fishhook的原理

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

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ù)組,通過(guò)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)體,其中包含字符表偏移量。通過(guò)字符表偏移量最終確定函數(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ù)是用來(lái)注冊(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)容。

不得不說(shuō),facebook忒NB。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,467評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,468評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,582評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,794評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,941評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,190評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,026評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

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