在何時替換IAT表呢?
如果這個主進程是我們自己的,那么這就不是一個問題,我們直接在進程的代碼中替換IAT表就好了。但如果這個主進程是另一個應用程序或者所有的所用程序呢?Windows的SetHook機制給我解決了這個問題。
為了說明SetHook的方法,我引用別人的一段文字:
運行機制
1、鉤子鏈表和鉤子子程:
每一個Hook都有一個與之相關聯(lián)的指針列表,稱之為鉤子鏈表,由系統(tǒng)來維護。這個列表的指針指向指定的,應用程序定義的,被Hook子程調(diào)用的回調(diào)函數(shù),也就是該鉤子的各個處理子程。當與指定的Hook類型關聯(lián)的消息發(fā)生時,系統(tǒng)就把這個消息傳遞到Hook子程。一些Hook子程可以只監(jiān)視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最后,也就是后加入的先獲得控制權。
Windows 并不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其占用的內(nèi)存,并更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結束了,那么系統(tǒng)會自動為它做卸載鉤子的操作。
鉤子子程是一個應用程序定義的回調(diào)函數(shù)(CALLBACK Function),不能定義成某個類的成員函數(shù),只能定義為普通的C函數(shù)。用以監(jiān)視系統(tǒng)或某一特定類型的事件,這些事件可以是與某一特定線程關聯(lián)的,也可以是系統(tǒng)中所有線程的事件。
鉤子子程必須按照以下的語法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc是應用程序定義的名字。
相關推薦:C++考試輔導:內(nèi)存分配的五種方法的區(qū)別北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |