HOOK程式設計

2021-05-23 13:20:23 字數 3245 閱讀 4234

註明:該文**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...