第一個(gè)鉤子程序: inline hook

最近研究沙箱優(yōu)化,發(fā)現(xiàn)需要學(xué)習(xí)一下 hook API 的方法焦蘑,于是去啃了cuckoo的源碼盯拱,發(fā)現(xiàn)基本原理是一種叫做inline hook的hook方法,于是去專門查了一下inline hook例嘱,看到了luoyesiqiu的文章狡逢,讓我明白了很多之前不懂的地方。(文章鏈接https://www.cnblogs.com/luoyesiqiu/p/12306336.html)

于是我就把例子代碼copy回來拼卵,稍微改動(dòng)一下奢浑,想運(yùn)行一下看看情況。?

StartHook和UnHook都沒動(dòng)腋腮,就改了一下調(diào)用和回調(diào)函數(shù):

先不在意其他細(xì)節(jié)雀彼,總體邏輯就是hook GetSystemInfo,然后調(diào)用GetSystem即寡,再解hook

回調(diào)函數(shù)就是在GetSystemInfo 被調(diào)用的時(shí)候輸出“Im hook;惭啤!聪富!”

編譯莺丑,運(yùn)行


問題出現(xiàn)了,程序確實(shí)跳到回調(diào)了墩蔓,可是沒跳回來梢莽。

反復(fù)翻看大哥的文章原文,發(fā)現(xiàn)大哥的例子其實(shí)只是單純的講述了Inline hook的原理奸披,而不是用inline 來hook API的昏名,因此例子代碼僅在hook地址是一個(gè)5字節(jié)call 的時(shí)候,才能順利跳到回調(diào)函數(shù)再跳回來阵面。

如果hook一個(gè)系統(tǒng)函數(shù)葡粒,函數(shù)體頭部幾乎不可能是一個(gè)call指令,所以還要多考慮一些事情膜钓。

于是我腦袋里設(shè)想了一下大概的思路嗽交,就是替換5字節(jié)之后,要把原有的第一條指令進(jìn)行備份颂斜,并記錄下第二條指令的起始位置夫壁,在hook 跳轉(zhuǎn)到回調(diào)函數(shù)后,執(zhí)行完附加的工作之后沃疮,還要執(zhí)行一下備份第一條指令的原有操作盒让,然后再jmp回函數(shù)體的第二條指令繼續(xù)執(zhí)行梅肤,這樣才能保證程序正常執(zhí)行。

于是邑茄,我明白了調(diào)用了反編譯器的lde函數(shù)在計(jì)算什么姨蝴,它應(yīng)該是想得到一條完整指令的長度。

我也明白了一件事肺缕,想輕松HookAPI 不是一件輕松的事左医,所以我打算站在巨人的肩膀上,使用cuckoo的代碼(畢竟后面優(yōu)化沙箱也會(huì)用到)

為便于理解同木,我打算先以自己的方式完成這個(gè)hook

先把所有和hook相關(guān)的部分刪掉調(diào)試一下浮梢,觀察GetSystemInfo的函數(shù)體,記住這個(gè)地址彤路。

然后秕硝,再編譯一個(gè)有hook的版本,再觀察這個(gè)位置的變化洲尊,checkCPU入口(0x00d26dd0)下斷點(diǎn)远豺,發(fā)現(xiàn)跟我想的不一樣,改的不是GetSystemInfo的函數(shù)體坞嘀,而是一個(gè)6字節(jié)的jmp憋飞,想想也是,這里是kernel32.dll的一個(gè)函數(shù)列表姆吭,為什么不是直接走函數(shù)體榛做,我也不理解,可能是出于安全考慮内狸。

這樣的話事情似乎變得簡(jiǎn)單了检眯,和大哥的例子就很像了。

可以看到 我們覆蓋的位置(0x775d9f80)5個(gè)字節(jié)昆淡,就是一條jmp(FF 25)指令的前五個(gè)字節(jié)锰瘸,跳轉(zhuǎn)地址00186477,這個(gè)地址應(yīng)該是不變的昂灵。

執(zhí)行過starthook函數(shù)避凝,看一下,我們的確成功替換了5個(gè)字節(jié)眨补,代碼執(zhí)行到這的時(shí)候會(huì)跳轉(zhuǎn)到我們的hook函數(shù)上:

但我們做的不夠好管削,第一,我們落下一個(gè)0x77沒有替換撑螺,讓他變成了一個(gè)ja 指令含思。第二,我們沒有讓程序回到00186477(0x77641800)

我們先不管第一個(gè)問題,先讓hook函數(shù)做完想做的事后含潘,繼續(xù)去執(zhí)行GetSystemInfo函數(shù)饲做。

編譯運(yùn)行,程序又又又崩了遏弱,是沒跳回去嗎盆均?調(diào)試!

和前面的步驟漱逸,執(zhí)行到GetSystemInfo跟進(jìn)去泪姨,跳進(jìn)hook函數(shù),可以看到虹脯,做完想做的事之后,會(huì)call getsysteminfo(那為什么崩了呢奏候?)

call進(jìn)來之后循集,這崩了……

這里搞錯(cuò)了,這里原來的指令應(yīng)該是 jmp [0x77641800] 的地址 0x7648f370蔗草。

再修改一次代碼:

編譯執(zhí)行:

bingoV渫!咒精!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镶柱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子模叙,更是在濱河造成了極大的恐慌歇拆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件范咨,死亡現(xiàn)場(chǎng)離奇詭異故觅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渠啊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門输吏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人替蛉,你說我怎么就攤上這事贯溅。” “怎么了躲查?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵它浅,是天一觀的道長。 經(jīng)常有香客問我镣煮,道長罚缕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任怎静,我火速辦了婚禮邮弹,結(jié)果婚禮上黔衡,老公的妹妹穿的比我還像新娘。我一直安慰自己腌乡,他們只是感情好盟劫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著与纽,像睡著了一般侣签。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上急迂,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天影所,我揣著相機(jī)與錄音,去河邊找鬼僚碎。 笑死猴娩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勺阐。 我是一名探鬼主播卷中,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渊抽!你這毒婦竟也來了蟆豫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤懒闷,失蹤者是張志新(化名)和其女友劉穎十减,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愤估,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉称,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灵疮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片织阅。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖震捣,靈堂內(nèi)的尸體忽然破棺而出荔棉,到底是詐尸還是另有隱情,我是刑警寧澤蒿赢,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布润樱,位于F島的核電站,受9級(jí)特大地震影響羡棵,放射性物質(zhì)發(fā)生泄漏壹若。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望店展。 院中可真熱鬧养篓,春花似錦、人聲如沸赂蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽概说。三九已至碧注,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糖赔,已是汗流浹背萍丐。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留放典,地道東北人逝变。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像刻撒,于是被迫代替她去往敵國和親骨田。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耿导,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了箱吕? 不是不允許自己墜落芥驳, 我沒有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,246評(píng)論 0 13
  • 夜鶯2517閱讀 127,720評(píng)論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實(shí)時(shí)更新天氣溫度或選擇空氣質(zhì)量茬高,建議處女座就不要選了兆旬,不然老想...
    我就是沉沉閱讀 6,891評(píng)論 1 6
  • 我是一名過去式的高三狗,很可悲怎栽,在這三年里我沒有戀愛丽猬,看著同齡的小伙伴們一對(duì)兒一對(duì)兒的,我的心不好受熏瞄。怎么說呢脚祟,高...
    小娘紙閱讀 3,388評(píng)論 4 7
  • 那一年,我選擇了獨(dú)立遠(yuǎn)行强饮,火車帶著我在前進(jìn)的軌道上爬行了超過23個(gè)小時(shí)由桌; 那一年,我走過泥濘的柏油路,在那個(gè)遠(yuǎn)離故...
    木芽閱讀 1,637評(píng)論 4 5