RA2/YR原版CD反盗版验证原理简介"

admin 2026-10-22 15:02:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

RA2/YR原版CD反盗版验证原理简介

原创

吾爱pojie
吾爱pojie

吾爱破解论坛

2026年10月16日 08:11
北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

作者论坛账号:伤心的笔

本来应该是一年前找个时间整理出来的,懒癌发作,拖到 CnCNet YR切换到了Ares+Phobos,拖到了 AI 逆向几乎成熟的时间点了。还是发出来吧,或许对想了解一点原理的人有点用。

一、问题背景

CnCNet YR 在设计上是需要兼容(官方的表述是:只考虑)正版用户的。CnCNet YR 有一个战役启动需求,在 CnCNet YR 切换到 Ares + Phobos 之前,此时唯一的办法就是把原游戏进程启动起来。我们知道,一共有四种正版红警2:原版CD、命令与征服十周年、EA Origin、Steam。前三者都可以通过直接运行ra2.exe/ra2md.exe这两个launcher启动游戏,而Steam版采用了蹩脚的Steam stub,要想做到无论Steam是否启动,都能稳定地启动游戏,需要运行 game.exe/gamemd.exe启动游戏,而非Steam版的game.exe/gamemd.exe是没有做这项修改的,直接运行game.exe/gamemd.exe进程会立刻退出。那么,如何让客户端准确判断要调用哪个exe呢?CnCNet YR之前的做法是直接比较已知版本的文件大小和SHA1哈希值,这显然不是个好做法。一个更好的做法是,搞懂launcher到底做了什么操作,然后将launcher的关键逻辑重新实现,做到在不patch 原版CD的game.exe/gamemd.exe的前提下,依然能够成功启动所有四种正版游戏(顺便兼容盗版)。这里面,兼容原版CD的难度是最大的。

二、原版游戏的反盗版逻辑

其实这部分内容属于二十多年前的人就已经搞明白的事情,至少最初做盗版的MYTH大神是肯定搞懂了的。但是,时间久远,资料也很难找了。好在,此时是2025年,我们从头再做一遍也不费事。

我相信对文件有洁癖的人来说,可能思考过下面的问题:

  • gamemd.exe和YURI.exe区别是什么?我应该用哪一个?
  • 00000409.016和00000409.256是两个图像文件,被用在了哪里?可以删除吗?尤其是考虑到,只安装RA2时,对应图像是RA2图像,而安装 YR 后这两个文件就直接替换成了 YR 图像,原本的RA2图像则不再出现。
  • drvmgt.dll 和 secdrv.sys 是做什么的?是否能直接删除?
  • Conquer.dat和ConquerMD.dat这两个二进制文件的内容是什么意思?为什么删除后就打不开游戏了?
  • RA2.lcf、ra2md.lcf、yuri.lcf文件是做什么的?
  • 注册表里红警2的Serial那一串数字代表了什么?是随机生成的吗?

这里,我们从简单到困难开始,一步步解释。

2.1 SafeDisc反盗版方案

与之相关的资源:Ra2.exe、YURI.exe、drvmgt.dll、secdrv.sys、00000409.016、00000409.256。

我们先看两张截图:


图:有00000409.016、00000409.256的情况下,运行Ra2.exe/YURI.exe时的启动横幅界面。

图:无00000409.016、00000409.256的情况下,运行Ra2.exe/YURI.exe时不显示启动横幅。

很好理解。Ra2.exe/YURI.exe是带有SafeDisc保护的,而drvmgt.dll、secdrv.sys是SafeDisc相关的库文件。程序会首先把启动横幅显示出来,趁这个时间检测你是否插入了正版游戏CD,如果成立,那么执行真正的launcher逻辑,否则,弹出如图所示的对话框,不允许你启动游戏——是的,如果你是一个正版CD玩家,除非你硬要卡timing把光盘弹出来,否则你是看不到如下所示的界面的。

图:惊不惊喜,意不意外?游戏内的光盘检查理论上只是个备用手段,SafeDisc应该先于游戏本身把没有插入CD的玩家拦下来的。

