inline hook 實際上就是指 通過改變目标函數頭部的代碼來使改變後的代碼跳轉到我們自己設定的一個函數裡,産生hook。
今天就拿MessageBoxA這個api函數來做實驗。功能就是當程式調用MessageBoxA 時,我們列印出MessageBoxA的參數
大概代碼結構應該是這樣
<a></a>
我們先看看彙編是怎樣調用MessageBoxA的
首先看到,MessageBoxA裡面
mov edi,edi
mov ebp
mov ebp,esp
剛好是5個位元組,5個位元組可以做一個遠jmp
直接彙編改成我們自己的jmp
改後結果如下
單步執行發現hook成功。但程式崩潰。原因主要是由于
我們破壞了真正的MessageBox使們想要調用真正的MessageBox時也會調用失敗了,是以我們要調用真正的MessageBox時要加上頭部被我們換掉的部分,我們要内聯彙編,裡面不能含有編譯器自動添加的代碼,是以在myMessageBox頭部要加上 _declspec(naked)
vs2010的debug版本每執行一個函數都要 cmp esi,esp 來驗證堆棧的。是以還要加一句push esi 和pop esi
下面說一下用代碼來寫MessageBoxA着呢5個位元組
先聲明一個JMP結構體。注意前面加 #pragma pack(1)來避免記憶體對齊的一些規則
接下來寫hook函數
現在測試成功。
完整源代碼如下: