差异分析定位Ring 3保护模块
由于保护模块通常会Hook操作系统的原生DLL接口来进行保护,所以可以采用差异比较原生DLL文件和加载到内存中的原生DLL直接的差别来定位Ring 3模块。
在分析的过程中,为了防止被Ring 3保护模块发现,暂时可以先把除了自己线程外的其他线程暂停,如图8-14所示。
图8-14 悬挂除自己线程外的其他线程
从图8-14中可以看出,除自己线程外,该游戏有58个线程,可以通过SuspendThread()函数悬挂这些线程以便后续的分析(GS的命令就是ste序号)。
下面,我们再对3个常用原生DLL——ntdll.dll、kernel32.dll和user32.dll进行文件和内存的比较,如图8-15所示。
图8-15 差异分析原生DLL的变化
从图8-15中可以看出,ntdll.dll有3处地址发生了变化,分别是0x7c921230、0x7c92DEB6和0x7c97077B。下面让我们看看这3处地址目前的指令是什么,如图8-16所示。
图8-16 两处地址jmp指令
在图8-16中,有一处jmp指令是跳入地址0x45320F0。让我们看看它属于哪个模块,如图8-17所示。
图8-17 模块节信息
从图8-17的地址区间来看,是包含0x45320F0的,所以,在ntdll.dll中地址0x7c92deb6会跳入X.dll模块。到目前为止,我们基本可以判断ring 3下的游戏保护模块是X.dll。
为了能更准确地判断X.dll是否是真的保护模块,下面让我们看看ntdll.dll中3处发生变化的地址在原生ntdll.dll中的作用。
可以用IDA对ntdll.dll进行分析,然后定位地址0x7c921230、0x7c92DEB6和0x7c97077B。
如图8-18所示,原来此处地址是DbgBreakPoint函数。这个函数是供调试器下软件断点用的,而在游戏中却被改成了ret指令,这样做能起到防止下软件断点的作用。
图8-18 0x7c921230地址所处函数
如图8-19所示,0x7c97077B地址是属于DbgUiRemoteBreakin函数的,这个函数的详细介绍可以参见张银奎老师的《软件调试》一书的第10.6.4节。这里还是简单说明一下这个函数的作用,以便读者能了解。
图8-19 0x7c97077B地址所处函数
DbgUiRemoteBreakin是ntdll提供的用于在目标进程中创建远线程下软件断点的函数,其伪代码如下。
DWORD WINAPI DbgUiRemoteBreakin( LPVOID lpParameter)
{
__try
{
if(NtCurrentPeb->BeingDebugged)
DbgBreakPoint();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
Return 1;
}
RtlExitUserThread(0);
}
当调试器通过CreateRemoteThread函数在目标程序中创建DbgUiRemoteBreakin线程的时候,从代码上来看是下了int 3软件断点。由于在被调试状态,所以调试器可以捕获这个异常。如果目标程序没有被调试的话,DbgUiRemoteBreakin中的S.H.E显然可以捕获并处理它。
所以,游戏保护系统在对DbgUiRemoteBreakin进行jmp操作,很明显是为了防止被调试。下面再看看保护系统从DbgUiRemoteBreakin跳到了哪里。
如图8-20所示是保护系统从DbgUiRemoteBreakin跳入执行的函数,很明显,LdrShutdownProcess是一个关闭进程的函数。
图8-20 0x7C943DEF地址所处函数
下面再让我们看看地址0x7c92DEB6处的含义。
如图8-21所示,保护模块对ZwProtectVirtualMemory函数进行了Hook,以防止虚拟内存所在页面的保护属性被改变。
图8-21 0x7c92DEB6地址所处函数
关于更多分析游戏保护方案的思路见<<游戏外挂攻防艺术>>第8章。
作者简介
徐胜,2009年于电子科技大学获得计算机科学与工程硕士学位,现就职于阿里巴巴,从事移动安全的研究和移动产品的研发,主要研究方向包括:Windows平台下的木马、外挂、Rootkit、防火墙和二进制逆向分析,Android和iOS客户端软件安全,以及Web和WAP安全。
本文节选自《游戏外挂攻防艺术》一书。徐胜著,由电子工业出版社出版。
相关推荐
例如:windows ring3下cs是0x1b , ring0下cs通常是0x08.。 对于近转移,我们不需要进行特权级检查。由于windows是保护模式的操作系统,对于远转移如果跨层则需要进行特权级检查,看是否允许其调用。
从ring3切换到ring0的代码 从ring3切换到ring0的代码 从ring3切换到ring0的代码
从RING0级下启动RING3级的应用程序源代码 ring0驱动调用ring3应用程序.zip
通过修改文件权限的方式保护文件路径
Ring3 下隐藏进程.txt
Ring3 Hook ZwQuerySystemInformation实现隐藏进程,在XP里测试通过。
[ring3反作弊篇] 基于EBP遍历调用栈及模块名 注意:这是一份C++ Ring3 入门级的反作弊示例代码,基于函数调用栈的检测
Repo for Rootkit Ring 3 and Ring 0 test in Python and C++
ring3用户级应用程序与ring0内核级驱动程序之间的调用,通信.zip
ring3实现任务管理器的进程防杀 C++源码 包括DLL,可用于c#调用,在个windows平台测试通过
驱动层ring0和应用层ring3软件通信.zip
ring3进入ring0跟踪调试
Ring3恢复HOOK FOR Delphi
驱动加载软件,在ring3的exe中加载内核ring0的驱动程序.sys
Ring3下获取原始的SSDT // ssdt.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "ssdt.h" #include "ssdtDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_...
ring3下实现HOOK API续之进程防杀
Ring3层下的Inline Hook是最常用的Hook手段之一,是一种通过修改机器码的方式来实现hook的技术。 1、构造跳转指令。 2、在内存中找到欲HOOK函数地址,并保存欲HOOK位置处的前5个字节。(但其实并不一定就是5个字节,...
现在已经基本告别R0时代了 CIH病毒肆虐的时代早过去了 因此 我们如何在R3的权限下来搞病毒呢 我们要了解他的机制!
用ring3代码可靠地枚举Windows进程.pdf
ring0 ring3程序的区别