註明:該文**sch0120的技術部落格
一、什麼是hook?
"hook"這個單詞的意思是「鉤子」,"windows hook"是windows訊息處理機制的乙個重要擴充套件,程式設計師可以通過它來鉤住(截獲)感興趣的訊息,並用事先編好的乙個函式(鉤子過程)來處理這些訊息!當然,這個處理是在訊息到達目標視窗之前進行的。
簡單說明:
unhookwindowshookex()函式用於從系統中解除安裝鉤子;
hhk引數是要被解除安裝的鉤子的控制代碼,也就是setwindowshookex()的返回值;
最後,如果這個函式執行成功會返回非零值,如果執行失敗會返回零值,使用者可以通過呼叫getlasterror()函式獲知詳情。
《未完待續》
五、hook程式設計例項
1.新建乙個基於對話方塊的工程"innerhook",此工程的鉤子是只攔截當前程序的。
2.在oninitdialog()中新增**:
view plaincopy to clipboardprint?
g_hwnd = m_hwnd;
g_hmouse = setwindowshookex(wh_mouse, mouseproc, null, getcurrentthreadid()); //設定了滑鼠鉤子
g_hkeyboard = setwindowshookex(wh_keyboard, keyboardproc, null, getcurrentthreadid()); //設定了鍵盤鉤子
g_hwnd = m_hwnd;
g_hmouse = setwindowshookex(wh_mouse, mouseproc, null, getcurrentthreadid()); //設定了滑鼠鉤子
g_hkeyboard = setwindowshookex(wh_keyboard, keyboardproc, null, getcurrentthreadid()); //設定了鍵盤鉤子
3.完成鉤子函式的編寫:
hhook g_hkeyboard=null;
hhook g_hmouse;
hwnd g_hwnd=null;
lresult callback mouseproc(
int ncode, // hook code
wparam wparam, // message identifier
lparam lparam // mouse coordinates
)lresult callback keyboardproc(
int code, // hook code
wparam wparam, // virtual-key code
lparam lparam // keystroke-message information
)return 1;
}3.編寫乙個屏遮蔽所有程序和所有執行緒的鉤子程式。聳閉飧齬匙穎匭氚滄霸贒ll中,然後被某個程式呼叫才行。
1.新建乙個dll工程名為hook
2.增加hook.cpp
3.**如下:
#include 包含標頭檔案
hhook g_hmouse=null;
hhook g_hkeyboard=null;
#pragma data_seg("mysec")新建了乙個節,用於將下 面的這個變數設為全域性共享。
hwnd g_hwnd=null;這個變數是全域性共享的。
#pragma data_seg()
//#pragma comment(linker,"/section:mysec,rws")
/*hinstance g_hinst;
bool winapi dllmain(
hinstance hinstdll, // handle to the dll module
dword fdwreason, // reason for calling function
lpvoid lpvreserved // reserved)*/
lresult callback mouseproc(
int ncode, // hook code
wparam wparam, // message identifier
lparam lparam // mouse coordinates
)lresult callback keyboardproc(
int code, // hook code
wparam wparam, // virtual-key code
lparam lparam // keystroke-message information
)return 1;
}void sethook(hwnd hwnd)此函式設定了鉤子。
hook.def的**如下:
library hook
exports
sethook @2
segments
mysec read write shared 也可以設定節的屬性。
4.新建乙個工程呼叫此鉤子函式。工程名為hooktest,基於對話方塊的。在oninitdialog()中呼叫sethook(),要事先宣告_declspec(dllimport) void sethook(hwnd hwnd);
然後在project->setting->link->加入../hook/debug/hook.lib,並將hook.dll拷貝到當前目錄。
int cxscreen,cyscreen;
cxscreen=getsystemmetrics(sm_cxscreen);
cyscreen=getsystemmetrics(sm_cyscreen);
setwindowpos(&wndtopmost,0,0,cxscreen,cyscreen,swp_showwindow);將視窗保持在最前面。
sethook(m_hwnd);
5.dll的除錯方法,設定斷點,然後執行時斷點時,step into即可。
《未完待續》
參考書籍:
孫鑫《vc++深入詳解》
參考資料:
HOOK程式設計
有時候我們需要攔截windows訊息,可以通過hoo完成。安裝乙個hook過程,稱為鉤子過程。作業系統在訊息時,將我們感興趣的訊息先傳遞給hook過程,在此函式中進行檢查或者抓取訊息。下面看乙個簡單的示例 定義鉤子過程函式 lresult callback keyboardproc int code...
hook入門 實現本地hook
工作中有個程式需要做一些改變,但又沒有源 那麼只能通過hook來解決了.學習中.第一步是寫乙個簡單的測試hook 參考了這裡的 然後寫了幾個簡單的工程測試成功 hook前 hook後 原理很簡單,就是將在本地載入的dll的函式入口的一部分機器碼替換為了跳轉指令的機器碼,實現了當exe呼叫該dll函式...
編寫hook函式,改寫hook函式
在conftest裡面加上這麼乙個函式,那麼在命令列裡面使用pytest 會出現如下效果 編寫 命令列新增引數 def pytest addoption parser mygroup parser.getgroup hogwarts group 將下面所有的option都展示最這個group下 my...