作者 | 榴蓮
編輯 | 楌橪
IAT(Import Address Table) HOOK與我們以往學習過的HOOK有著較大的區別。無論是InlineHook還是HotFixHook,都是基於指令的修改,劫持流程來實現HOOK的。而IATHOOK則是採取另一種劫持思路。這裡就不得不提到一個Windows系統的檔案格式,PE(Portable Executable)檔案格式。
在我們編寫一個Windows程式的時候,通常需要呼叫許多系統或第三方的函式。而需要呼叫這些函式,就必須要載入匯出這些函式的動態連結庫。對於動態連結庫來說,這些函式是匯出函式。而對於呼叫者,也就是我們而言,這些函式就是匯入函式。而匯入函式的相關資訊就儲存在PE檔案格式的資料目錄表中的匯入表中。匯入表內有三個表,分別是序號,地址以及函式名,進行分別儲存。當呼叫者呼叫一個函式的時候,就會去匯入表中尋找對應函式名的函式地址。那麼我們在這個位置就可以做一些事情了。只要將匯入地址表(Import Address Table)中我們想要HOOK的函式的地址,替換成我們自己的函式的地址。那麼當呼叫者再次呼叫函式的時候,因為地址被我們替換。被呼叫的將是我們提供的HOOK函式,而不是原來的函式。
那麼以MessageBoxA為例,我們實際上來體驗一下IATHOOK的實現方式。
首先,我們需要一個目標程式,程式碼如下:
然後我們來看一下HOOK後的效果:
正常情況下:
HOOK後:
接下來,我們將使用程式碼實現IAT Hook,我這裡採用的作業系統是Windows 10 20H2(19042.1288),整合開發環境採用的是Visual Studio 2017。
閱讀全文
公眾號:極安御信安全研究院(即可獲得文章全部內容)