DLL注入技术之消息钩子注入
2016-03-22 11:36
405 查看
消息钩子注入原理是利用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释放掉,代码如下所示:
[cpp] view
plain copy
print?
if(hMod) FreeLibrary(hMod);
消息钩子注入只需要对SetWindowsHookEx()和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释放掉,代码如下所示:
[cpp] view
plain copy
print?
if(hMod) FreeLibrary(hMod);
消息钩子注入只需要对SetWindowsHookEx()和DLL导出函数有深刻的认识就可以很容编写,所以代码简单,比较容易实现。
相关文章推荐
- Math类
- 生产环境部署Hadoop+Spark+HBase+Hue
- iTunes Connect 开发者上手经验
- 释放广播接受者
- 软件生命周期。
- windows上给yii2安装插件
- 安卓5.0+新特性 简单使用
- 安卓5.0+新特性 简单使用
- 安卓5.0+新特性 简单使用
- 安卓5.0+新特性 简单使用
- 安卓5.0+新特性 简单使用
- 初学者 函数和存储过程
- 走进AngularJs 过滤器(filter)
- 百度地图API的定位问题
- tomcat
- 北京相关的图像公司
- Foundation之NSString
- Solr 4.x定时、实时增量索引 - 修改、删除和新增索引
- 《开源分享2》:《开源框架实战宝典电子书V1.0.0》完整版!
- Azure ibiza Portal (1) 概览