基於C++的Hook 暴力實現!攔截系統api,絕對給100分!

 

 

 

1、HOOK介紹(鉤子,掛鉤)

是一種實現Windows平臺下類似於中斷的機制。HOOK機制允許應用程序攔截並處理Windows消息或指定事件,當指定的消息發出後,HOOK程序就可以在消息到達目標窗口之前將其捕獲,從而得到對消息的控制權,進而可以對該消息進行處理或修改,加入我們所需的功能。如果你正在學習C/C++,加羣:825414254獲取資料與聽課權限

 

 

 

鉤子按使用範圍分,可分爲線程鉤子和系統鉤子,其中,系統鉤子具有相當大的功能,幾乎可以實現對所有Windows消息的攔截、處理和監控。這項技術涉及到兩個重要的API:

一個是SetWindowsHookEx,安裝鉤子。

另一個是UnHookWindowsHookEx,卸載鉤子。

本文介紹的HOOK API技術,是指截獲系統或進程對某個API函數的調用,使得API的執行流程轉向我們指定的代碼段,從而實現我們所需的功能。

Windows下的每個進程均擁有自己的地址空間,並且進程只能調用其地址空間內的函數,因此HOOK API尤爲關鍵的一步是,設法將自己的代碼段注入到目標進程中,才能進一步實現對該進程調用的API進行攔截。

然而微軟並沒有提供HOOK API的調用接口,這就需要開發者自己編程實現,大家所熟知的防毒軟件、防火牆軟件等均採用HOOK API實現。

2、常用的HOOK類型

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子程,這些事件包括:

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

完成系統指令;

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

設置輸入焦點事件;

同步系統消息隊列事件。

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 和 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鍾情況:

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

當Taskbar需要重畫某個按鈕;

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

當目前的鍵盤佈局狀態改變;

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

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

以上是13種常用的hook類型!

3、鉤子部分的實現

鉤子安裝函數

 

 

 

 

其中:

對消息WH_MOUSE_LL進行了鉤取。

當捕捉到該消息時,交由LowLevelMouseProc函數進行操作。

g_hInstance是返回自身句柄的函數

鉤子處理函數

 

 

 

 

鉤子處理函數向g_hWnd句柄發送WM_HOOKMSG消息。

然後將上述函數打包成DLL文件。

4、調用鉤子的實現

導入DLL並安裝消息鉤子

 

 

 

5、實現效果

在沒有使用鉤子情況下,不會對鼠標消息進行捕捉。

當點擊啓動鼠標HOOK後,會隨着鼠標進行移動,並捕獲鼠標消息。


6、小結

本次HOOK選擇的目標是自己,下一節將會介紹如何HOOK其他進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章