之前有一次吃飯的時候,聽前輩聊到猜想某某輸入法的鉤子,導致了我們軟體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檔案中定義匯出的函式
:
(2); hookdll.def : 宣告 dll 的模組引數。
library "mousehook"
exports
; 此處可以是顯式匯出
starthookmouse
stophookmouse
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...