「winds平臺」IATHook&原理與實現(xiàn)(4)

作者?| 榴蓮
編輯?| 楌橪
IAT(Import Address Table) HOOK與我們以往學習過的HOOK有著較大的區(qū)別。無論是InlineHook還是HotFixHook,都是基于指令的修改,劫持流程來實現(xiàn)HOOK的。而IATHOOK則是采取另一種劫持思路。這里就不得不提到一個Windows系統(tǒng)的文件格式,PE(Portable Executable)文件格式。
在我們編寫一個Windows程序的時候,通常需要調(diào)用許多系統(tǒng)或第三方的函數(shù)。而需要調(diào)用這些函數(shù),就必須要加載導出這些函數(shù)的動態(tài)鏈接庫。對于動態(tài)鏈接庫來說,這些函數(shù)是導出函數(shù)。而對于調(diào)用者,也就是我們而言,這些函數(shù)就是導入函數(shù)。而導入函數(shù)的相關信息就存儲在PE文件格式的數(shù)據(jù)目錄表中的導入表中。導入表內(nèi)有三個表,分別是序號,地址以及函數(shù)名,進行分別存儲。當調(diào)用者調(diào)用一個函數(shù)的時候,就會去導入表中尋找對應函數(shù)名的函數(shù)地址。那么我們在這個位置就可以做一些事情了。只要將導入地址表(Import Address Table)中我們想要HOOK的函數(shù)的地址,替換成我們自己的函數(shù)的地址。那么當調(diào)用者再次調(diào)用函數(shù)的時候,因為地址被我們替換。被調(diào)用的將是我們提供的HOOK函數(shù),而不是原來的函數(shù)。

那么以MessageBoxA為例,我們實際上來體驗一下IATHOOK的實現(xiàn)方式。
首先,我們需要一個目標程序,代碼如下:

然后我們來看一下HOOK后的效果:
正常情況下:

HOOK后:

?
接下來,我們將使用代碼實現(xiàn)IAT Hook,我這里采用的操作系統(tǒng)是Windows 10 20H2(19042.1288),集成開發(fā)環(huán)境采用的是Visual Studio 2017。
閱讀全文
??公眾號:極安御信安全研究院(即可獲得文章全部內(nèi)容)