﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-飞的更高</title><link>http://www.cnitblog.com/kaihuayu/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 20:55:08 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 20:55:08 GMT</pubDate><ttl>60</ttl><item><title>（转wanleidawa ）搞定QQ游戏系列（寻仙，DNF等等）驱动保护TesSafe.sys</title><link>http://www.cnitblog.com/kaihuayu/archive/2009/01/03/53405.html</link><dc:creator>开花的树</dc:creator><author>开花的树</author><pubDate>Sat, 03 Jan 2009 14:27:00 GMT</pubDate><guid>http://www.cnitblog.com/kaihuayu/archive/2009/01/03/53405.html</guid><wfw:comment>http://www.cnitblog.com/kaihuayu/comments/53405.html</wfw:comment><comments>http://www.cnitblog.com/kaihuayu/archive/2009/01/03/53405.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/kaihuayu/comments/commentRss/53405.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kaihuayu/services/trackbacks/53405.html</trackback:ping><description><![CDATA[1.用RKU看一下SSDT和SSDTShadow，发现SSDT并没有被HOOK，SSDTShadow HOOK了5个调用：<br>NtUserBuildHwndList<br>NtUserFindWindowEx<br>NtUserGetDC<br>NtUserGetDCEx<br>NtUserGetForegroundWindow<br><br>想也不用想，肯定是为了防止其他软件找到他的窗口。<br>解决方法：在TesSafe加载前先加载自己的驱动，备份这5个调用的地址，等TesSafe加载后直接还原即可，或者直接用RKU还原，TesSafe并没有在这里加效验，所以比较容易。<br><br>2.既然SSDT没有没HOOK，那么肯定有inline hook，用windbg看一下，发现被inline hook的调用有如下几个：<br>NtReadVirtualMemory&nbsp; <br>NtWriteVirtualMemory<br>NtOpenProcess + 0x2xx Call ObOpenObjectByPointer处<br>NtOpenThread&nbsp; + 0x1xx Call ObOpenObjectByPointer处<br>KiAttachProcess<br><br>解决方法：<br>(1).<br>NtReadVirtualMemory<br>NtWriteVirtualMemory<br>这2个比较好解决，自己写2个调用，实现这2个调用的头10个字节，然后再跳转到这2个调用头10个字节后面的地址，再到SSDT表里把这2个调用地址改成我们自己的即可。<br><br>(2).<br>NtOpenProcess + 0x2xx<br>NtOpenThread&nbsp; + 0x1xx<br>在TesSafe加载前，先保存ObOpenObjectByPointer的地址（或者用MmGetSystemRoutineAddress获取），然后我们自己写一段代码，实现Call ObOpenObjectByPointer头N个字节（随便自己）以及Call ObOpenObjectByPointer，然后再jmp到Call ObOpenObjectByPointer后面的代码地址，如：<br>push eax<br>push dword ptr [ebp-38h]<br>push dword ptr [ebp-24h]<br>Call ObOpenObjectByPointer<br>jmp xxx<br>然后在Call ObOpenObjectByPointer前面N个字节处jmp到我们自制的代码，这样的话就算TesSafe把Call ObOpenObjectByPointer改成Call到自己的函数，对我们也没有作用了。 <br>注意：直接还原代码的话，势必会蓝屏。因为TesSafe对这个地址有代码效验<br><br>(3).<br>KiAttachProcess<br>由于这个调用并没有被导出，在SSDT表中也没有他的地址。所以我们首先要获取他的地址<br>虽然它没有被导出，但是调用它的另外一个调用KeAttachProcess却是被导出了的，我们可以先用MmGetSystemRoutineAddress获取KeAttachProcess的地址，再通过KeAttachProcess + 0x41的Call KiAttachProcess来取得KiAttachProcess的地址，然后直接还原它的代码即可（TesSafe并没有对这里进行代码效验）。<br><br>至此，TesSafe的所有HOOK都已恢复完毕，这时用OD附加游戏，发现OD会突然停止。 <br>其实，上面那些HOOK大部分人都已经搞定，关键就是这最后一步，OD停止的原因是他收不到调试消息了，因为TesSafe有一个线程不停的向PEPROCESS-&gt;DebugPort 写入NULL（0）。<br>DebugPort其实就是Debug_Object的指针。<br><br>UnHook的方法多种多样，稍微灵活变通下就能想出很多方法。<br>程序我就不传了，我相信这些分析比传一个程序有用的多<br><br>NP和HS也都大同小异，自己写系统调用，一样过他<br>以后我会介绍如果绕过NP，以及HS的保护<br>
<img src ="http://www.cnitblog.com/kaihuayu/aggbug/53405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kaihuayu/" target="_blank">开花的树</a> 2009-01-03 22:27 <a href="http://www.cnitblog.com/kaihuayu/archive/2009/01/03/53405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>