不知道出于何种目的,Westwood 在发布YR时,将未加SafeDisc壳的ra2md.exe包含在了游戏中。ra2md.exe和YURI.exe的关系是,YURI.exe给ra2md.exe套了一层SafeDisc,从玩家观感上来说,YURI.exe多了个启动横幅和CD检查。

而Ra2.exe则是套了SafeDisc的,Westwood 并没有提供未套壳的版本。讽刺的是,因为盗版游戏一定会把Ra2.exe脱壳,将其从800多KB精简到了100 KB左右,而YURI.exe要么没有脱壳要么脱壳了但没有做大小精简,导致现在的杀毒软件会放过原版CD的YURI.exe,但不会放过Ra2.exe。

图:杀毒软件会把原版Ra2.exe当作病毒处理

脱壳可以使用UnSafeDisc + Safedisc2Cleaner实现。在如今的Windows 10/11系统上,可以使用这个修改版:https://github.com/nckstwrt/SafeDiscLoader/tree/4d1dc33e6e63a4ddca77bbcfa44a7ff98180e064/UnSafeDisc%20and%20SafeDisc2Cleaner

2.2 launcher 和游戏主进程的第一部分交互逻辑——加锁

这部分逻辑是大家比较容易意识到的。通过反汇编 ra2md.exe (或脱壳后的Ra2.exe、YURI.exe,下面就用 ra2md.exe 叙述了),我们容易知道,程序会创建一个 id 是 \"48BC11BD-C4D7-466b-8A31-C6ABBAD47B3E\" 的 Mutex,然后创建一个 id 是 \"D6E7FC97-64F9-4d28-B52C-754EDF721C6F\" 的 Event,随后立即启动 gamemd.exe。gamemd.exe 看到 Mutex 后才会继续启动游戏,同时给对应的 Event 发送一个信号,告诉 launcher 启动结果。否则,gamemd.exe 会立刻退出。Steam 版 game(md).exe 之所以可以直接双击启动,就是因为把这部分逻辑跳过了——没办法,EA也没有源代码了,正版也要按盗版的办法来做。

因此,我看到其他人的 launcher 实现中,或多或少也实现了这部分逻辑,成功达到了启动 game(md).exe的目的。然而,这样的 launcher 只能搭配破解后的 game(md).exe。如果你用的是未破解的 game(md).exe,你会体会到遭遇战开始后一段时间,你的部队自爆。

2.3 launcher 和游戏主进程的第二部分交互逻辑——“自爆补丁”

与之相关的资源:Conquer.dat、ConquerMD.dat、注册表、硬盘分区序列号。

红警2、将军中都存在这个机制。在 game(md).exe 中,自爆相关的判断是一定要重写的,这是几乎所有免CD——无论是盗版、Phobos还是十周年/Origin/Steam正版都要做的事情。但是,别忘了我们的目的是给CnCNet YR提供launcher解决方案,必须要兼容正版CD玩家,这部分玩家的game(md).exe是没有patch过的,相关的自爆逻辑存在,launcher必须要提供正确的值。那么,正版CD是怎么做的呢?
这里,我们要用到2025年初时,逻辑推理能力较强、还没有大幅限制思考深度的 AI——Grok,去逆向一下ra2md.exe。当时的Grok,在思考密码学问题方面还能做到毫不吝啬,用了整整七分钟的时间,对IDA的Hex rays逆向结果给出了准确判断——ra2md.exe里存在一份Blowfish算法实现。没错,没有调用Blowfish.dll,又实现了一份。

这里的协议是:

(1) launcher从注册表中读取红警2的InstallPath、Serial,从注册表中读取Windows系统的ProductID。取InstallPath所在盘符的文件系统序列号。将这些信息按字符串进行拼接,作为Blowfish解密的密钥。

(2) launcher读取Conquer(md).dat文件,作为Blowfish的密文。

(3) launcher 用第一步中的密钥,解密密文。把解密后的字符串通过 CreateFileMapping传递给 game(md).exe。
(4) game.exe 判断字符串是否等于 \"(c) 2000 Electronic Arts, Inc. All Rights Reserved\",gamemd.exe 判断字符串是否等于 \"UIDATA,3DDATA,MAPS\0\",注意此处有个0号字符,这个字符不是字符串终止符的意思。

