日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

钩子程序

發布時間:2024/8/1 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 钩子程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鉤子程序

鉤子(Hook),是Windows消息處理機制的一個平臺,應用程序可以在上面設置子程序以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達后,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。

中文名

鉤子程序

外文名

Hook

類????型

處理消息的程序段

平????臺

Windows消息處理機制的一個平臺

基本概念

鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

鉤子也可以理解為WINDOWS留給我們的后門,比如你想控制鍵盤,在DOS時代很簡單通過INT即可,而WINDOWS時代不允許我們直接操作硬件;由于WINDOWS是消息驅動,所以我們可以攔截鍵盤消息以達到控制鍵盤的目的。控制自己進程的消息固然很簡單,但是要控制所有進程消息就要利用鉤子了。將鉤子函數放在DLL中,所有的有關鍵盤的消息都必須經過鉤子函數過濾,這樣你就可以為所欲為了。

WINDOWS下的鉤子程序就像DOS下的TSR(內存駐留程序)一樣,用來截獲WINDOWS下的

運行機制

每一個Hook(鉤子)都有一個與之相關聯的指針列表,稱之為鉤子鏈表,由系統來維護。這個列表的指針指向指定的,應用程序定義的,被Hook子程調用的回調函數,也就是該鉤子的各個處理子程。當與指定的Hook類型關聯的消息發生時,系統就把這個消息傳遞到Hook子程。 一些Hook子程可以只監視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始, 而最早安裝的鉤子放在最后,也就是后加入的先獲得控制權

Windows 并不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其占用的內存,并更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結束了,那么系統會自動為它做卸載鉤子的操作。

分類

按事件分類

有如下的幾種常用類型

(1)鍵盤鉤子和低級鍵盤鉤子可以監視各種鍵盤消息。

(2) 鼠標鉤子和低級鼠標鉤子可以監視各種鼠標消息。

(3) 外殼鉤子可以監視各種Shell事件消息。比如啟動和關閉應用程序。

(4)日志鉤子可以記錄從系統消息隊列中取出的各種事件消息。

(5) 窗口過程鉤子監視所有從系統消息隊列發往目標窗口的消息。

此外,還有一些特定事件的鉤子提供給我們使用,不一一列舉。

按使用范圍分類

主要有線程鉤子和系統鉤子

(1) 線程鉤子監視指定線程的事件消息。

(2)系統鉤子監視系統中的所有線程的事件消息。因為系統鉤子會影響系統中所有的應用程序,所以鉤子函數必須放在獨立的動態鏈接庫(DLL)中。這是系統鉤子和線程鉤子很大的不同之處。

幾點需要說明的地方:

(1) 如果對于同一事件(如鼠標消息)既安裝了線程鉤子又安裝了系統鉤子,那么系統會自動先調用線程鉤子,然后調用系統鉤子。

(2) 對同一事件消息可安裝多個鉤子處理過程,這些鉤子處理過程形成了鉤子鏈。當前鉤子處理結束后應把鉤子信息傳遞給下一個鉤子函數。而且最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最后,也就是后加入的先獲得控制權。

(3) 鉤子特別是系統鉤子會消耗消息處理時間,降低系統性能。只有在必要的時候才安裝鉤子,在使用完畢后要及時卸載。

常用類型

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結構包含了來自處理消息的窗口過程的返回值,同樣也包括了與這個消息關聯的消息參數。

WH_CBT Hook

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

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

2. 完成系統指令;

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

4. 設置輸入焦點事件;

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

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

WH_DEBUG Hook

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

WH_FOREGROUNDIDLE Hook

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

WH_GETMESSAGE Hook

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

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做的)

WH_JOURNALRECORD Hook

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

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

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

WH_KEYBOARD Hook

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

WH_KEYBOARD_LL Hook

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

WH_MOUSE Hook

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

WH_MOUSE_LL Hook

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

WH_MSGFILTER / hooks

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。通過使用這個函數,應用程序能夠在模式循環期間使用相同的代碼去過濾消息,如同在主消息循環里一樣。

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注冊它自己。

總結

以上是生活随笔為你收集整理的钩子程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。