[C#菜鳥]C# Hook (二) 常用鈎子的類型


 

public const int WH_JOURNALRECORD = 0;      //監視和記錄輸入事件。安裝一個掛鈎處理過程,對寄送至系統消息隊列的輸入消息進行紀錄
public const int WH_JOURNALPLAYBACK = 1;    //回放用WH_JOURNALRECORD記錄事件
public const int WH_KEYBOARD = 2;           //鍵盤鈎子,鍵盤觸發消息。WM_KEYUP或WM_KEYDOWN消息
public const int WH_GETMESSAGE = 3;         //發送到窗口的消息。GetMessage或PeekMessage觸發
public const int WH_CALLWNDPROC = 4;        //發送到窗口的消息。由SendMessage觸發
public const int WH_CBT = 5;                //當基於計算機的訓練(CBT)事件發生時 
public const int WH_SYSMSGFILTER = 6;       //同WH_MSGFILTER一樣,系統范圍的。 
public const int WH_MOUSE = 7;              //鼠標鈎子,查詢鼠標事件消息
public const int WH_HARDWARE = 8;           //非鼠標、鍵盤消息時
public const int WH_DEBUG = 9;              //調試鈎子,用來給鈎子函數除錯
public const int WH_SHELL = 10;             //外殼鈎子,當關於WINDOWS外殼事件發生時觸發. 
public const int WH_FOREGROUNDIDLE = 11;    //前台應用程序線程變成空閑時候,鈎子激活。
public const int WH_CALLWNDPROCRET = 12;    //發送到窗口的消息。由SendMessage處理完成返回時觸發
public const int WH_KEYBOARD_LL = 13;       //此掛鈎只能在Windows NT中被安裝,用來對底層的鍵盤輸入事件進行監視
public const int WH_MOUSE_LL = 14;          //此掛鈎只能在Windows NT中被安裝,用來對底層的鼠標輸入事件進行監視

 

 

1、WH_CALLWNDPROC

  1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks

  WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以監視發送到窗口過程的消息。系統在消息發送到接收窗口過程之前調用WH_CALLWNDPROC Hook子程,並且在窗口過程處理完消息之后調用WH_CALLWNDPROCRET Hook子程。

  WH_CALLWNDPROCRET Hook傳遞指針到CWPRETSTRUCT結構,再傳遞到Hook子程。CWPRETSTRUCT結構包含了來自處理消息的窗口過程的返回值,同樣也包括了與這個消息關聯的消息參數。

2、WH_CBT Hook

  在以下事件之前,系統都會調用WH_CBT Hook子程,這些事件包括:

  1. 激活,建立,銷毀,最小化,最大化,移動,改變尺寸等窗口事件;

  2. 完成系統指令;

  3. 來自系統消息隊列中的移動鼠標,鍵盤事件;

  4. 設置輸入焦點事件;

  5. 同步系統消息隊列事件。

  Hook子程的返回值確定系統是否允許或者防止這些操作中的一個。

3、WH_DEBUG Hook

  在系統調用系統中與其他Hook關聯的Hook子程之前,系統會調用WH_DEBUG Hook子程。你可以使用這個Hook來決定是否允許系統調用與其他Hook關聯的Hook子程。

4、WH_FOREGROUNDIDLE Hook

  當應用程序的前台線程處於空閑狀態時,可以使用WH_FOREGROUNDIDLE Hook執行低優先級的任務。當應用程序的前台線程大概要變成空閑狀態時,系統就會調用WH_FOREGROUNDIDLE Hook子程。

5、WH_GETMESSAGE Hook

  應用程序使用WH_GETMESSAGE Hook來監視從GetMessage or PeekMessage函數返回的消息。你可以使用WH_GETMESSAGE Hook去監視鼠標和鍵盤輸入,以及其他發送到消息隊列中的消息。

6、WH_JOURNALPLAYBACK Hook

  WH_JOURNALPLAYBACK Hook使應用程序可以插入消息到系統消息隊列。可以使用這個Hook回放通過使用WH_JOURNALRECORD Hook記錄下來的連續的鼠標和鍵盤事件。只要WH_JOURNALPLAYBACK Hook已經安裝,正常的鼠標和鍵盤事件就是無效的。

  WH_JOURNALPLAYBACK Hook是全局Hook,它不能象線程特定Hook一樣使用。 WH_JOURNALPLAYBACK Hook返回超時值,這個值告訴系統在處理來自回放Hook當前消息之前需要等待多長時間(毫秒)。這就使Hook可以控制實時事件的回放。

  WH_JOURNALPLAYBACK是system-wide local hooks,它們不會被注射到任何行程位址空間。(估計按鍵精靈是用這個hook做的)

7、WH_JOURNALRECORD Hook

  WH_JOURNALRECORD Hook用來監視和記錄輸入事件。典型的,可以使用這個Hook記錄連續的鼠標和鍵盤事件,然后通過使用WH_JOURNALPLAYBACK Hook來回放。

  WH_JOURNALRECORD Hook是全局Hook,它不能象線程特定Hook一樣使用。

  WH_JOURNALRECORD是system-wide local hooks,它們不會被注射到任何行程位址空間。

8、WH_KEYBOARD Hook

  在應用程序中,WH_KEYBOARD Hook用來監視WM_KEYDOWN and WM_KEYUP消息,這些消息通過GetMessage or PeekMessage function返回。可以使用這個Hook來監視輸入到消息隊列中的鍵盤消息。

9、WH_KEYBOARD_LL Hook

  WH_KEYBOARD_LL Hook監視輸入到線程消息隊列中的鍵盤消息。

10、WH_MOUSE Hook

  WH_MOUSE Hook監視從GetMessage 或者 PeekMessage 函數返回的鼠標消息。使用這個Hook監視輸入到消息隊列中的鼠標消息。

11、WH_MOUSE_LL Hook

  WH_MOUSE_LL Hook監視輸入到線程消息隊列中的鼠標消息。

12、WH_MSGFILTER / hooks

  12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks

  WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我們可以監視菜單,滾動條,消息框,對話框消息並且發現用戶使用ALT+TAB or ALT+ESC 組合鍵切換窗口。

  WH_MSGFILTER Hook只能監視傳遞到菜單,滾動條,消息框的消息,以及傳遞到通過安裝了Hook子程的應用程序建立的對話框的消息。

  WH_SYSMSGFILTER Hook監視所有應用程序消息。

  WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我們可以在模式循環期間過濾消息,這等價於在主消息循環中過濾消息。通過調用CallMsgFilter function可以直接的調用WH_MSGFILTER Hook。通過使用這個函數,應用程序能夠在模式循環期間使用相同的代碼去過濾消息,如同在主消息循環里一樣。

13、WH_SHELL Hook

  外殼應用程序可以使用WH_SHELL Hook去接收重要的通知。當外殼應用程序是激活的並且當頂層窗口建立或者銷毀時,系統調用WH_SHELL Hook子程。

  WH_SHELL 共有5鍾情況:

  1. 只要有個top-level、unowned 窗口被產生、起作用、或是被摧毀;

  2. 當Taskbar需要重畫某個按鈕;

  3. 當系統需要顯示關於Taskbar的一個程序的最小化形式;

  4. 當目前的鍵盤布局狀態改變;

  5. 當使用者按Ctrl+Esc去執行Task Manager(或相同級別的程序)。

  按照慣例,外殼應用程序都不接收WH_SHELL消息。所以,在應用程序能夠接收WH_SHELL消息之前,應用程序必須調用SystemParametersInfo function注冊它自己。

 

 

鈎子類型對應代碼:

WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,       
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14

 

注:

鈎子分為全局鈎子和線程鈎子,全局鈎子的運行需要依賴於dll,但是

有某些全局鈎子可以不依賴於任何DLL而正常工作的。這些鈎子包括,WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL。為什么這些鈎子可以不依賴於DLL而正常工作呢?我們可以從MSDN中得到答案,MSDN中對於這四種鈎子都這樣的描述“This hook is called in the context of the thread that installed it.”,翻譯成中文意思是鈎子函數的調用是在安裝鈎子的線程上下文中進行的,說得更明白些,意思就是這些鈎子是在哪個線程當中安裝的,其鈎子函數就在哪個線程中執行。所以使用這四種鈎子是達不到代碼注入的效果的,當然也就可以不依賴於任何DLL了

 

引用
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM