轉自:黑客反病毒
消息鉤子注入原理是利用Windows 系統中SetWindowsHookEx()這個API,他可以攔截目標進程的消息到指定的DLL中導出的函數,利用這個特性,我們可以將DLL注入到指定進程中。主要流程如下圖所示
1.準備階段
需要編寫一個DLL,並且顯式導出MyMessageProc()函數,主要代碼如下:
LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(NULL, code, wParam, lParam);
}
顯示導出某個函數需要在.def文件中的EXPORTS填寫MyMessageProc(),如下圖所示:
2.HOOK階段
使用SetWindowsHookEx()之前首先需要將HOOK的DLL 加載到本身的進程中,以此得到DLL的模塊句柄,再使用GetProcAddress()得到DLL中顯示導出的函數MyMessageProc()的函數地址,最後遍歷出待注入進程的線程ID,這樣SetWindowsHookEx()就可以利用這些參數進行HOOK了。主要代碼如下圖所示:
//加載DLL到本身進程
hMod = LoadLibrary(pDllName);
if(!hMod) return FALSE;
//得到顯示函數的地址
lpFunc = (DWORD)GetProcAddress(hMod, "MyMessageProc");
if(!lpFunc)
{
if(hMod) FreeLibrary(hMod);
return FALSE;
}
//得到待注入EXE的進程ID
dwProcessId = GetProcessId(pExeName);
if(!dwProcessId)
{
if(hMod) FreeLibrary(hMod);
return FALSE;
}
//得到待注入EXE的線程ID
dwThreadId = GetThreadId(dwProcessId);
if(!dwThreadId)
{
if(hMod) FreeLibrary(hMod);
return FALSE;
}
//利用HOOK進行注入
hhook = SetWindowsHookEx(
WH_GETMESSAGE,//WH_KEYBOARD,//WH_CALLWNDPROC,
(HOOKPROC)lpFunc,
hMod,
dwThreadId);
3.釋放階段
利用LoadLibrary()得到的模塊句柄把本身進程的DLL釋放掉,代碼如下所示:
if(hMod) FreeLibrary(hMod);
消息鉤子注入只需要對SetWindowsHookEx()和DLL導出函數有深刻的認識就可以很容編寫,所以代碼簡單,比較容易實現。