【游戏逆向】浅谈某平台调试软件检测分析

在调试这个平台的CS过程中,我们用CE对任意一个地址下断点会导致游戏的闪退。
【游戏逆向】浅谈某平台调试软件检测分析_第1张图片
首先我们第一时间想到的是游戏对有关下断的API进行了HOOK,于是用PChunte工具查看后发现有110个钩子
【游戏逆向】浅谈某平台调试软件检测分析_第2张图片
在其中我们可以看到DbgUiRemoteBreakin这个函数被挂钩了,DbgUiRemoteBreakin这个函数内部会调用DbgBreakPoint执行断点指令,以触发断点异常,强制把程序断了下来。
我们用CE查看这个函数的头部,发现他跳转到了游戏检测模块的地址在这里插入图片描述
在这里插入图片描述
来到这个后我们发现他调用了ExitProcess就退出了进程。
我们尝试恢复这个钩子。恢复后发现游戏立即退出了,那么说明肯定有线程在检测这个钩子,我们一恢复就被检测到了,并且检测的周期很短。
通过枚举法挨个结束检测模块的线程,最后发现在这里插入图片描述
结束掉这个线程后再恢复钩子游戏就不会闪退,但是一段时间后就出现如下信息框。【游戏逆向】浅谈某平台调试软件检测分析_第3张图片
这样一来简单的结束线程这个方法就行不通了,那么思考下有没有别的方法能够绕过检测,由于这个游戏的他HOOK了很多API,而这些API的地址都是不连续的,他要检测其中的一个地址,不可能每次检测都获取一下,所以这些挂钩的地址很可能保存在某个全局变量中,基于这点我们尝试搜索DbgUiRemoteBreakin的地址,搜索到了一个地址在这里插入图片描述
我们找个空白地址,因为他只修改了函数头部的前7个字节,所以检测时也应该是检测这个7个字节,我们把他修改后的这个7个字节写入空白地址,然后将我们搜索到的地址的值替换成空白地址。在这里插入图片描述
这时候再恢复钩子游戏就不会闪退了,因为我们已经让他检测了我们伪造的地址。
其实绕过调试检测的方法还有很多,由于它开始必须要获取这个函数的地址,我们可以HOOK获取函数地址的相关API,返回0或者返回一个伪造的地址。
针对这个游戏而言,最后调用ExitProcess函数退出进程,但是他并没有这个函数进行检测,我们也可以HOOK ExitProces 恢复下堆栈和原函数头部的几个字节在跳回原函数从而绕过检测。

你可能感兴趣的:(文章,游戏)