DLL注入技术之消息钩子注入

 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中。主要流程如下图所示

DLL注入技术之消息钩子注入_第1张图片

1.准备阶段
    需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下:

LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)  
{  
	return CallNextHookEx(NULL, code, wParam, lParam);  
}  
显示导出某个函数需要在.def文件中的EXPORTS填写MyMessageProc(),如下图所示:

DLL注入技术之消息钩子注入_第2张图片

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释放掉,代码如下所示:
[cpp]  view plain  copy
 print ?
  1. if(hMod) FreeLibrary(hMod);  
消息钩子注入只需要对SetWindowsHookEx()和DLL导出函数有深刻的认识就可以很容编写,所以代码简单,比较容易实现。

你可能感兴趣的:(windows编程)