全域性鉤子為什麼要用DLL 共享節
阿新 • • 發佈:2019-02-08
利用全域性鉤子 在別的程序視窗下 關閉test視窗
2013-12-05 13:02使徒闢允382 分類:網站使用 | 瀏覽 66 次 我有更好的答案 舉報 2013-12-05 14:03 提問者採納
如果你只hook本程序得訊息,可以把訊息回撥函式和呼叫鉤子的函式寫在一起,也就是隻需要寫個exe就可以了。 如果要hook全域性訊息,需要全域性鉤子,這樣,需要把你的HOOK程式碼注入到系統每個程序裡面去。而實現這個最好的方法,就是用dll來實現。系統會自動把該DLL注入到所有的程序空間中。所以,不一定是必須要寫DLL來HOOK
對於DLL被多個程序使用時
多個程序會共用DLL的程式碼頁面和資料頁面
但是
如果不設定共享節 全域性變數 g_hwnd被賦值時,程序修改變數時,會額外開闢屬於程序自己的資料空間
導致這個變數並沒有被各個程序共享
在DLL CPP中
程序執行後,即使在別的視窗(比如瀏覽器)下按F2,也會把exe給關了#include <Windows.h> #pragma data_seg("MySec") //字元最大長度8 多了會自動截掉 HWND g_hwnd = NULL; //新節中放置變數 必須初始化 #pragma data_seg() #pragma comment(linker,"/section:MySec,RWS") //指令型別為linker 表明該行程式碼用來指定連結選項 //將MySec 這個節 設定為 讀 寫 共享 型別 read write shared HHOOK g_hMouse=NULL; HHOOK g_hKeyboard=NULL; //滑鼠鉤子過程 LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam) { return 0;<span style="white-space:pre"> </span> } LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) { if(VK_F2 == wParam) //F2關閉 { ::SendMessageA(g_hwnd,WM_CLOSE,0,0); ::UnhookWindowsHookEx(::g_hKeyboard); ::UnhookWindowsHookEx(::g_hMouse); } return 0; } //安裝滑鼠鉤子過程的函式 void SetHook( HWND hwnd ) { ::g_hwnd=hwnd; //這條賦值語句其實也可以寫在應用程式的函式外 ::g_hMouse=::SetWindowsHookExA( WH_MOUSE, ::MouseProc, ::GetModuleHandleA("0712B.dll"), //安裝鉤子的DLL的模組控制代碼 0 //第四個引數設為0 全域性鉤子 所有程序 ); ; ::g_hKeyboard=::SetWindowsHookExA( WH_KEYBOARD, ::KeyboardProc, ::GetModuleHandleA("0712B.dll"), 0 ); ; }
風行者引領群雄者行風