一、概况
《英雄无敌》3,在是魔法门6取得巨大成功,又在《英雄无敌》2大热后,new world computing大力开发并完善的一款益智类策略游戏。最初版本《埃拉西亚的光复》(简称ROE有8个种族,城堡(Castle)、塔楼(Tower)、壁垒(Rampart)、要塞(Fortress)、据点(Stronghold)、地狱(Inferno)、墓园(Necropolis)、地下城(Dungeon),每个族有7个等级的兵种,兵种都有升级模式,加上6种中立兵种,ROE共有118种单位;而资料片《末日之刃》则增加了元素生物和一些中立生物,合计141种。第二个资料片《死亡阴影》(The Shadow of Death,简称SOD),发行于2000年3月31日。因为元素城的不平衡,在SOD中被取消了,不过单位的设计依然存在,此外游戏添加了7章新战役,新的传送门和7种新的特殊地形,以及12个组合宝物,可以说很多人玩大地图就是了收集宝物特别是组合宝物的快感,同时游戏还平衡修正了一些数值,增加了护城河伤害和战役难度选择。至此SOD共有141种兵,与上一个资料片完全相同。
接着,3DO公司又将三部合并成一个完整版(Complete Edition)进行了发行,本次免CD修改就是在该版本上进行的。
二、找到光盘检测子程序
用OD打开程序

自然先去搜索字符串

情况不妙,居然没有搜索到,说明根据没有CD的提示字符串去寻找程序检查光驱的子程序,这条路径是不通的,得另想方法。
这时得祭出WinAPI了,与光驱有关的API,给下图的2个API打上断点

检查一下断点情况,没错,正是所要的

运行程序后,程序被断下

跟进去,来到调用处

此时,我的虚拟光驱是挂载的,所以,看到该API的返回值是eax=5,从注释来看,5正好是DRIVE_CDROM。

接着run to return看看是否出现没有CD的提示以及是那个调用的这个子程序。结果没有提示出现,而来到了调用处。

至此,子程序50C1C0就是要找的光盘检测子程序了。
三、准备工作
由于《英雄无敌》3的一些过场动画,是放在光盘上,通过程序加载时,再把这些资源加载到内存的,因此,程序中对光盘信息的处理远较其它游戏复杂。破解必须解决把程序加载光盘的数据要移植到硬盘上,让程序加载光盘数据时就直接从硬盘加载,如此,破解前要先做点准备工作。
准备工作有两项:
1、 挂载《英雄无敌》3的play盘,把其中的Heroes3目录复制到电脑游戏安装目录里(我为了偷懒,把目录名称Heroes3改成了H3)

2、 用hex编辑软件(如:010Editor)打开游戏程序,来到02D0处,输入如下图所示数值

保存好就可以寻求免CD了。
四、逆向免CD过程
首先要说明一下,修改的一个非常重要的注意事项:修改的子程序一定不是“通用”子程序,即这个子程序只在此处调用,否则是不能修改的,切记!
前面已经找到关键call在004ED9A6处的call 0050C1C0。用X32dbg打开刚刚添加数值的游戏程序,直接在004ED650处下断点,并运行

步入这个子程序。一路向下,在50C293处,遇到了跳转,自然是不能跳的,将其改成不跳。

接着来到50C2AA处,光驱检测后,要是eax为5就是有光驱,但是免CD自然是没有的,eax=1,所以这里的跳转自然也不能让其自由地跳了。

接着在2B4处看到上面的call返回的结果应该是注册表中的游戏光驱信息,这个自然是不能再使用的,要把它改成我们在前面准备的第二个的那个地址,即004002D0,采用“先”直接修改eax(等后面一起考虑如何修改代码)

向下接着看到判断eax值并跳转或者输入值,这里的输入值本来应该跳过的,这样正好拿来修改代码。做法是跳转到下一行,将下一行改为给eax赋值004002D0

改成这样

再向下到2CD这行时,程序又给eax赋给注册表内的值。

因此这里又要修改eax的值。考虑到这里命令码数不够用,所以要三行全部变动。具体:将2D0行提升到2CD处,将2CD和2D3行的5个码合并成赋值命令,改成如下:

这样再一路下来发现这个子程序没有问题了,返回到004ED650中。紧接着在4ED9B0处进入598210这个子程序。在21E和223处,24C和251处,遇到前面同样的事,将提供的地址再次赋给eax,修改如下

接着在5DF处再次遇到赋值注册表值

考虑到后面606处,再次调用局部变量[ebp-10]里的注册表值,因此这里对命令作个大调整,即把我们的地址赋给edi,同时修改[ebp-10]里的值为我们的地址,这样后面再赋值就不是注册表值,而是我们提供的地址了。最后改成如下

至此全部改完。
五、测试
打开游戏,选战役模式

开始动画出现(这个动画原本就是在光盘上的)

让英雄战败导致游戏失败(这个动画原本就也是在光盘上的)

五、下载
游戏光盘镜像下载地址:
https://www.old-games.ru/game/download/1747.html
本次免CD修改后的程序下载地址:
https://wwzd.lanzoup.com/ixJR32ck1vxa