fishhook 實(shí)現(xiàn)的大致思路是,通過重新綁定符號(hào)阔籽,可以實(shí)現(xiàn)對(duì) c 方法的 hook。dyld 是通過更新 Mach-O 二進(jìn)制的 __DATA segment 特定的部分中的指針來綁定 lazy 和 non-lazy 符號(hào)伞辛,通過確認(rèn)傳遞給 rebind_symbol 里每個(gè)符號(hào)名稱更新的位置溢豆,就可以找出對(duì)應(yīng)替換來重新綁定這些符號(hào)。下面蜡秽,我針對(duì) fishhook 里的關(guān)鍵代碼府阀,和你具體說下 fishhook 的實(shí)現(xiàn)原理。首先芽突,遍歷 dyld 里的所有 image试浙,取出 image header 和 slide。代碼如下:
接下來寞蚌,找到符號(hào)表相關(guān)的 command田巴,包括 linkedit segment command、symtab command 和 dysymtab command挟秤。代碼如下:
然后壹哺,獲得 base 和 indirect 符號(hào)表。實(shí)現(xiàn)代碼如下:
最后艘刚,有了符號(hào)表和傳入的方法替換數(shù)組管宵,就可以進(jìn)行符號(hào)表訪問指針地址的替換了,具體實(shí)現(xiàn)如下:
以上攀甚,就是 fishhook 的實(shí)現(xiàn)原理了啄糙。fishhook 是對(duì)底層的操作,其中查找符號(hào)表的過程和堆棧符號(hào)化實(shí)現(xiàn)原理基本類似云稚,了解了其中原理對(duì)于理解可執(zhí)行文件 Mach-O 內(nèi)部結(jié)構(gòu)會(huì)有很大的幫助隧饼。
參考:https://time.geekbang.org/column/article/85331