开篇 - 来个低级语言的 MC68000汇编 大航海时代2 全村落 MD ROM的 HACKER
最近心血来潮,看到MD的大航海时代2 ROM,勾起了很多记忆。一直想要周游全世界,仗剑走天涯,看一看世界的繁华,只奈没钱,没时间。
只能回忆当年玩MD大航海时代2的时候的美好时光,因为当年一心想要发现全世界的发现物,但是后来发现是不可能的,开局随机的,一直想要解决这个问题,今天决定HACKER一下这个ROM。
目标:大航海时代2 全村落 探索 MD ROM 静态 HACKER
工具:IDA ,REGEN,MESSUI
要求技术:懂一点摩托罗拉MC68000的汇编
找到ROM,大航海时代2纯中文版原版.smd ROM ,感觉这个比较纯,虽然当年玩的都是日文版,那就以这个开始吧。
接下来咋整? 直接运行ROM? 找初始化代码? 没有思路?
看来要找到初始化村落的内存地址,地址怎么找? EC代码呀,去看看有没有,果然发现了 EC代码,说 5C25=64 ?啥意思呢
就是说把内存地址: 5C25 SET 为64(16进制),那么说干就干
下断点: messui 工具下断点:
wp ff5C25,2,w
查看一下内存的内容:
注意内存查看要加上 ff5c25
注意看内存:
ff5c15 都FFFF 的,大胆猜测: ff5c1E 为村落内存开始数据: ff5c1E
刚才运行系统运行到2个断点:
先放过,ROM开始初始化,再次查看内存
经过N次测试,花了N多的时间,发现
00A8 010E 000A 8400, 这组数据 一个村落的显示,第一村落应该是英国的石蹲,00A8 010E应该为经纬度,具体算法没有去跟踪,8400 这组数据
8表示无法发现,6表示已经发现,0表示可以发现。
那么再次下断点:
wp ff5C24,1,w
进行写入下断点,终于跟踪来的关键代码位置,(当然,这个里面花了N多时间),数据初始化是人物在选择确定后,进行是否能否的初始化工作的。等下贴反汇编代码
定位到关键代码,用IDA工具:
第一行 A2就是我们断点锁定的位置,直接初始化设计为 8X,刚才说过 8表示是无法探索到的,
后面二行是进行循环初始化,一共是 98个村落,
然后产生随机数据,选择 50个村落设置为可以探索到。
修改思路:
思路1、直接把初始化村落设置为98个,测试发现死循环。 应该是随机数设定的问题,可以修改指令跳过。 感觉比较麻烦。
思路2、 能否直接初始化的时候设置为全部可以探索,再随机设置5个保留(可能有国王寻宝的任务)。这个思路应该修改的代码比较少。
我这里采用思路2方式:
ori.b #$80,6(a2) 修改为 andi #$0,(a2) ,
cmpi.b #$32,d2 ; '2'
32修改为5,下面还有跳转的验证,可以跟踪指令一一去掉,如果遇到死循环,可以单步调试。
修改指令工具可以用:
直接用16进制修改指令, 另外
这2出也要注意处理一下。 可能存在跳转问题。
好,hacker 基本结束。CRS修正不要忘了。
另。我放上我的修改后的ROM:
来源:https://www.cnblogs.com/nanhuyun/p/11168691.html