因此,我们可以在launcher中实现相同的逻辑,以支持正版CD启动。我们也可以让launcher跳过解密阶段,直接向game(md).exe提供正确的字符串,同样可以避免自爆。
如此,我们成功实现了对正版CD玩家的兼容。因为这些玩家的game(md).exe是未破解过的,他们对战时仍然需要确保光驱内有正版CD,但我们的launcher终于可以保证游戏正常启动且不自爆了。

这里我给出逆向出来的launcher逻辑的C#版本,可读性比较高:

https://github.com/SadPencil/Ra2md-Launcher-CSharp/blob/master/Ra2MdLauncherCSharp/Program.cs

三、重新回答开头的问题

- gamemd.exe和YURI.exe区别是什么?我应该用哪一个?

答:YURI.exe 是加了SafeDisc壳的gamemd.exe。建议重新脱壳Ra2.exe和YURI.exe,你也可以把YURI.exe删掉。

- 00000409.016和00000409.256是两个图像文件,被用在了哪里?可以删除吗?尤其是考虑到,只安装RA2时,对应图像是RA2图像,而安装 YR 后这两个文件就直接替换成了 YR 图像,原本的RA2图像则不再出现。

答:应该删除。只有SafeDisc才会用到这两个文件。

- drvmgt.dll 和 secdrv.sys 是做什么的?是否能直接删除?

答:应该删除。只有SafeDisc才会用到这两个文件。

  • Conquer.dat和ConquerMD.dat这两个二进制文件的内容是什么意思?为什么删除后就打不开游戏了?

答:这两个文件是游戏自爆判断字符串经Blowfish加密后的密文。针对常见的patch后的game(md).exe,你可以将文件内容用0全部填充,或者填充任意你想要的数据。如果你想删掉这两个dat文件,要么换掉launcher,要么你对launcher做patch,让launcher不读这两个dat文件,直接向game(md).exe报告正确的字符串。

- RA2.lcf、ra2md.lcf、yuri.lcf文件是做什么的?

答:launcher 本身的程序逻辑会去取同名的lcf文件以读取相关配置信息。如果你用了C# 重写的这个launcher,这几个文件是不需要的,否则请保留。

- 注册表里红警2的Serial那一串数字代表了什么?是随机生成的吗?

答:这是Blowfish加密的密钥的一部分,是CD安装程序随机生成的。如果你是正版CD的受害者,请不要修改Serial、移动红警2到其他分区、格式化红警2所在分区,否则需要重新从CD安装一次红警2。当然,我也不觉得依然使用未破解的game(md).exe有什么价值,你还要插CD。CnCNet YR兼容这种情况是因为必须要兼容所有正版玩家,玩家自己就不要折磨自己了。

- 我了解原理了。是否有可能写出一个新版算号器,使得在不改变Conquer(md).dat内容的情况下,计算出正确的Serial?

答:不能。我们可以根据Serial等信息重新生成Conquer(md).dat文件,以通过未patch过的正版game(md).exe的自爆验证,但反过来不行——这叫已知明文攻击,其难度是巨大的。如果你做出来了,凭相关论文当个教授应该问题不大。

*-官方论坛*

www.52pojie.cn

👆👆👆

公众号设置“星标”,您不会错过新的消息通知

如开放注册、精华文章和周边活动等公告

天融信超融合:已位列市场第二" 网络安全文章

天融信超融合:已位列市场第二"

天融信超融合管理系统以14.5%市场份额位列中国超融合市场第二,2026上半年业务同比增长89.7%远超行业平均增速。产品聚焦政府、制造、教育和医疗四大行业,核心能力为融算一体架构支持向智算云平滑演进,以及安全内生一体化实现基础防护与计算资源同构。文章为产品宣传性质,强调市场地位与行业落地实践。
RA2/YR原版CD反盗版验证原理简介" 网络安全文章

RA2/YR原版CD反盗版验证原理简介"

本文深入解析红警2原版CD反盗版验证机制,涵盖SafeDisc保护、launcher与游戏进程的加锁及自爆补丁交互逻辑,以及Blowfish加密在游戏验证中的应用。文章详细回答了游戏文件用途疑问,并提供C#重写launcher的可行方案,对理解老游戏反盗版机制具有较高参考价值。
评论:0   参与:  0