我从美国回来的时候带回来一个小小的Retro machine,花了9美元,包含了150个FC红白机游戏。可惜那个里面的游戏太烂了,只有几个游戏才是我以前玩过比较经典的游戏,比如网球,坦克之类等,而且因为版权问题,这些游戏都被改的面目全无,完全没有玩游戏的快感。据我所知现在的FC掌机大部分都是模拟器加载nes文件吗,于是我想能不能破解,或者改造这个游戏机,安装一些我熟悉的经典游戏进去。
拆一看,牛屎CPU芯片加一个WinBord 的25Q64C存储器。毫无疑问,游戏都被保存在了这个WinBorad的存储芯片里面了。
这个25Q64CVIG芯片是底部封装的那种,你看的八个脚都是板上的,芯片本身根本没有脚,不好焊锡。于是网上购买了可以替换的W25Q64FVSSIG。
用风枪吹下芯片后,放到编程器里面可以将芯片里面的存储信息读取出来,生成了一个8M的大文件。可是我根本就不知道这个文件的格式是怎么样的,我如何去dump呢? 前面我提到它还是有几个经典游戏可以玩的,比如网球之类的,于是我想到利用二进制的文件查找后和原游戏进行对比的方法。
第一,我先通过玩游戏的方式尽可能的找到已知的经典游戏(由于版权问题,这些游戏都被修改过)
第二,我从网上下载原始游戏,记下原始文件开始头的二进制编码,然后到8M大文件中搜索。
比如:打开原始网球游戏,第一行是NES的格式标记,忽略。 我们从第二行取D878AD022010FBA2008E0020 在芯片8M大文件中搜索。
第三,用模拟器找到该游戏的Mapper类型,然后计算出游戏的容量大小。如下图,网球游戏是Mapper0的,这种游戏最简单,两个ROM,程序库和图形库。PRG ROM是16KB,我们计算一下16*1024=16384, 在转换为16进制就是4000。
我们查看原始游戏文件4000h + 16 的位置就是 CHR ROM的起始位置了。
如上图所示,CHR ROM的起始字节为:3868546C546C3C0C
第四,以网球游戏为例,我们在8M文件中很快就能找到第二步的PRG 开始的二进制标记,记下开始的位置为:458000h(十六进制) 那么再往后推16Kb 就是该游戏的程序部分。但是我很快发现紧接着这个16Kb后面的却和第三步中找到 CHR 二进制不一样。所以我大胆推测,在这个8M的大文件中,所有游戏的 PRG部分和CHR部分是独立存储的。 于是我又搜索了CHR ROM的起始字节,果然保存在另外一个地址:752000h(十六进制)。利用winhex的复制功能,将16Kb和8Kb的内容从刚才所搜索的起始位置处保存下来,并拼接为一个二进制文件,然后加上NES文件格式头。运行这个游戏,看看效果:
你没有看错,这个是改版后的网球游戏,也说明我们成功的8M文件中dump出了这个游戏。
第五,通过同样类似的操作,我找到以下游戏:
通过记录了这些游戏的PRG地址,和CHR地址,我发现了一些规律:(1)都是Mapper0 的游戏。(2)很多连在一起的游戏,程序部分刚好相差16K,CHR相差8K。
很显然,我们只要写一个程序,根据已经有的地址,每次dump 16K的PRG 和 8K的CHR,然后再加上一个NES头,就可以dump出所有的nes文件了呢。这个程序很好写,无非就是进制转换和二进制拼接保存。我很快写了一个程序,并尝试dump出所有游戏:
经过验证大概有100多个可以正常运行。够了够了。
第六,既然我们知道了这些游戏的地址,那么我们同样可以将我们自己喜欢的Mapper 为0的 游戏替换回去。同样写个程序,替换一下也是很容易的。唯一的缺点就是这个游戏机只支持mapper 为0的16KB的游戏。很多好游戏都是Mappe3或者Mapper4 的,那就没有办法在这个游戏机中运行了。替换好后,用编程器写进我新买的芯片上去,用风枪吹上去,打开测试,和我们想象的一样,新游戏可以完美运行。
本文主要是提供了破解的思路,在茫茫的二进制大海中仍然是有规律可循的。同理,可以买些淘宝上的掌机,通过类似的方法也是可以破解的,而且很多掌机还支持更多Mapper型号。