API鉤子(IAT修改方式)

    在Windows下,主要有兩種方式來對系統API調用的攔截,一種是修改PE文件的IAT導入表,使API地址重定向;另一種方式就是把在API函數開始地址的機器碼改成jmp的指令的機器碼,來實現函數的跳轉。
 
一、原理
 
PE結構的模塊(exe/dll/...),有一個IAT表,保存着該模塊使用到的API函數的地址,在默認的隱式API調用時,會先跳轉到該IAT表中查找API的具體的函數地址,在跳轉到具體的地址執行該API。所以,基於這個原理,我們可以使用修改IAT方式和機器碼覆蓋的方式來實現攔截。
 
二、兩種方式的比較
修改IAT表方式:實現比較簡單,直觀,且對跨平臺支持較好;但是需要對PE的結構及Windows Loader的工作過程比較瞭解,同時對於顯示調用API的方式(LoadLibrary+GetProcess)則跳過了IAT表的定位而直接調用了API,便無法攔截到。
機器碼覆蓋方式:因爲是直接修改函數首指令,只要調用這個函數,沒有鉤不到的問題,無論調用方是怎麼調用的,但是因爲不同的平臺,有不同的機器碼,所以跨平臺支持不好,且實現起來複雜(需要使用匯編,可參考微軟的Detours)。
 
三、IAT修改方式的Demo
    見附件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章