您当前的位置: 首页 > 快讯 >

世界看点:红色警戒2逆向系列:COM服务器

2023-04-07 01:52:34 来源:哔哩哔哩

上一篇我们在入口函数中发现了主要逻辑,这一篇我们会继续分析主要逻辑

因为反汇编出来的代码有两百多行,全部放出来大家观感可能不好,所以我不会全部贴出来。大家感兴趣的话可以用Ghidra逆向出来看


(相关资料图)

首先,一个有意思的代码是

这是一个空函数。所以为什么需要一个空函数呢?放一个空函数很可能是用于输出一些调试信息,实际上从这里就能发现西木的开发人员很懒,在开发完成之后有限的删除了调试信息。这对我们逆向人员是一个好消息。

如果大家按顺序接着看,会看见该程序创建了一个互斥体,并且初始化了窗口,这些没有什么重要意义,我们直接跳过。

接下来我们可以看见,程序读取了RA2MD.ini;并且设置了视频缓存和窗体大小。

如果不仔细看,可能会漏掉这行代码

但是这段代码是有意义的,它里面进行了COM服务器的注册和初始化,从这里我们也可以看见,从原版到尤里的复仇,除了功能多了,代码的结构也进行了优化,至少原版的COM服务器初始化代码是直接写在主逻辑函数里的,导致该函数有1000多行

言归正传,该函数有600多行,如果大家想看的话,我可以贴出来放到网盘里,直接写在这里太长了。COM服务器是一种进程间通信的方式,是DLL和主程序连接的一种标准化的办法。所以,我们可以直接看红色警戒2用了哪些DLL

其中Ares大家都懂,BinwK是一种视频播放器,可能是用于播放每个关卡前的动画的。不知道大家玩红警的时候是不是看到过这个动画。实际上早期因为网络速度限制,很多红警是没有开场动画的,这个动画里面有很多关于剧情的设定,所以大家可以去看看。

Blowfish是一种加密的算法,而EDRAW我们不知道是做什么用的,但是从名字来看,可能提供了某些图形处理或者绘图用的DLL。

接下来的程序中大量出现了这段代码。这里我们可以发现CoRegisterClassObject实际上是一个注册COM组件的方法,而如果要连接到COM服务器观察它做了什么,需要用到CLSID,也就是这里的IID。要知道这里的DAT_007e9520值,我们可以通过断点和调试来寻找。

于是掏出我们的GDB

然后大家就高兴的发现,游戏卡死了

这很有可能是因为游戏采用了反调试机制,当发现有程序挂载的时候,会故意制造混乱的逻辑,让逆向工程师不能获得任何有用的信息。

当然,这不代表我们就不能调试了,我们要做的是反反调试;不过我们首先需要在反编译的代码中寻找到它是如何反调试的。不得不说,西木工作室这一招还是非常成功的,成功给我们添加了巨大的工作量。这是一场跨越20年的对弈了。

如何反反调试可能要下一篇文章才能讲了,原因是我尚未发现反调试的检测点。我查看了符号表,KERNEL32的反调试函数中

IsDebuggerPresent:用于检查当前进程是否被调试器附加。

CheckRemoteDebuggerPresent:用于检查指定进程是否被调试器附加。

DebugActiveProcess:用于将当前进程附加到指定进程的调试器中。

DebugActiveProcessStop:用于将当前进程从指定进程的调试器中分离。

WaitForDebugEvent:用于等待调试事件的发生。

都没有发现,所以可能没有使用这些方法,也可能是手动调用了相关的方法,但是更有可能是自己实现了反调试相关的技术。这个程序还使用了大量的动态调用方法,反正是很难的一件事情,这篇文章我们不可能能够写完。

为了防止大家说我太水。这里再加一点对于之前提到的强AI的思考。

虽然我们之前说吊打淋巴的时候口嗨很爽,但是真的在开发的时候,其实是很困难的。纵观AI薄杀人类的历史(DeepMind罪魁祸首)。强化学习技术一直都是被经常用到的。RTS游戏是一个高度复杂性和不确定性的环境,如果仅通过强化学习让其收敛是不可能的。因此,我认为首先需要一些启发性的算法。很多人觉得神经网络是一个可行的办法,实际上,我们能够获得的数据不多于3000局,而且很多都需要从视频中推算战场的数据,一是数据量太少,二是数据质量不高。

这个时候我们可以查看一些非常厉害的玩RTS游戏的AI,Overmind和AlphaStar是DeepMind公司开发的两款玩《星际争霸II》的人工智能程序。其中AlphaStar的启发式训练用到了10万局的的对局数据。之后才采用了自我对弈进行训练。很显然,红色警戒2的战场数据记录接口都没有被发掘出来,很有可能本专栏是第一个发现这个接口的文章,因此学习AlphaStar是不成立的。Overmind采用了一些手动或者AI生成的自动策略,并且采用CNN来进行游戏中的操作。这个是可行的,因为我们也可以手动设置一些策略。不过Overmind并没有这么强大,很有可能被淋巴吊打。

ChatGPT觉得在设计这种AI程序的时候,需要考虑到几点:

资源管理:实时战略游戏通常需要管理多种资源,如矿物质、气体、人口等。AI需要学会有效地采集和分配资源以支持其战略目标。

技能管理:游戏中的单位通常具有特殊技能和能力,如治疗、伤害、隐身等。AI需要学会合理使用这些技能来达到战略目标。

单位控制:实时战略游戏中通常需要控制多个单位进行战斗,包括攻击、移动、保护等等。AI需要学会高效地控制这些单位来执行其战略。

战术选择:游戏中通常有多种战术选择,如进攻、防御、围攻等。AI需要学会根据局势选择最佳的战术。

对手建模:为了制定最佳的战略和战术,AI需要学会建立对手的模型,包括其行为和策略。这需要对对手的数据进行分析,例如其单位组成、资源分配等等。

这只是一点非常初级的思考,并且我也并不懂人工智能。希望大家能够和我一起讨论

下集预告:GDB反反调试,追踪DebugLogger()

(PS 接下来一篇发布的时间不确定,取决于西木工作室做了哪些反调试工作)

标签:
x 广告
x 广告

Copyright ©  2015-2022 太平洋科学网版权所有  备案号:豫ICP备2022016495号-17   联系邮箱:93 96 74 66 9@qq.com