HOOK API入門篇 一

2021-06-16 07:51:50 字數 2169 閱讀 2024

windows系統是建立在事件驅動的機制上的,說穿了就是整個系統都是通過訊息的傳遞來實現的。而鉤子是windows系統中非常重要的系統介面,用它可以截獲並處理送給其他應用程式的訊息,來完成普通應用程式難以實現的功能。鉤子可以監視系統或程序中的各種事件訊息,截獲發往目標視窗的訊息並進行處理。這樣,我們就可以在系統中安裝自定義的鉤子,監視系統中特定事件的發生,完成特定的功能,比如截獲鍵盤、滑鼠的輸入,螢幕取詞,日誌監視等等。可見,利用鉤子可以實現許多特殊而有用的功能。因此,對於高階程式設計人員來說,掌握鉤子的程式設計方法是很有必要的。

鉤子的型別

一. 按事件分類,有如下的幾種常用型別

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

(2) 滑鼠鉤子和低階滑鼠鉤子可以監視各種滑鼠訊息。

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

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

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

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

下面描述常用的hook型別:

1、wh_callwndproc和wh_callwndprocret hooks

wh_callwndproc和wh_callwndprocret hooks使你可以監視傳送到視窗過程的訊息。系統在訊息傳送到接收視窗過程之前呼叫wh_callwndproc hook子程,並且在視窗過程處理完訊息之後呼叫wh_callwndpro

cret hook子程。wh_callwndprocret hook傳遞指標到cwpretstruct結構,再傳遞到hook子程。cwpretstruct結構包含了來自處理訊息的視窗過程的返回值,同樣也包括了與這個訊息關聯的訊息引數。

2、wh_cbt hook

在以下事件之前,系統都會呼叫wh_cbt hook子程,這些事件包括:

1. 啟用,建立,銷毀,最小化,最大化,移動,改變尺寸等視窗事件;

2. 完成系統指令;

3. 來自系統訊息佇列中的移動滑鼠,鍵盤事件;

4. 設定輸入焦點事件;

5. 同步系統訊息佇列事件。

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,它們不會被注射到任何行程位址空間。

Python入門篇(一)

對了,入門篇都是python3.6的,其實只要有其它物件導向的經驗,看一遍就ok了,如果沒有基礎的朋友,可就得多寫幾遍嘍,理解物件的用法,未完待續 一 概念 類 用來描述具有 相同屬性和方法的物件的集合 二 命名方式 1 類名大駝峰 2 方法名小駝峰 3 嚴格區分大小寫 三 類的定義 class c...

Canvas入門篇(一)

html5的核心功能canvas 一 使用canvas畫圖的前提是先在html5網頁中使用canvas定義乙個 畫布 瀏覽器不支援canvas提示語id為canvas標識id,canvas畫布寬度高度,單位px 二 在js中呼叫canvas api,在定義的畫布中繪畫要先用js獲取canvas物件 ...

一 Ansible入門篇

ansible是乙個自動化運維的工具 基於python語言編寫,因此機器需要具備python環境。通過ssh的連線方式進行自動化部署,ansible優先使用openssh,在使用python模組裡的paramiko作為ssh工具 優點 1.入門快速,簡單上手 2.基於python語言 3.無 基於s...