游戏逆向_DLL注入技术

这篇具有很好参考价值的文章主要介绍了游戏逆向_DLL注入技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

消息钩子注入

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

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

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

HHOOK SetWindowsHookEx(

int idHook, //钩子类型

HOOKPROC lpfn,

HINSTANCE hMod,

DWORD dwThreadId

);

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

步骤和源码

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

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

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

  2. 完成系统指令;

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

  4. 设置输入焦点事件;

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

安装WH_CBT 钩子将CbtHook.dll注入到notepad进程中的效果:
游戏逆向_DLL注入技术

游戏逆向_DLL注入技术

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

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

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM 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);

}文章来源地址https://www.toymoban.com/news/detail-408960.html

return CallNextHookEx(g_hCBT, nCode, wParam, lParam);

}

安装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 = SetWindowsHookEx(WH_CBT, CBTProc, g_hCbtHook, 0);

if (NULL == g_hCBT)

{

lResult = GetLastError();

::DebugPrintA(0, “%s : Set GlobalHook fail(%d)\n”, C_ModuleNameA, lResult);

break;

}

卸载钩子

利用LoadLibrary()得到的模块句柄把本身进程的DLL释放掉,代码如下所示:

FreeLibrary(g_hCbtHook);
消息钩子注入只熟悉SetWindowsHookEx()和DLL导出函数就可以很容编写,所以容易实现。

注册表注入

注册表(Reg)注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个 DLL文件路径中的DLL文件。

AppInit_Dlls注册表:

注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows中有两个值:

LoadAppInit_Dlls:键值中指定要注入的DLL

AppInit_Dlls:若其键值为1,则注入LoadAppInit_Dlls中指定的DLL,若为0则不注入。注:(1)LoadAppInit_Dlls中的值当如 果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径,所以DLL的路径中最好不要有空格。

使用范围:

任何加载User32.DLL的程序,user32.dll的DllMain会先尝试加载注册表项AppInit_Dlls中的DLL。因为所有的GUI应用程序在启动时都会加载User32.dll,因此这种方法会影响所有的GUI程序。
游戏逆向_DLL注入技术
使用Process Explorer查看进程模块来确认目标dll是否被注入。
游戏逆向_DLL注入技术

步骤和源码

需要解决的就是关于注册表操作的Windows API了,如下所示:

RegOpenKeyEx

打开注册表键值

RegQueryValueEx

查询键值

RegSetValueEx

设置键值

RegCloseKey

关闭键值

主要代码如下:

BOOL AddRegItem(CHAR* szInjectFilePath)

{

//打开键值

LSTATUS nReg = ERROR_SUCCESS;

HKEY hKey;

CHAR szRegPath[MAX_PATH] = “SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows”;

nReg = RegOpenKeyEx(

HKEY_LOCAL_MACHINE,

szRegPath,

0,

KEY_ALL_ACCESS,

&hKey);

if (nReg != ERROR_SUCCESS)

{

return FALSE;

}

//查询键值

DWORD dwReadType;

DWORD dwReadCount;

TCHAR szReadBuff[1024] = { 0 };

nReg = RegQueryValueEx(hKey,

_T(“AppInit_DLLs”),

NULL,

&dwReadType,

(BYTE*)&szReadBuff,

&dwReadCount);

if (nReg != ERROR_SUCCESS)

{

return FALSE;

}

//若dll名称已经在内容中,则不用重复添加

if (StrStrI(szReadBuff,szInjectFilePath))

{

printf(“dll already in reg=%s\n”, szReadBuff);

return FALSE;

}

//原来已有内容就加入空格后再附加新dll串

if (0 != _tcscmp(szReadBuff, _T(“”)))

{

_tcscat_s(szReadBuff, _T(" "));

}

_tcscat_s(szReadBuff, szInjectFilePath);

//1.把dll路径设置到注册表中

nReg = RegSetValueEx(hKey,

_T(“AppInit_DLLs”),

0,

REG_SZ,

(CONST BYTE*)szReadBuff,

(_tcslen(szReadBuff) + 1)*sizeof(TCHAR));

//2.启动 注册表加载dll

BYTE byEnable[4] = { 0x1 };

nReg = RegSetValueEx(hKey,

_T(“LoadAppInit_DLLs”),

0,

REG_DWORD,

(CONST BYTE*)byEnable,

4);

printf(“RegSetValueEx AppInit_DLLs = %s Result=%d\n”, szReadBuff, nReg);

}

