最簡單的Windows Hook(鉤子)介紹

2021-04-08 20:45:16 字數 1691 閱讀 6632

hook是windows作業系統的訊息傳遞機制的重要組成部分。通過使用hook,程式可以監視系統中其他程序的訊息傳遞,並在該訊息到達目的前對其進行處理。

注意,由於hook可能訪問其他程序的位址空間,故必要時應通過dll實現。並且,全域性hook會降低系統的效能,應該盡量避免使用。

windows為不同型別的訊息提供了不同型別的hook,並分別維護乙個hook鍊錶。新建立的hook將被放到鏈首,首先獲得訊息,並對其進行處理。但要注意,hook不會自動將接收到的訊息傳遞給鍊錶上的下一hook,需要在**中顯式宣告。

下面看看hook的一般使用順序:

1、使用setwindowshookex在特定hook鏈首新增乙個新hook。

2、相應訊息傳遞到setwindowshookex說明的函式,並由其進行處理。該函式的原型必須為:

lresult callback hookproc;

3、在hookproc處理訊息後,可以選擇使用callnexthookex將該訊息傳遞給鍊錶中的下乙個節點進行處理。

4、在完成hook的使用後,用函式unhookwindowshookex將其撤銷。

現在來看看windows支援的幾種常用的hook型別。

wh_callwndproc:捕獲傳遞給視窗的訊息。

wh_cbt:視窗建立、銷毀、啟用、最大最小化、移動、縮放,系統呼叫,滑鼠、鍵盤事件等,幾乎包括了所有的基本操作。

wh_getmessage:捕獲使用getmessage或peekmessage傳遞的訊息。

wh_keyboard:捕獲getmessage或peekmessage傳遞的wm_keydown或wm_keyup訊息。

wh_mouse:捕獲getmessage或peekmessage傳遞的滑鼠相關訊息。

wh_msgfilter和wh_sy**sgfilter:捕獲應該由windows標準控制項處理的區域性和全域性訊息。

hook的基本情況就介紹到這裡。最後,我再給出一段hook的**,用於監控鍵盤訊息(**用c++編寫,在windows xp sp2下除錯通過)。

// dll

#include

#include

#ifdef  __cplusplus

#define  export extern "c" __declspec (dllexport)

#else

#define  export __declspec (dllexport)

#endif

hhook hhook;

hinstance hinst;

export lresult __stdcall keyboardproc(int ncode, wparam wparam, lparam lparam);

export void __stdcall inithook();

int winapi dllmain(hinstance hinstance, dword fdwreason, pvoid pvreserved)

export void __stdcall freehook()

export void __stdcall inithook()

export lresult __stdcall keyboardproc(int ncode, wparam wparam, lparam lparam)

這樣,只需要再編寫一段程式,呼叫這個dll庫里的初始化函式,並在呼叫結束後釋放hook就可以了。 

最簡單的加密

最簡單的加密 package com.util 類 介面的目的 作用 功能 繼承於何種父類,實現的介面 實現的演算法 使用方法 示例程式.version v1.0 2012 3 22 author xiahui public class encrypt system.out.print 加密 s n...

最簡單的makefile

hello.c的內容如下 include int main makefile 的內容如下 hello.exe hello.o gcc o hello.exe hello.o hello.o hello.c gcc c hello.c clean rm hello.o hello.exe window...

最簡單的幸福

最簡單的幸福 簡單樸實的生活中傾以淡然的喜怒哀樂便是爸媽的愛情,因為不懂什麼是愛情,所以從來都不知道要怎樣相信愛情,對於爸媽的愛情,我想我更多是把它理所應當的定義為親情,世間最為割捨不下的牽絆。爸媽的青春不是恣意飛揚的青春,沒有絢麗的色彩,沒有張揚的叛逆。url 公升降機 url 今天的我問起老媽當...