SetWindowsHookEx 函式,暫時沒有深入研究
阿新 • • 發佈:2018-11-09
SetWindowsHookEx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
在鉤子連結串列中安裝一個應用程式定義的鉤子函式,以監控系統中特定型別的事件的發生。這些事件或者是與某一個執行緒繫結的,或者是與呼叫執行緒所在的視窗中的所有執行緒繫結的。
HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook,
_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD dwThreadId
);
idHook
int型別,將要安裝的鉤子的型別。如CBT 鉤子,視窗訊息鉤子,DEBUG 鉤子等。
lpfn
HOOKPROC 型別,hook 函式的指標,如果dwThreadId引數為0,或者指定了一個其它程序的執行緒,lpfn 引數指定的函式的地址必須在一個DLL中。否則,lpfn 可以指向一個自己模組中的函式。
hMod
包含上面的hook 函式的模組的基地址。如果dwThreadId 指定了以執行緒,且該執行緒是自己建立的,或者lpfn 函式是當前模組實現的,hMod 必須為NULL。
dwThreadId
這個hook 函式將被繫結的執行緒的ID。對於桌面應用來說,如果這個引數為NULL,hook 函式將與呼叫執行緒繫結的桌面中的所有的執行緒繫結。
返回值HHOOK
如果函式成功,返回的是鉤子的控制代碼,否則,返回NULL。
- 注意
SetWindowsHookEx 可以用來注入DLL,僅限於32-bit 程式呼叫 SetWindowsHookEx 注入32-bit DLL 到 32-bit 程序,或者64-bit 程式呼叫 SetWindowsHookEx 注入64-bit DLL 到 64-bit 程序。
因為鉤子執行在一個應用程式的上下文中,因此必須符合一個應用程式的“位數”。如果一個32-bit 的應用程式在64-bit Windows 上安裝了一個全域性鉤子。32-bit 鉤子被安裝到每一個32-bit 程序中。在64-bit 程序中,執行緒也被標記為“被鉤”。因為32-bit 應用程式必須執行這個鉤子的程式碼,系統在呼叫SetWindowsHookEx 函式的執行緒的上下文中執行鉤子。這意味著32-bit 的應用程式必須持續的抽取訊息,負責可能阻礙64-bit 的應用程式正常執行。
如果一個64-bit 的應用程式在64-bit 系統上安裝一個全域性鉤子,鉤子被注入到所有的64-bit 程序中。所有的32-bit 程序使用一個回撥函式來鉤應用程式。
如果想在64-bit 的windows 上hook 所有的訊息,需要分別構建32-bit 應用程式以及鉤子、64-bit 應用程式以及鉤子並全部安裝。並且要保證兩個應用程式持續的抽取訊息以保證所有程式正確執行。
呼叫CallNextHookEx 函式來呼叫鉤子連結串列中的下一個鉤子是一種責任,否則其它的應用程式的執行可能會被影響。
在應用程式退出之前,一定要呼叫UnhookWindowsHookEx 函式來解除安裝鉤子並釋放系統為了使用這個鉤子而構建的系統資源。
鉤子的範圍與鉤子的型別相關,可以參見具體的鉤子的型別。
對於一個鉤子來說,首先執行的是執行緒鉤子,之後才是全域性鉤子。需要注意的是,WH_MOUSE,WH_KEYBOARD,WM_JOURNAL*,WH_SHELL,和低等級的鉤子是在安裝鉤子的執行緒的上下文中執行的,而不是通常的處理鉤子的上下文中執行(或者說其它被hook 的程序的上下文)。對於這些鉤子來說,如果一個32-bit 鉤子在64-bit 鉤子之前的話,32-bit 鉤子和64-bit 鉤子是可能同時執行的。
下面將介紹一個HOOK研究的例項程式碼
https://warroom.securestate.com/dll-injection-part-1-setwindowshookex/
SetWindowsHookEx 的缺陷:只能hook GUI 程序,不能Hook 更高完整性級別的程序。等等吧,理解了就好