貌似论坛里面有关游戏的贴子都很火,所以发篇帖子涨点人气。
正文:
在论坛搜索了下发现去年的时候有人发过一篇过TesSafe反双机调试的帖子,但是现在已经过时了,并且帖子里面也没提到怎么处理被IAT HOOK的两个函数。在这里呢,我就给大家彻底的讲明白吧。
先开ARK工具看看游戏干了什么。
从图片可以看到游戏启动的时候对ntkrnlmp.exe中的kdcom.KdSendPacket和kdcom.KdReceivePacket两个函数进行了HOOK,通过函数名称就能猜测到函数的用途,一个发包,一个收包,都是com口用来通信的。
怎样恢复这两个函数呢,方面有很多种,列举两个。
1、自己映射内核文件ntkrnlmp.exe,然后通过PE结构遍历ntkrnlmp.exe的导入表,获取导入表中KdSendPacket、 KdReceivePacket两个函数的地址在ntkrnlmp.exe中的偏移,然后利用这个偏移修改系统正常运行的ntkrnlmp.exe导入表 中的两个函数地址。
但是这里还有一个问题就是,导入表中KdReceivePacket这个位置有代码校验,只要被修改就会重启,所以还得绕过代码校验。所以不推荐这种方法。
2、通过图片可以看到被IATHOOK的两个函数被挂钩后的新地址分别为0xB07920E6,0xB07920F6,相差16个字节。既然不想直接去恢 复导入表,那么我们可以在这两个被挂钩后的地址中再跳回正常的KdSendPacket、KdReceivePacket。或许有人又有疑问,这两个挂钩 地址处没有代码校验吗,答案是也有校验,只要修改前面几个字节,同样会重启。但是游戏只检测了前面的几个字节,所以只要在靠后一点的地方修改就不会被检测 到。
修改后
另外一个也是同样处理函数
这样两个被IATHOOK的函数就相当于被恢复了。
但是上面我们是用工具进行恢复的,而TP启动的时候就已经调用了KdDisableDebugger禁止了WinDbg双机调试,这时候就算恢复了上面的两个函数,同样也无法双机调试。
之所以先讲怎样处理上面的两个函数是因为在TP驱动加载的时候首先进行了IATHOOK,然后调用KdDisableDebugger,如果你先处理KdDisableDebugger,而没有恢复上面两个函数的话,系统会直接重启。
因为要赶在TP调用KdDisableDebugger之前恢复IATHOOK,那么就需要设置一个系统回调函数,然后在加载TP驱动的时候进入我们的回 调函数,这时TP已经加载完成,但是还没有开始运行,所以我们可以直接定位到 挂钩地址 处 写入跳转代码到正常的函数。
通过上面的代码就可以对IATHOOK的两个函数进行恢复
编译上面的代码,然后重启虚拟机,加载编译好的驱动运行。
下面就来处理TP调用KdDisableDebugger函数来禁止调试
WinDbg中输入bp KdDisableDebugger
启动DNF登陆器,然后WinDbg断下,
直接修改首行代码 ret 返回即可。
eb 804f8886 0xC3
单步走一下,返回上层函数。
输入g,继续运行,WinDbg再次断下。
查看调用堆栈:TesSafe+0x7124
输入g,继续运行,这时WinDbg输出
Shutdown occurred at (Wed Apr 24 11:59:41.193 2013 (UTC + 8:00))...unloading all symbol tables.
Waiting to reconnect...
看样子好像是重启了? 在切换到虚拟机发现并没有重启。
这个地方经过测试发现如果没有恢复上面的两个IATHOOK,系统就直接死掉了,如果恢复了,虽然windbg输出了上面的信息,但切换到虚拟机之后发现游戏已经到了 输入账号密码 界面。
到了这一步,仍然没完,将虚拟机断下来,再次下bp KdDisableDebugger断点。
发现系统再次断下,因为我们已经在KdDisableDebugger的第一行代码ret了。所以不用担心WinDbg会断开,输入g,再次运行,再次断下。
发现这里应该有一个定时器在不断的调用KdDisableDebugger。
这里怎么处理,直接把call eax nop掉吗,很不幸,哪条代码也有校验,一改就重启了。不过哪个位置不能改,我们可以改别的位置。在这个函数头部b0965112 的位置直接 jmp b0965124 跳过call eax即可。
这样就可以完全的解决了TP的反双机调试。
以前的那篇文章里面提到在登陆游戏过程中还会调用KdDisableDebugger,但我测试之后发现直到进入游戏里面也没有再断下来过。。。
然后,可以去邪恶了。。。。
源码也贴上吧,都是用硬编码写的,自己修改修改就可以了。
过双机调试.rar .
正文:
在论坛搜索了下发现去年的时候有人发过一篇过TesSafe反双机调试的帖子,但是现在已经过时了,并且帖子里面也没提到怎么处理被IAT HOOK的两个函数。在这里呢,我就给大家彻底的讲明白吧。
先开ARK工具看看游戏干了什么。
从图片可以看到游戏启动的时候对ntkrnlmp.exe中的kdcom.KdSendPacket和kdcom.KdReceivePacket两个函数进行了HOOK,通过函数名称就能猜测到函数的用途,一个发包,一个收包,都是com口用来通信的。
怎样恢复这两个函数呢,方面有很多种,列举两个。
1、自己映射内核文件ntkrnlmp.exe,然后通过PE结构遍历ntkrnlmp.exe的导入表,获取导入表中KdSendPacket、 KdReceivePacket两个函数的地址在ntkrnlmp.exe中的偏移,然后利用这个偏移修改系统正常运行的ntkrnlmp.exe导入表 中的两个函数地址。
但是这里还有一个问题就是,导入表中KdReceivePacket这个位置有代码校验,只要被修改就会重启,所以还得绕过代码校验。所以不推荐这种方法。
2、通过图片可以看到被IATHOOK的两个函数被挂钩后的新地址分别为0xB07920E6,0xB07920F6,相差16个字节。既然不想直接去恢 复导入表,那么我们可以在这两个被挂钩后的地址中再跳回正常的KdSendPacket、KdReceivePacket。或许有人又有疑问,这两个挂钩 地址处没有代码校验吗,答案是也有校验,只要修改前面几个字节,同样会重启。但是游戏只检测了前面的几个字节,所以只要在靠后一点的地方修改就不会被检测 到。
修改后
另外一个也是同样处理函数
这样两个被IATHOOK的函数就相当于被恢复了。
但是上面我们是用工具进行恢复的,而TP启动的时候就已经调用了KdDisableDebugger禁止了WinDbg双机调试,这时候就算恢复了上面的两个函数,同样也无法双机调试。
之所以先讲怎样处理上面的两个函数是因为在TP驱动加载的时候首先进行了IATHOOK,然后调用KdDisableDebugger,如果你先处理KdDisableDebugger,而没有恢复上面两个函数的话,系统会直接重启。
因为要赶在TP调用KdDisableDebugger之前恢复IATHOOK,那么就需要设置一个系统回调函数,然后在加载TP驱动的时候进入我们的回 调函数,这时TP已经加载完成,但是还没有开始运行,所以我们可以直接定位到 挂钩地址 处 写入跳转代码到正常的函数。
通过上面的代码就可以对IATHOOK的两个函数进行恢复
编译上面的代码,然后重启虚拟机,加载编译好的驱动运行。
下面就来处理TP调用KdDisableDebugger函数来禁止调试
WinDbg中输入bp KdDisableDebugger
启动DNF登陆器,然后WinDbg断下,
直接修改首行代码 ret 返回即可。
eb 804f8886 0xC3
单步走一下,返回上层函数。
输入g,继续运行,WinDbg再次断下。
查看调用堆栈:TesSafe+0x7124
输入g,继续运行,这时WinDbg输出
Shutdown occurred at (Wed Apr 24 11:59:41.193 2013 (UTC + 8:00))...unloading all symbol tables.
Waiting to reconnect...
看样子好像是重启了? 在切换到虚拟机发现并没有重启。
这个地方经过测试发现如果没有恢复上面的两个IATHOOK,系统就直接死掉了,如果恢复了,虽然windbg输出了上面的信息,但切换到虚拟机之后发现游戏已经到了 输入账号密码 界面。
到了这一步,仍然没完,将虚拟机断下来,再次下bp KdDisableDebugger断点。
发现系统再次断下,因为我们已经在KdDisableDebugger的第一行代码ret了。所以不用担心WinDbg会断开,输入g,再次运行,再次断下。
发现这里应该有一个定时器在不断的调用KdDisableDebugger。
这里怎么处理,直接把call eax nop掉吗,很不幸,哪条代码也有校验,一改就重启了。不过哪个位置不能改,我们可以改别的位置。在这个函数头部b0965112 的位置直接 jmp b0965124 跳过call eax即可。
这样就可以完全的解决了TP的反双机调试。
以前的那篇文章里面提到在登陆游戏过程中还会调用KdDisableDebugger,但我测试之后发现直到进入游戏里面也没有再断下来过。。。
然后,可以去邪恶了。。。。
![狂笑](http://bbs.pediy.com/images/smilies/biggrin.gif)
源码也贴上吧,都是用硬编码写的,自己修改修改就可以了。
过双机调试.rar .