WINDOWS下的各類HOOK

whatday發表於2013-07-29
1、HOOK SERVICE TABLE:HOOK SSDT
這種方法對於攔截 NATIVE API 來說用的比較多。
SSDT hook,一句話——Windows把需要呼叫的核心API地址全都存在了
一個表中(System Service Dispatch Table),要想hook一個核心API,比較簡單的辦法就是把
該核心API在表(SSDT)中儲存的地址修改為自己撰寫的函式地址。


2、HOOK INT 2E 方法:IDT HOOK
IDT是中斷描述表,可以替換其中的中斷處理程式。
這種方法對於跟蹤、分析系統呼叫來說用的比較多。原理是通過替換 IDT
表中的 INT 2E 中斷,使之指向我們自己的中斷服務處理例程來實現的。掌握
此方法需要你對保護模式有一定的基礎。


3、 HOOK PE 方法:EAT HOOK
這種方法對於攔截、分析其他核心驅動的函式呼叫來說用的比較多。原理
是根據替換 PE 格式匯出表中的相應函式來實現的。
EAT是可執行檔案的匯出表,記錄DLL中可供其他程式使用的函式,可執行檔案裝載時會使用相應DLL的EAT表來初始化IAT表,通過替換EAT表中的函式地址,就可以使依賴於本DLL的程式得到一個假的地址。


4.IAT HOOK (ring3 用)
IAT是可執行檔案的匯入表,記錄可執行檔案使用的其它DLL中的函式,通過替換IAT表中的函式地址,可以hook相應DLL中的函式呼叫。


5、Inline Hook方法 (ring 0和ring3 都可以用)
Inline hook的工作流程:
1)驗證核心API的版本(特徵碼匹配)。
2)撰寫自己的函式,要完成以上三項任務。
2)獲取自己函式的地址,覆蓋核心API記憶體,供跳轉。
Inline Hook的缺點:
1) 不夠通用。各個windows版本中,核心API的開始一段不盡相同,要想通吃,就要多寫幾個版
本或者做一個特徵碼搜尋(因為有的核心API在各個版本中非常相似,只是在“特徵碼”之前或之後加一點東西)。
2) 已被一些檢測工具列入檢測範圍,如果直接從核心API第一個位元組開始覆蓋,那麼很容易被檢測,如果把覆蓋範圍往後推,並加以變形,也許能抵擋一氣。具體情況,我才疏學淺,尚未試驗


6.SYSENTRY hook
為了效能的考慮,xp後的系統都改用sysentry命令來進入ring0,去呼叫SSDT中的服務,不再是通過IDT中的 int 2E。這也使得我們hook也變得相對容易了。
首先獲得sysentry的地址,然後改之,不用再考慮IDT了


7)IRP hook
IRP是 I/O request packets,驅動程式中有一系列分發例程來處理請求,這些例程儲存在驅動裝置物件的資料結構中的一個表中,也很容易替換。


相關文章