到了这里,关于游戏逆向_DLL注入技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【游戏逆向】Lua游戏逆向及破解方法介绍

    随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台。Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注,在此归纳一些常用的分析方法,同

    2024年02月04日
    浏览(43)
  • x86游戏逆向之实战游戏线程发包与普通发包的逆向

    网游找Call的过程中难免会遇到不方便通过数据来找的或者仅仅查找数据根本找不到的东西,但是网游中一般的工程肯定要发给服务器,比如你打怪,如果都是在本地处理的话就特别容易产生变态功能,而且不方便与其他玩家通信,所以找到了游戏发包的地方,再找功能就易如

    2024年02月06日
    浏览(45)
  • 9.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏连接服务器的操作

    内容参考于:易道云信息技术研究院VIP课 上一个内容:游戏底层功能对接类GameProc的实现 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:44c54d30370d3621c1e9ec3d7fa1e2a028e773e9 代码下载地址,在 titan 目录下,文件名为:titan-接管游戏连接服务器的操作.zip 链接

    2024年03月08日
    浏览(43)
  • c++注入dll调用call

    1.先写个我们要调用的函数 这个我们写了一个很简单的函数,一个main函数和test函数。我们后面要通过动态注入dll调用这个test函数。 我们先运行一下。看看结果 输入这个,看了没有任何问题。 2.写一个简单的dll 我们在vs2019创建一个dll文件,在DLL_PROCESS_ATTACH下面加一行语句。

    2024年02月03日
    浏览(44)
  • 游戏逆向_Android读写游戏内容

    一、背景 Android外挂的实现,需要涉及相应游戏内容的读写。读写的游戏内容包括代码和数据 针对不同的读写对象,通用的步骤就是寻找对象地址(位置)→获取相应权限→读写。下面将更详细介绍下相关实现。 二、实现方式 实现方式可以分为两大类:注入式和非注入式。

    2023年04月13日
    浏览(39)
  • 驱动开发:内核远程线程实现DLL注入

    在笔者上一篇文章 《内核RIP劫持实现DLL注入》 介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过 NtCreateThreadEx 这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址

    2024年02月10日
    浏览(39)
  • 内核中劫持线程注入DLL并隐藏

    在本文中,我们将讨论如何在Windows驱动层劫持进程线程、注入DLL并隐藏注入后的内存。但请注意,本文描述的方法仅用于教育和研究目的,不得用于非法或恶意目的。对于任何可能导致对他人计算机、数据或设备造成损害的行为,本文概不负责。 以下是在Windows驱动层劫持进

    2024年02月20日
    浏览(35)
  • 驱动开发:内核LoadLibrary实现DLL注入

    远程线程注入是最常用的一种注入技术,在应用层注入是通过 CreateRemoteThread 这个函数实现的,该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数 RtlCreateUserThread ,但需要注意的是此函数未被公开, RtlCreateUserThread 其

    2024年02月08日
    浏览(41)
  • 网络攻防:DLL注入实现键盘钩取+记事本注入并联网下载网页

    目录 前言 一、dll注入的介绍和示例 dll注入介绍 dll注入示例 二、dll注入实现方法 三、键盘消息监听钩取 消息钩取原理 键盘消息监听钩取具体实现 四、dll注入记事本实现联网下载网页 介绍  实现 五、总结 这是研一专业课网络攻防对抗术的一次汇报,我对其大致内容做了相

    2024年02月11日
    浏览(52)
  • 61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

    内容来源于: 易道云信息技术研究院VIP课 上一节内容:游戏公告功能的逆向分析与测试-CSDN博客 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:63e04cc40f649d10ba2f4fa313ca65cc78f46516 代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-游戏红字公告功能的逆

    2024年01月23日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包