红色警戒2逆向系列:使用ScyllaHide反反调试
所以这一期我研究了好久,最后想出了一个可能是办法的办法,记录一下,也请大佬指教,因为网上关于这个的内容实在是有点少
所以我本来是这么想的,通过找到检测调试器的代码,然后把这些代码给Hook了。但是这样显然就会遇到一个问题。那就是首先需要静态分析找到反调试的代码。这样的工作量巨大,而且有一些动态调用涉及到大量的指针操作,要找到指针的指向又需要用调试器,但是反调试机制又不让我们调试,所以是一个非常棘手的问题。
方案二就是使用虚拟机,但是我不喜欢这个方案,因为我的电脑比较差(一个后端开发人员的电脑居然很差)。所以我也没有这么做
所以我想选择一些反反调试器。所以我就选择了ScyllaHide来反反调试。从GitHub上下载了ScyllaHide的插件,然后又把它装到了x32GDB上,然后点击plugin -> ScyllaHide -> AttachProcess中,然后把PID填写进去,大概就是这样:

选择attach,这个时候再进入游戏,发现并没有卡死,成功绕开了反调试机制。
由此我还想出来一个赖皮的招数,就是在快被对手打死的时候,使用GDB调试一下,然后就会触发反调试,我和对手就会卡死,然后等个1个小时对手退了,再退出GDB,恢复游戏(开玩笑的,好孩子不要学)
之前用的一直是Ghidra,所以可以给大家看C语言代码。虽然这个C语言代码质量不高,但是大家都喜闻乐见。不过换到x32GDB的时候就要看汇编语言代码了,请大家做好心理准备(大概)
接下来我们就要分析debugLogger函数了,有一个问题就是战网版本的红警删除了所有的调试信息。我在上一篇还吐槽了西木工作室的开发人员懒,没想到他们在尤里的复仇版本把调试信息删除了。不过原版和尤复几乎完全一样,所以我们可以通过学习原版的结构来推算尤里的复仇版本。
通过点进DebugLogger函数然后寻找调用该函数的函数(也就是点function call trees,然后看ingoing call),我们可以发现一些有意思的代码,比方说读取各种ini文件的,像
之类的,也许Ares的作者当年也看到了这些,所以开发出了Ares。
DebugLogger还提示了很多关于网络的信息,这些信息我们在之后的文章里会仔细分析,这对我们开发更多人的模式可能有帮助
下集预告:我也不知道下集要写啥,可能是通过spy++和x32GDB查看点击某个位置造成的逻辑变化,从而定位一些重要的函数,方便我们之后Hook