天天看點

學習windows 應用層 inline hook 原理總結

inline hook 實際上就是指 通過改變目标函數頭部的代碼來使改變後的代碼跳轉到我們自己設定的一個函數裡,産生hook。

今天就拿MessageBoxA這個api函數來做實驗。功能就是當程式調用MessageBoxA 時,我們列印出MessageBoxA的參數

大概代碼結構應該是這樣

我們先看看彙編是怎樣調用MessageBoxA的

學習windows 應用層 inline hook 原理總結

首先看到,MessageBoxA裡面

mov edi,edi

mov ebp

mov ebp,esp

剛好是5個位元組,5個位元組可以做一個遠jmp

直接彙編改成我們自己的jmp

改後結果如下

學習windows 應用層 inline hook 原理總結

單步執行發現hook成功。但程式崩潰。原因主要是由于

我們破壞了真正的MessageBox使們想要調用真正的MessageBox時也會調用失敗了,是以我們要調用真正的MessageBox時要加上頭部被我們換掉的部分,我們要内聯彙編,裡面不能含有編譯器自動添加的代碼,是以在myMessageBox頭部要加上 _declspec(naked)

vs2010的debug版本每執行一個函數都要 cmp esi,esp 來驗證堆棧的。是以還要加一句push esi 和pop esi

下面說一下用代碼來寫MessageBoxA着呢5個位元組

先聲明一個JMP結構體。注意前面加 #pragma pack(1)來避免記憶體對齊的一些規則

接下來寫hook函數

現在測試成功。

學習windows 應用層 inline hook 原理總結

完整源代碼如下:

繼續閱讀