ce过游戏保护驱动的群,研究游戏保护,游戏驱动

腾讯系列游戏驱动保护研究 - 免费黑客网
当前位置: →
日期: 10:37:07&&来源:网络
腾讯系列游戏驱动保护研究
最近时间有些多,一时对网络游戏的保护机制感兴趣了,来研究了一下,听说QQ系列的TesSafe.sys 有些强,于是拿来看看驱动都做了些什么.以下是对DNF和QQffo(自由幻想)研究结果(xp sp2)在网上找了些TesSafe的资料,说TesSafe并不怎么样现在这个版本保护的结果为:任务管理器中可以看到游戏进程,但OD和CE看不见,更不用说什么调试了,iceword可以 看到EPROCSS,但WSysCheck看不见,自己写程序,也不能注入受保护的游戏进程.可见,NtOpenProcess被Hook了,恢复SSDT后,没有任何效果,可见是inline hook ,用一般的软件检测一下,没有发现inline hook,看来hook得比较深,在网上一找资料才发现,原来的确够隐藏的以下是上一个TesSafe版本的分析结果从网上找出来的资料,TesSafe.sys保护原理(DNF的保护,我听说,QQ系列游戏的保护机制都是一样的)=================================================================保护得比较没有意思,强度也不高.可能隐藏性稍好一些. 用IDA反汇编TesSafe.sys可以看到: 这个驱动一加载,ExAllocPoolWithTag分配了一块内存,然后将一个函数写进这块内存,接着做好保护,然后 PsCreateSystemThread()创建的线程调用ZwUnloadDriver将驱动卸载。虽然驱动被卸载了,但是ExAllocPoolWithTag分配的内存仍然在起作用。 具体来看它如何进行保护:先是得到了ObOpenObjectByPointer的地址,然后在 NtOpenProcess中搜索0xe8 ,也就是跳转指令,直到遇见RET为止。一但得到0xe8,比较后面的四个字节,如果转换后为 ObOpenObjectByPointer的地址,就把这个地址用自己代理函数的地址转换后替换掉,达到保护自己的目的。用WinDbg看了看,果然在我的机器上:0x80570e41这个在 NtOpenProcess中的区域被TesSafe.sys修改,原来这里是:c8dffff call nt!ObOpenObjectByPointer (80569bc2) 系统通过ObOpenObjectByPointer来通过 EPROCESS得到Handle返回给调用者。TENCENT在这里下了一个跳转:(TesSafe.sys加载后。)6542a78 call f881626c 很明显,系统执行到这里就会调用0x6881626c的函数,也就是 TesSafe.sys的ObOpenObjectByPointer代理函数。这 样,Client.exe就会在这里被过滤掉,从而让R3程序无法得到QQT的句柄,从而保护进程。 =================================================================================我手头拿到的版本是号的,把TesSafe逆出来一看,比上个版本有所加强.在这个新版本中,TesSafe一共InLine Hook了六个函数,我只逆出并恢复了五个其中:1.KeAttachProcess NtOpenProcessNtOpenThread这三个函数的HOOK方式与上一个版本一样,就是上面蓝色字体的方法,把本应该call ObOpenObjectByPointe的代码修改成了call他自己的代码,然后在他自己的代码中处理保护的进程上面三个函数,原来正常的代码为8a658ffff call nt!ObOpenObjectByPointer (8057758e)被HOOK后的代码变成了 call a8724af4(TesSafe自己搞出来的函数)lkd& u a24af4+110ab450c mov eax,dword ptr [ebp+0Ch]a push ebpabec mov ebp,espa8724afa 81ec sub esp,100h...往下找,a8724bc6 ff jmp dword ptr ds:[0A8729340h] ;ObOpenObjectByPointer可以找到跳到ObOpenObjectByPointer的代码我先偿试着直接用WinDbg把80581ce3 call a8724af4后面的值给修改回来,可是一修改回来就蓝屏,不知道什么原因,搞不清楚.于是没办法,我用另一种方法,直接在HOOK函数的入口点a8724af4修改为jmp ObOpenObjectByPointer,这样就成功恢复了,没有蓝屏用这种方法把以上三个函数全恢复了2.NtWriteVirtualMemoryNtReadVirtualMemory这两个函数被TesSafe把头几个字节HOOK了lkd& u
+180 ;NtWriteVirtualMemory b89e9707a9 mov eax,0A5878d5 ffe0 jmp eax e8a7c5f5ff call nt!CIsqrt+0x2d7 (804e3e83)805878dc 64a mov eax,dword ptr fs:[h]上面这是NtWriteVirtualMemory的代码,头几个字节被修改了,直接恢复之就OK了,上面inline hook的函数一共六个,我只恢复了五个,另一个函数不知道是什么,没弄出来3.在驱动中TesSafe还用了以下三个函数PsSetCreateProcessNotifyRoutinePsSetCreateThreadNotifyRoutinePsSetLoadImageNotifyRoutine可见,他设置了进程,线程创建和加载模块的回调函数,这几个函数设置的回调函数,不容易去除,我只能把PspCreateProcessNotifyRoutine,PspCreateThreadNotifyRoutine,PspLoadImageNotifyRoutine 表全部清空,分析结果:经过我以上的处理,ce可以对进程进程读写操作,但不能附加调试,会失败,OD可以附加上去,可以读写内存,可以暂停程序,但还是不能调试,表现为暂停后,游戏程序就会出错看来TesSafe这次吸收了以前的教训了,下了狠工夫,太烂了,HOOK这么多函数至于为什么不能调试,有可能是还有一个函数我没有恢复的原因吧,我也没那么 多时间去研究了总体来说,他次的保护做得还可以,但就不知道他的ring3保护做得如何了,我只分析了一下驱动,没有分析他的游戏进程,如果游戏进程中没有做好保护,驱动保护就等同于摆设,PspCreateProcessNotifyRoutine,PspCreateThreadNotifyRoutine,PspLoadImageNotifyRoutine 表全部清空代码如下:其它的恢复代码都很简单,就不放出来了RtlInitUnicodeString(&name,L"PsSetCreateProcessNotifyRoutine");RemoveNotifyRoutine((PVOID)MmGetSystemRoutineAddress(&name));RtlInitUnicodeString(&name,L"PsRemoveCreateThreadNotifyRoutine");RemoveNotifyRoutine((PVOID)MmGetSystemRoutineAddress(&name));RtlInitUnicodeString(&name,L"PsRemoveLoadImageNotifyRoutine");RemoveNotifyRoutine((PVOID)MmGetSystemRoutineAddress(&name));__declspec(naked) void DisableWPBitAndCli(){__asm{climov eax, cr0and eax, 0xFFFEFFFFmov cr0, eaxretn }}__declspec(naked) void EnableWPBitAndSti(){__asm{mov eax, cr0or eax, 0x10000mov cr0, eaxstiretn}}NTSTATUSMydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){Irp-&IoStatus.Status = STATUS_SUCCESS;Irp-&rmation = 0L;IoCompleteRequest( Irp, 0 );return Irp-&IoStatus.S}/*NTSTATUS RemoveNotifyRoutine(PVOID RemoveFunPointer)can remove all of the Routine of CreateThread and CreateProcess and LoadImage 注意传入参数为下面三者之一PsSetCreateProcessNotifyRoutinePsRemoveCreateThreadNotifyRoutinePsRemoveLoadImageNotifyRoutine===========by xp sp2*/NTSTATUS RemoveNotifyRoutine(PVOID RemoveFunPointer){ULONG AddrFULONG* pRoutineLULONGpRoutineList = 0;AddrFun = (ULONG)RemoveFunPDbgPrint("RemoveNotifyRoutine = %08X",RemoveFunPointer);////the RemoveFunPointer could //only be PsRemoveLoadImageNotifyRoutine //or PsSetCreateProcessNotifyRoutine //or PsRemoveCreateThreadNotifyRoutine//find code bf
mov edi,offset nt!PsThreadType+0x44 ()//for(i = AddrFi&AddrFun + 0x20;i++){if( 0xbf == *(PBYTE)i ){i++;pRoutineList = (ULONG*)( *(ULONG*)i ); }}if( 0 == pRoutineList){DbgPrint("Can not find the RoutineList");return STATUS_UNSUCCESSFUL;}if( TRUE != MmIsAddressValid((PVOID)pRoutineList) )// memory is valid{DbgPrint("Access Memory is not Valid %08X",pRoutineList);return STATUS_UNSUCCESSFUL;}////Zero the PspCreateThreadNotifyR//DisableWPBitAndCli();for(i=0;i&8;i++) //这里写成0x40也没有问题,我看他这个表应该长度为0x40,但网上说PspCreateProcessNotifyRoutine表长度在win2K下
本文章原创来源:/
·上一篇文章:
·下一篇文章:
& &评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright &
. All Rights Reserved .
本站内容来源网络收集,仅供用于黑客技术安全学习参考,请遵守相关法律法规打造国内最大的黑客技术资源免费发布站提供最权威的黑客攻防教程,黑客安全工具免费黑客网-黑客技术,黑客工具,黑客联盟,黑客基地,黑客网站,黑客论坛

参考资料

 

随机推荐