把dll模块注入到游戏进程的方法<a>

1、概述

DLL注入技术: 是将一个Dll文件强行加载到目标进程中,比如把外挂dll模块注入到游戏进程,这样做的目的在于方便我们通过这个DLL读写目标进程指令或内存数据,(例如 HOOK游戏函数过程或篡改游戏内存数据实现外挂功能),或以被注入进程的身份去执行一些操作等。

全系统注入的优点:利用系统机制实现的全系统进程注入,可绕过比如游戏进程自身的防注入保护机制。比如远线程注入游戏可能会被拦截,但输入法注入,游戏很难拦截。

2、消息钩子注入

2.1    原理

Windows应用程序是基于消息驱动的。应用程序对各种消息响应从而实现各种功能。

消息钩子(Message Hook)是Windows消息处理机制的一个监视点,系统会自动将钩子安装到目标进程中达到监视指定类型消息的功能。也就是说通过SetWindowsHookEx 系统会自动将钩子dll注入到目标进程。

安装钩子的函数原型如下:

HHOOK SetWindowsHookEx(      

    int idHook, //钩子类型

    HOOKPROC lpfn,

    HINSTANCE hMod,

    DWORD dwThreadId

);

其中dwThreadId为0时,则是全局钩子,即会注入dll到系统所有窗口进程,否则是线程钩子,即只能将dll注入到目标线程所属的进程。当全局钩子时,钩子处理过程HOOKPROC lpfn 必须位于dll中。

2.2 步骤和源码

源码将以WH_CBT 钩子为例,实现全系统dll注入。 computer-based training (CBT) 基于电脑的训练,比如创建窗口,移动窗口等操作的都会收到通知。

  在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:

1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;

2. 完成系统指令;

3. 来自系统消息队列中的移动鼠标,键盘事件;

4. 设置输入焦点事件;

5. 同步系统消息队列事件。

安装WH_CBT 钩子将CbtHook.dll注入到notepad进程中的效果:

1. 编写被注入的Dll和钩子处理过程

编写一个DLL,并且显式导出CBTProc ()钩子处理过程,主要代码如下:

LRESULT CALLBACK CBTProc(int nCodeWPARAM wParamLPARAM lParam)

{

char   szFileName[MAX_PATH];

if( (HCBT_CREATEWND == nCode) || (HCBT_ACTIVATE == nCode) )

{

memset(szFileName, 0, sizeof(szFileName));

::GetModuleFileNameA(NULL, szFileName, sizeof(szFileName));

DebugPrintA(0, "Code(%d) (%s)\n"nCode, szFileName);

}

return CallNextHookEx(g_hCBT, nCodewParamlParam);

}

 

2. 安装HOOK 

编写一个exe,使用SetWindowsHookEx()向系统安装钩子,首先需要将HOOK的DLL 加载到exe本身的进程中,以此得到DLL的模块句柄,再使用GetProcAddress()得到DLL中显示导出的函数MyMessageProc()的函数地址,最后遍历出待注入进程的线程ID,这样SetWindowsHookEx()就可以利用这些参数进行HOOK了。主要代码如下图所示:

if (NULL == g_hCbtHook)

g_hCbtHook = ::LoadLibrary(szPathName);

if (NULL == g_hCbtHook)

{

lResult = GetLastError();

::DebugPrintA(0, "%s : Load GlobalHook module '%s' fail(%d)\n"C_ModuleNameA, szPathName, lResult);

break;

}

CBTProc = (PCBTPROC)::GetProcAddress(g_hCbtHook, "CBTProc");

if (NULL == g_hCbtHook)

{

lResult = GetLastError();

::DebugPrintA(0, "%s : Get GlobalHook function fail(%d)\n"C_ModuleNameA, lResult);

break;

}

g_hCBT = 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

douluo998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值