fishhook的注意點

有關(guān)fishhook的原理如果看過之前的MachO鏈接過程,那其實就應(yīng)該很簡單了军浆,他就是講懶加載符號表和非懶加載符號表的值改版了棕洋,使它指向我們自己的地址,然后又把原函數(shù)的真實地址保存在了一個指針上乒融, 讓外部可以繼續(xù)調(diào)用原來的函數(shù)掰盘。關(guān)于源碼解析的文章,可以閱讀下面的兩篇赞季。
http://ios.jobbole.com/92918/
http://m.desgard.com/2017/12/17/fishook-1/index.html
這里想說的是一個注意點愧捕。剛剛說到fishhook把原函數(shù)的真實地址保存在了一個指針上, 讓外部可以繼續(xù)調(diào)用原來的函數(shù)申钩〈位妫考慮一種情況,我們在某個系統(tǒng)的A函數(shù)首次調(diào)用前撒遣,使用fishhook去hook它邮偎,在我們的hook函數(shù)里面去調(diào)用了原來的函數(shù)。然后在hook之后义黎,連續(xù)調(diào)用兩次剛剛我們hook的函數(shù)禾进。偽代碼如下,請問會輸出幾個"hook method"廉涕?

static void (*ori_system_method_A)(void);
void hook_system_method_A() {
    NSLog(@"hook method");
    ori_system_method_A();
}

- (void)viewDidLoad {
    rebind_symbols((struct rebinding[]){
        {"system_method_A", (void *)&hook_system_method_A, (void **)&ori_system_method_A}
    }, 1);
    system_method_A();
    system_method_A();
}

正確答案是可能1次泻云,也可能2次,這取決于system_method_A具體是什么函數(shù)火的。造成這種差別的原因在于壶愤,該函數(shù)是不是有被其他庫調(diào)用,且其他庫已經(jīng)綁定了真實的函數(shù)地址馏鹤≌鹘罚看了fishhook的源碼之后應(yīng)該知道,fishhook是注冊了_dyld_register_func_for_add_image函數(shù)來監(jiān)聽image的加載湃累,當(dāng)加載一個每次這個callback回調(diào)之后勃救,就會對傳入的image進(jìn)行處理,拿到image的懶加載表和非懶加載表治力,對其中每一項進(jìn)行遍歷蒙秒,和我們需要hook的函數(shù)名稱做比較,如果找到了名字一樣的函數(shù)宵统,就將我們傳入的原函數(shù)的指針指向該項所指向的函數(shù)地址晕讲。這里面需要注意,我們只傳入了一個原函數(shù)的指針,所以舊的值會被新的值所覆蓋瓢省。
那么考慮一種情況:如果我需要hook的函數(shù)沒有其他image調(diào)用了弄息,那么就只能在自己的image里面找到匹配,然后進(jìn)行替換勤婚,但是這個時候摹量,所替換的原函數(shù)地址值是最終調(diào)用stub_helper的。所以當(dāng)我們調(diào)用了原函數(shù)指針對應(yīng)的函數(shù)之后,就會觸發(fā)stub_helper,然后stub_helper又會把懶加載表里面的值改為真實的函數(shù)地址载弄。所以就會造成我們的hook方法只能執(zhí)行一遍。
考慮第二種情況:我們需要hook的函數(shù)被其他image調(diào)用了睦尽,且該image的懶加載表或非懶加載表里面已經(jīng)是真實的函數(shù)地址,那么fishhook在處理的時候液兽,雖然第一次是拿到了我們image內(nèi)指向stub_helper的地址骂删,但是后面會被其他image里面的真實的函數(shù)地址所覆蓋。所以調(diào)用原函數(shù)指針對應(yīng)的函數(shù)并不影響我們image里面的懶加載表四啰,故我們的hook方法可以執(zhí)行2次。
總結(jié)一下就是:調(diào)用fishhook之前粗恢,最好把這個需要hook函數(shù)調(diào)用一下柑晒,讓其綁定真實的地址。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眷射,一起剝皮案震驚了整個濱河市匙赞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妖碉,老刑警劉巖涌庭,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欧宜,居然都是意外死亡坐榆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門冗茸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席镀,“玉大人,你說我怎么就攤上這事夏漱『阑澹” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵挂绰,是天一觀的道長屎篱。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么交播? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任专肪,我火速辦了婚禮,結(jié)果婚禮上堪侯,老公的妹妹穿的比我還像新娘嚎尤。我一直安慰自己,他們只是感情好伍宦,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布芽死。 她就那樣靜靜地躺著,像睡著了一般次洼。 火紅的嫁衣襯著肌膚如雪关贵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天卖毁,我揣著相機與錄音揖曾,去河邊找鬼。 笑死亥啦,一個胖子當(dāng)著我的面吹牛炭剪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翔脱,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼奴拦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了届吁?” 一聲冷哼從身側(cè)響起错妖,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疚沐,沒想到半個月后暂氯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亮蛔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年痴施,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔邓。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡晾剖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梯嗽,到底是詐尸還是另有隱情齿尽,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布灯节,位于F島的核電站循头,受9級特大地震影響绵估,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卡骂,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一国裳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧全跨,春花似錦缝左、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挪钓,卻和暖如春是越,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碌上。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工倚评, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馏予。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓天梧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吗蚌。 傳聞我的和親對象是個殘疾皇子腿倚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 1 dyld 1.1 dyld簡介 在iOS系統(tǒng)中,幾乎所有的程序都會用到動態(tài)庫蚯妇,而動態(tài)庫在加載的時候都需要用d...
    Kevin_Junbaozi閱讀 11,808評論 4 44
  • 一 知識回顧 在上一節(jié),我們分析了fishhook的原理, 知道fishhook 通過動態(tài)修改懶加載或非懶加載指針...
    ldzSpace閱讀 756評論 0 2
  • 一 知識預(yù)備 1: 靜態(tài)庫和動態(tài)庫 我們自己寫的代碼,會調(diào)用很多外部的庫暂筝,包括靜態(tài)庫箩言,動態(tài)庫 問題來了,動態(tài)庫和靜...
    ldzSpace閱讀 804評論 0 1
  • 13. Hook原理介紹 13.1 Objective-C消息傳遞(Messaging) 對于C/C++這類靜態(tài)語...
    Flonger閱讀 1,408評論 0 3
  • 13.1 Objective-C消息傳遞(Messaging) 對于C/C++這類靜態(tài)語言焕襟,調(diào)用一個方法其實就是跳...
    泰克2008閱讀 1,995評論 1 6