鉤子技術介紹及函式使用

2021-04-16 07:55:06 字數 2489 閱讀 6454

當你建立乙個鉤子時,windows系統會建立乙個資料結構,該結構包含了您建立的鉤子的資訊,安裝鉤子則是把該結構體插入到系統鉤子列表中去,注意:新插入的放置到舊的前面。當指定的鉤子事件被觸發後,區域性鉤子只需要呼叫程序中的鉤子函式來預處理事件,全域性鉤子則需要把處理插入到其他位址空間,要做到這一點,就需要有乙個動態連線庫,把鉤子函式放到庫中。但有兩個是例外,就是日誌鉤子和日誌回放鉤子,它是一種比較特殊的鉤子,它可以掛載到系統範圍內的任何程序中,而且不需要另外編寫乙個dll來對映到其他程序的記憶體空間之中(關於日誌鉤子,以後有機會再詳細介紹)。

一、鉤子的分類:

安裝不同的鉤子,可以截獲監視不同的訊息型別,有針對的對所需要的訊息進行過濾和處理,鉤子主要分以下幾類:

wh_callwndproc     傳送到視窗的訊息。由sendmessage觸發

wh_callwndprocret  傳送到視窗的訊息。由sendmessage處理完成返回時觸發

wh_getmessage    傳送到視窗的訊息。getmessage或peekmessage觸發

wh_keybroad    鍵盤鉤子,鍵盤觸發訊息。wm_keyup或wm_keydown訊息

wh_keybroad_ll       地層鍵盤鉤子

wh_mouse                       滑鼠鉤子,查詢滑鼠事件訊息

wh_mouse_ll                低層鍵盤鉤子

wh_hardware             非滑鼠、鍵盤訊息時

wh_msgfilter               對話方塊、選單或滾動條要處理乙個訊息時。該鉤子是區域性的。

wh_sy**sgfilter          同wh_msgfilter一樣,系統範圍的。

wh_debug                          除錯鉤子,用來給鉤子函式除錯

wh_journalrecord     監視和記錄輸入事件

wh_journalplayback       回放用wh_journalrecord記錄事件

wh_shell                    外殼鉤子,當關於windows外殼事件發生時觸發. wh_cbt                        當基於計算機的訓練(cbt)事件發生時

wh_foregroundidle    前台應用程式執行緒變成空閒時候,鉤子啟用。

二、鉤子的型別:

全域性鉤子:全域性鉤子可以掛鉤其他程序的事件,有兩種:基於執行緒的,它將捕獲其它程序中某一特定執行緒的事件。簡言之,就是可以用來觀察其它程序中的某一特定執行緒將發生的事件。2,系統範圍的,將捕捉系統中所有程序將發生的事件訊息。

區域性鉤子:僅鉤掛您自己程序的事件。

三、安裝鉤子:

setwindowshookex

函式原形:hhook setwindowshookex(

int   idhook,     // 鉤子型別,見[一]

hookproc? lpfn,    // 鉤子函式位址

instance  hmod,    // 鉤子所在的例項的控制代碼,

dword???? dwthreadid // 鉤子所監視的執行緒的執行緒號

) hmod: 對於線程式鉤子,引數傳null;對於系統鉤子:引數為鉤子dll的控制代碼

dwthreadid:對於全域性鉤子,該引數為null。

返回:成功:返回setwindowshookex返回所安裝的鉤子控制代碼;

失敗:null;

四、解除安裝鉤子:

unhookwindowshookex

函式原形:bool unhookwindowshookex(

hhook  hhk    // 要解除安裝的鉤子控制代碼。

)五、鉤子函式:

myhookproc

鉤子函式是**函式。當安裝的鉤子被鉤到指定的事件訊息後,系統會自動呼叫鉤子函式進行處理。

定義如下:

lresult winapi myhookproc(

int    ncode ,    // 指定是否需要處理該訊息

wparam wparam,    // 包含該訊息的附加訊息

lparam  lparam    // 包含該訊息的附加訊息

) 六、呼叫下乙個鉤子

callnexthookex

既然windows的鉤子結構都儲存在乙個鍊錶裡邊,很明顯,訊息將會被乙個個往下傳遞,最後到達目標視窗,所以,我們處理了以後,由責任將訊息傳遞給下乙個鉤子。當然你也可以不,但我還是建議您繼續傳遞下去。

函式定義如下:

lresult callnexthookex(

hhook   hhk,   // 是您自己的鉤子函式的控制代碼。用該控制代碼可以遍歷鉤子鏈

int    ncode,  // 把傳入的引數簡單傳給callnexthookex即可

wparam  wparam,   // 把傳入的引數簡單傳給callnexthookex即可

lparam  lparam   // 把傳入的引數簡單傳給callnexthookex即可

)

鉤子技術介紹及函式使用

當你建立乙個鉤子時,windows系統會建立乙個資料結構,該結構包含了您建立的鉤子的資訊,安裝鉤子則是把該結構體插入到系統鉤子列表中去,注意 新插入的放置到舊的前面。當指定的鉤子事件被觸發後,區域性鉤子只需要呼叫程序中的鉤子函式來預處理事件,全域性鉤子則需要把處理插入到其他位址空間,要做到這一點,就...

鉤子技術介紹及函式使用

當你建立乙個鉤子時,windows系統會建立乙個資料結構,該結構包含了您建立的鉤子的資訊,安裝鉤子則是把該結構體插入到系統鉤子列表中去,注意 新插入的放置到舊的前面。當指定的鉤子事件被觸發後,區域性鉤子只需要呼叫程序中的鉤子函式來預處理事件,全域性鉤子則需要把處理插入到其他位址空間,要做到這一點,就...

鉤子技術介紹及函式使用

當你建立乙個鉤子時,windows系統會建立乙個資料結構,該結構包含了您建立的鉤子的資訊,安裝鉤子則是把該結構體插入到系統鉤子列表中去,注意 新插入的放置到舊的前面。當指定的鉤子事件被觸發後,區域性鉤子只需要呼叫程序中的鉤子函式來預處理事件,全域性鉤子則需要把處理插入到其他位址空間,要做到這一點,就...