標籤:使用 io for re c ar
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId);
idHook: 鉤子類型
lpfn:鉤子過程的指標 ,也即攔截到指定系統訊息後的預先處理過程,定義在DLL中
hMod:應用程式執行個體的控制代碼 如果是全域鉤子, hInstance是DLL控制代碼(DllMain中給的模組地址。就是包含HookProc的動態庫載入地址。否則給0就可以了,即勾自己。
dwThreadId:要安裝鉤子的線程ID ,指定被監視的線程,如果明確指定了某個線程的ID就只監視該線程,此時的鉤子即為線程鉤子;如果該參數被設定為0,則表示此鉤子為監視系統所有線程的全域鉤子。
其中idHook參數可以取如下常量:
WH_CALLWNDPROC //視窗鉤子,當系統向目標視窗發送訊息時將觸發此鉤子
WH_CALLWNDPROCRET //視窗鉤子,當視窗處理完訊息後將觸發此鉤子
WH_CBT //當Windows啟用、產生、釋放(關閉)、最小化、最大化或改變視窗時都將觸發此事件
WH_DEBUG //調試鉤子
WH_GETMESSAGE //當往訊息佇列中增加一個訊息時將觸發此鉤子
WH_JOURNALPLAYBACK //回放鉤子,可以用於播放已記錄的滑鼠和鍵盤的操作
WH_JOURNALRECORD //記錄鉤子,可以用於記錄滑鼠和鍵盤的操作,木馬程式可以使用此鉤子竊取受控方在螢幕中敲入的密碼
WH_KEYBOARD //當敲擊鍵盤時將觸發此鉤子
WH_MOUSE //當有滑鼠操作時將觸發此鉤子
WH_MSGFILTER //訊息過濾鉤子
WH_SHELL //Shell鉤子
WH_SYSMSGFILTER //系統訊息過濾鉤子
原理:通過SetWindowsHookEx函數將DLL注入到進程的地址空間中,最後一個參數dwThreadId指向的是被注入進程內的某個線程ID。
(1) 進程A對線程dwThread掛鍵盤鉤子
(2) 線程dwThreadId擷取到的鍵盤訊息會實現被鉤子攔截
(3) 系統檢查hMod指向的DLL是否已被載入到線程dwThreadId所在的進程地址空間中,若否,則載入。這時,假設DLL被載入到進程B
(4) 系統在進程B的地址空間中調用lpfn函數
*********************************************************************************
DLL部分
*********************************************************************************
LRESULT CALLBACK FunProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
MessageBox(NULL,"KEY PRESS","hook inject",MB_OK);
return CallNextHookEx(0,code,wParam,lParam);
}
HHOOK g_HookHandle;
__declspec(dllexport) void SetHook()
{
DWORD tid = 0;
// 擷取視窗控制代碼
HWND gameh = FindWindow(NULL,"test.txt - 記事本");
if (gameh == 0)
{
return;
}
// 擷取建立這個視窗的線程
tid = GetWindowThreadProcessId(gameh,NULL);
// 安裝鉤子到指定線程 WH_KEYBOARD 鍵盤鉤子
g_HookHandle = SetWindowsHookEx(WH_KEYBOARD, FunProc, GetModuleHandle("HOOKInject.dll"),tid);
}
__declspec(dllexport) void UnHook()
{
UnhookWindowsHookEx(g_HookHandle);
}
*********************************************************************************
EXE部分
*********************************************************************************
typedef void (*lpFun)();
int main()
{
HINSTANCE hDll; //DLL控制代碼
lpFun SetHook; //函數指標
lpFun UnHook; //函數指標
hDll = LoadLibrary("..\\Debug\\HOOKInject.dll");
if (hDll != NULL)
{
SetHook = (lpFun)GetProcAddress(hDll, "SetHook");
UnHook = (lpFun)GetProcAddress(hDll, "UnHook");
}
if (SetHook != NULL)
{
SetHook();
}
getchar();
UnHook();
if (hDll != NULL)
{
FreeLibrary(hDll);
}
return 0;
}