Hook入門之滑鼠鉤子

2021-08-17 11:11:39 字數 2647 閱讀 8896

之前有一次吃飯的時候,聽前輩聊到猜想某某輸入法的鉤子,導致了我們軟體crash了,問使用者是不是用的某某輸入法。當時就比較好奇鉤子是啥。

22章《

dll注入和

api攔截》。參考網上獲得的滑鼠鉤子的源**,解析和學習一下做乙個簡單的滑鼠鉤子的流程和步驟,以及涉及到的知識。

(1)首先,新建dll模組,在

dll中宣告幾個全域性變數,並且放入共享的資料段中,如下

:

//

// 共享**段,所有執行緒共享

//#pragma data_seg("shared")

static hhook hhkmouse = null; // 滑鼠鉤子控制代碼

static hinstance g_hinstance = null; // 本dll的例項控制代碼

static hwnd g_hwnd = null; // 呼叫dll的主視窗控制代碼,這樣就可以sendmessage給主視窗滑鼠訊息及其引數

#pragma data_seg()

#pragma comment(linker,"/section:shared,rws")

延伸問題一: 那幾個變數為什麼要放入共享段呢?放進去共享段的實際意義是啥呢?

首先,通過我個人的測試而言,這幾個變數作為dll中的全域性變數也是不影響使用的。1,

#pragma data_seg()

一般用於

dll中。也就是說,在

dll中定義乙個共享的,有名字的資料段。

最關鍵的是:

這個資料段中的全域性變數可以被

多個程序共享

。否則多個程序之間無法共享

dll中的全域性變數。2,

共享資料必須初始化,否則微軟編譯器會把沒有初始化的資料放到

.bss

段中,從而導致多個程序之間的共

享行為失敗。

3. 字母rws表示段具有讀、寫和共享屬性

在dll中定義低階滑鼠處理函式,就是預先處理對應訊息的「攔截函式」,如下

:

//

// 定義低階滑鼠鉤子函式

//lresult callback lowlevelmouseproc(

int ncode, // hook code

wparam wparam, // message identifier

lparam lparam // mouse coordinates

)return callnexthookex(hhkmouse,ncode,wparam,lparam);

}

延伸問題二: 什麼叫低階?那高階是怎麼樣的?

在dll中,定義安裝鉤子函式和解除安裝鉤子函式

:

//

// 安裝低階滑鼠子函式,從而截獲系統所有的滑鼠訊息

//bool winapi starthookmouse(hwnd hwnd)

else }

//// 解除安裝低階滑鼠鉤子

//void winapi stophookmouse()

}

延伸問題三: 為什麼我們安裝鉤子要在

dll的函式

中進行呢,可不可以在主程式中安裝鉤子

(雖然dll

起碼可以把「攔截函式」封裝起來

)全域性鉤子必須安裝在dll中,區域性的鉤子可以寫在主程式中。訊息佇列是以執行緒為基礎的.乙個區域性hook勾掛的是乙個程序內所有執行緒的訊息。

此類實現由於不涉及程序context切換,是輕量級的hook。全域性的hook會對映到所有載入user32.dll的程序中,其實是user32.dll為這些程序呼叫loadlibrary來載入hook所在的dll,

並且在所有的訊息在被送到訊息處理前先呼叫hookproc。

全域性的鉤子對系統所有程序有效,當某個程序觸發鉤子事件時,就會從鉤子鏈中依次執行對應的鉤子函式,如果鉤子鏈中某個全域性鉤子沒有出現在程序空間,就會載入對應的鉤子dll(loadlibrary)。這個全域性鉤子的dll是會被所有能鉤觸發程序給載入的,如果是exe,顯然不能實現

接下來注意的乙個問題,我們使用的是def檔案,它用來定義

dll中匯出的函式,比如,

def檔案中定義匯出的函式

:

; hookdll.def : 宣告 dll 的模組引數。

library "mousehook"

exports

; 此處可以是顯式匯出

starthookmouse

stophookmouse

(2)

mfc中的小視窗實現主程式,與

hook

的技術無關,只要實現按鈕和訊息即可。

(3)dll與主程式進行通訊,主要是通過在

dll中和主程式中,自定義訊息,

dll的「攔截函式」將攔截到的滑鼠資訊傳送給主程式,從而可以讓主程式列印出對應的滑鼠訊息

延伸問題四: 為什麼要進行通訊呢?

通訊是為了讓dll的「攔截函式」把捕獲到的滑鼠資訊傳送給呼叫視窗,使得呼叫視窗顯示出滑鼠訊息展示給我們看。

效果大致如圖所示:

鉤子(HOOK)函式

我的理解是 鉤子函式可以 鉤住 我喜歡的東西 在window中就是我喜歡的訊息 這應該就是鉤子函式叫鉤子函式的原因吧。鉤子函式的意義 用處 在於 我寫了乙個window程式,在程式中我寫了一段 呼叫window的api來實現鉤子 這段 被系統通過系統呼叫,把其掛入系統中,然後我就可以對我感興趣的訊息...

Hook技術 全域性鉤子

hook.cpp include stdafx.h include hook.h include hinstance g hinst const int keypres ask 0x80000000 鍵盤掩碼常量 char g prvchar pragma data seg shared stati...

鉤子函式 hook

鉤子函式 一些預定義的函式,由定義者呼叫,使用者提供實現.解釋 如vue中定義了多個生命週期鉤子,vue在內部定義並呼叫這些鉤子函式 不管是否有具體實現 開發者在template中給出各鉤子函式的實現,也可以不實現 vue的生命週期鉤子,vue生命週期鉤子參考 vue原始碼 var lifecycl...