第85章 Millenium游戏的存档文件

“Millenium Return to Earth”是一款古老的DOS游戏(1991年问世)。玩家可在游戏中挖矿、修建战舰、在其他星球上作战,等等。有兴趣的读者可以体验一下它:http://thehouseofgames.org/index.php?t=10&id=110

和其他的游戏程序一样,这个游戏也有游戏存档的功能。现在我们来分析一下它的存档文件。

游戏中有“矿”的概念。挖矿的速度因星球而异,在某些星球上快些,而在另一些星球上慢些。另外,在游戏的设定中,矿产的种类也有差异化的设定。在图85.1中,您可看到游戏存盘时的挖矿进度。

..\tu\8501.tif

图85.1 Mine:状态1

我保存了这一时刻的游戏状态。存盘文件总计9538字节。

然后,我又在游戏里挖了几“天”的矿。挖矿进度如图85.2所示。

..\tu\8502.tif

图85.2 Mine:状态2

此时我再次保存了游戏状态。

现在,我们使用DOS/Windows的FC程序来比较两个存档文件的差别:

...> FC /b 2200save.i.v1 2200SAVE.I.V2
Comparing files 2200save.i.v1 and 2200SAVE.I.V2
00000016: 0D 04
00000017: 03 04
0000001C: 1F 1E
00000146: 27 3B
00000BDA: 0E 16
00000BDC: 66 9B
00000BDE: 0E 16
00000BE0: 0E 16
00000BE6: DB 4C
00000BE7: 00 01
00000BE8: 99 E8
00000BEC: A1 F3
00000BEE: 83 C7
00000BFB: A8 28
00000BFD: 98 18
00000BFF: A8 28
00000C01: A8 28
00000C07: D8 58
00000C09: E4 A4
00000C0D: 38 B8
00000C0F: E8 68
...

上述内容是比对结果的部分内容。两个文件的不同之处还有很多,但是其余内容不如这些信息那样富有代表性。

在第一次存盘时,我持有14个单位的hydrogen和102个单位的oxygen。在第二次存盘时,相应的持有量变为22和155个单位。如果程序把这两个值存储在存档文件中,那么我们应当可以在存档里找到它。实际情况正是如此。在存档文件的0xBDA处,第一个存档文件的值为0x0E(14),在第二个存档文件的值为0x16(22)。地址0xBDA存储的应当是hygrogen的量。然后,在文件的0xBDC处,两个值分别为0x66(102)和0x9B(155)。地址0xBDC存储的应当是oxygen的值。

您可以自己把玩一下这个游戏,分析存档文件的具体格式。您还可以下载我用的游戏存档:http:// beginners.re/examples/millennium_DOS_game/

使用Hiew打开第二次存档的存档文件,可以看到有关矿石的持有量。如图85.3所示。

..\tu\8503.tif

图85.3 Hiew:状态1

这个值无疑是16位数值:在DOS时代的16位软件程序里,int型数据就是16位数据,这并不意外。

验证一下我们的推测是否正确。把这个地址的值(hydrogen)改为1234(0x4D2),如图85.4所示。

..\tu\8504.tif

图85.4 Hiew:把数值修改为1234(0x04D2)

然后打开游戏、加载存档中的进度,看看矿产持有量。如图85.5所示。

..\tu\8505.tif

图85.5 Let’s check for hydrogen value

以上信息表明,我们的推测是正确的。

为了快速通关,我们把所有矿产的持有量都改成最大值,如图85.6所示。

..\tu\8506.tif

图85.6 Hiew:把各项都修改为最大值

0xFFFF是65535。改动之后,我们就是资源大亨了。如图85.7所示。

..\tu\8507.tif

图85.7 所有资源都变为65535

在进行了几个游戏日的奋斗之后——哎?部分资源变少了。如图85.8所示。

..\tu\8508.tif

图85.8 Resource variables overflow

这就发生了数值溢出。游戏开发人员可能没有想到玩家会持有这么多的矿产,所以未做溢出检测。但是挖矿就会增加矿产,超过数据最大值之后、数据溢出了。这样看来,要是我当初没那么贪心就好了,或许吧。

这款游戏的存档文件里还有很多数值,本文不再一一分析。

这属于一种简单的游戏作弊方法。只要玩家略微改动一下存档文件,他们就可以获得很高的游戏分值。

本书63.4节详细介绍了各种文件及内存快照的比较方法。