差异分析定位Ring 3保护模块

本文介绍了一种通过比较原生DLL文件与内存中的差异来定位Ring3游戏保护模块的方法。通过对ntdll.dll等核心DLL文件的分析,揭示了游戏保护系统如何通过Hook关键函数来实现防调试和保护内存。

 

差异分析定位Ring 3保护模块

 

由于保护模块通常会Hook操作系统的原生DLL接口来进行保护,所以可以采用差异比较原生DLL文件和加载到内存中的原生DLL直接的差别来定位Ring 3模块。

 

在分析的过程中,为了防止被Ring 3保护模块发现,暂时可以先把除了自己线程外的其他线程暂停,如图8-14所示。

 

 

8-14  悬挂除自己线程外的其他线程

 

从图8-14中可以看出,除自己线程外,该游戏有58个线程,可以通过SuspendThread()函数悬挂这些线程以便后续的分析(GS的命令就是ste序号)。

 

下面,我们再对3个常用原生DLL——ntdll.dllkernel32.dlluser32.dll进行文件和内存的比较,如图8-15所示。

 

 

8-15  差异分析原生DLL的变化

 

从图8-15中可以看出,ntdll.dll3处地址发生了变化,分别是0x7c9212300x7c92DEB60x7c97077B。下面让我们看看这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.dll3处发生变化的地址在原生ntdll.dll中的作用。

 

可以用IDAntdll.dll进行分析,然后定位地址0x7c9212300x7c92DEB60x7c97077B

 

如图8-18所示,原来此处地址是DbgBreakPoint函数。这个函数是供调试器下软件断点用的,而在游戏中却被改成了ret指令,这样做能起到防止下软件断点的作用。

 

 

8-18  0x7c921230地址所处函数

 

如图8-19所示,0x7c97077B地址是属于DbgUiRemoteBreakin函数的,这个函数的详细介绍可以参见张银奎老师的《软件调试》一书的第10.6.4节。这里还是简单说明一下这个函数的作用,以便读者能了解。

 

 

8-19  0x7c97077B地址所处函数

 

DbgUiRemoteBreakinntdll提供的用于在目标进程中创建远线程下软件断点的函数,其伪代码如下。

 

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、防火墙和二进制逆向分析,AndroidiOS客户端软件安全,以及WebWAP安全。

 

本文节选自《游戏外挂攻防艺术》一书。徐胜著,由电子工业出版社出版。

 

 

 

 

 

<think>好的,我现在需要处理用户关于ring0驱动程序隐藏进程技术实现的查询。首先,用户之前提到了想了解如何在ring0级别通过驱动隐藏进程,这可能涉及操作系统内核的底层机制。 根据系统级指令,我需要确保所有数学表达式和公式正确使用$或$$格式,并且用中文回答。同时,必须生成相关问题,并在回答中适当引用提供的参考资料。用户还提到参考站内引用[1]和[2],其中引用[1]讨论了微内核的结构,而引用[2]提到Windows内核使用链表管理进程,通过摘除链表节点来隐藏进程。 首先,我需要确定ring0驱动程序隐藏进程的常见方法。用户提到的引用[2]指出Windows用链表连接进程,摘掉链表中的进程可以隐藏。这可能是一种直接的内核对象操作方式。此外,可能还有其他方法,比如Hook系统调用或修改内核数据结构。 接下来,我需要验证这些方法的技术细节是否正确。例如,Windows内核中的进程管理确实使用EPROCESS结构,这些结构通过双向链表连接。修改活动进程链表的指针是传统的方法,但现在可能被安全软件检测到。此外,还有DKOM(直接内核对象操作)技术,直接修改这些结构。 另外,Hook系统调用如NtQuerySystemInformation可以过滤返回结果,隐藏特定进程。这种方法需要修改内核函数指针,但可能触发PatchGuard的保护机制,特别是在64位系统上。 引用[1]提到微内核将大部分功能放在用户空间,这可能与Windows的宏内核结构不同,但用户的问题集中在Windows,因此主要参考引用[2]的内容。 然后,需要考虑现代系统的防护措施,如PatchGuard和驱动签名验证,这些会影响隐藏技术的实现。例如,64位Windows要求驱动有有效签名,并且PatchGuard会检测内核关键结构的修改。 最后,生成相关问题需要涵盖技术方法、检测手段、现代系统限制和替代方案等方面,确保问题具有相关性和深度。 在组织回答时,结构要清晰,分点说明不同技术实现,并指出其局限性和现代应用中的挑战。同时,正确引用提供的资料,例如引用[2]提到的链表操作,以及可能的安全软件检测问题。 需要确保回答准确,同时避免错误的技术细节,比如过时的方法或已被防护机制阻止的技术。此外,提醒用户这些技术可能涉及法律问题,保持中立和客观。</think>### Ring0驱动隐藏进程技术实现分析 在Windows操作系统内核层面实现进程隐藏,主要依赖**直接内核对象操作(DKOM)**和**系统调用Hook**两种核心技术,这两种方法都需要通过Ring0级驱动程序实现内核态代码执行权限。 #### 一、活动进程链表操作法 Windows内核使用`EPROCESS`结构体管理进程[^2],所有活动进程通过双向链表连接。通过以下步骤可实现进程隐藏: 1. 定位目标进程的`EPROCESS`结构 2. 修改链表指针实现摘除操作: ```c // 伪代码示例 PLIST_ENTRY prev = targetProcess->ActiveProcessLinks.Blink; PLIST_ENTRY next = targetProcess->ActiveProcessLinks.Flink; prev->Flink = next; next->Blink = prev; ``` 该方法会破坏进程遍历工具对链表的完整性验证[^2],但现代杀毒软件会通过以下方式检测: - 检查`EPROCESS`结构校验和 - 对比不同进程遍历方式的结果差异 #### 二、系统调用过滤技术 Hook `NtQuerySystemInformation`系统调用,过滤返回结果中的特定进程信息。实现要点: ```c NTSTATUS HookedNtQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength) { NTSTATUS status = OriginalNtQuerySystemInformation(...); if (SystemInformationClass == SystemProcessInformation) { // 遍历链表删除目标进程条目 } return status; } ``` 此方法需要处理内存分页保护机制(如CR0寄存器WP位操作),但在x64系统会触发内核补丁保护(PatchGuard)。 #### 三、现代实现挑战 1. **驱动签名验证**:x64系统要求驱动具有有效微软签名 2. **虚拟化安全**:HyperGuard等基于虚拟化的安全技术会监控关键内核结构 3. **行为检测**:EDR系统会分析驱动模块的异常行为模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值