【续】《英雄无敌》3完整版complete(英文)——免CD修改(完美版)
一、前言
在前一篇文章中,介绍了《英雄无敌》3的complete(英文)版的免CD制作,但那是一副仓促之作,破解得很粗糙,留下了很大的不足!
https://www.cnblogs.com/dark-f/p/18393445
由于《英雄无敌》3的一些过场动画,是放在光盘上,通过程序加载时,再把这些资源加载到内存的,因此,程序中对光盘信息的处理远较其它游戏复杂,而前文对程序调式不足,只是仓促绕过光驱检测,而在光驱上的资源也因此完全舍弃,自然程序中就缺少了一些动画资源,导致那次的免CD留下了不小的遗憾!而我又是一个强迫症者,这种不“完美”总是如鲠在喉,于是便有了这次完美版免CD。
二、准备工作
准备工作有两项:
1、 挂载《英雄无敌》3的play盘,把其中的Heroes3目录复制到电脑游戏安装目录里(我为了偷懒,把目录名称Heroes3改成了H3)
2、 用hex编辑软件(如:010Editor)打开游戏程序,来到02D0处,输入如下图所示数值
保存好就可以逆向了。
三、逆向修改过程
首先要说明一下,修改的一个非常重要的注意事项:修改的子程序一定不是“通用”子程序,即这个子程序只在此处调用,否则是不能修改的,切记!
在前文中已经找到了加载光驱的子程序了,即004ED650,关键call在004ED9A6处的call 0050C1C0。用X32dbg打开刚刚添加数值的游戏程序,直接在004ED650处下断点,并运行(前文已经把这个call修改成了mov eax,7了,把它还原成call 0050C1C0)
步入这个子程序。一路向下,在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://wwzd.lanzoup.com/ixJR32ck1vxa
foreigner download
https://drive.google.com/file/d/1xRy-qBxCDw6aU3uH0xMksNo0MQUJdfsX/view?usp=drive_link