有多少游戏陪伴你度过了一个美好的童年?对于生活在前互联网时代的人来说,单机游戏往往伴随着许多珍贵的回忆。所以在今天的互联网上,你会看到还有很多人沉迷于一些“古老”的游戏,今天我们要介绍的这篇非常有趣的文章,就是一个粉丝利用了自己的逆向工程知识,来让老游戏重获新生的故事。
首先声明一下,就算是编辑部可能也觉得有点不可思议,这个叫做《特技岛》(Stunt Island)的模拟飞行游戏是1992年发行的一个DOS游戏,可是今天在steam上竟然还敢卖42块钱的价格??!!要知道宇宙级的《微软飞行模拟2024》现在标准版售卖价格也就是498港币。而且你看看下面这个巨粗糙的图像质量,是梁静茹给了开发者勇气?(哦不对,这个游戏是Disney代理的,懂了)
反正我们的博客文章作者就是这么一个爱好者,还专门写了一篇文章《一首挽歌送给特技岛》去介绍怎么缅怀这个图像质量粗糙得可怕的游戏:
https://fe9aefb4.annali-af6.pages.dev/2024/11/15/stunt-island-elegy
不过真爱确实是人类最强的动力之一,作者虽然在《挽歌》里面表达了希望能够有高清重制版的愿望,但可能是实在受不了也等不了了,终于决定自己动手来拯救它。于是就有了今天的文章——800% Detail: Tweaking Stunt Island’s 30-year-old 3D Engine:
简单总结一下,作者拿出了逆向工程神技,把下图改造成了下下图的质量(注意下下图的远景细节):
好,接下来进入技术解读,作者首先觉得自己只要拿出反编译器就搞定了,于是拿出来Ghidra就有
一看,代码分析结果很糟糕,然后查了一下,发现中了packer,还是程序员之神Fabrice Bellard写的一个LZ91 Packer,当然也有对应的脱壳器UNLZEXE,之后Ghidra就可以做一些事情了:
不过很搞笑的是,作者现在看不懂了,看来静态逆向能力还得练。
于是作者祭出来了动态调试大法,或者说游戏修改器大法:DosBox的调试功能启动!
这边作者展示出了很多技巧性的调试能力,比如怎么去设置断点,这个还是很考验对系统的理解的,建议大家去仔细阅读。核心在于想办法能够让游戏在“调整图像细节”这个操作上中断暂停(下图):
接下来就是考验数据分析能力的时刻了:作者利用中断的上下文观察到的一些特殊的值,开始在Ghidra里面去搜索(就是赌一把这些值是statically保存的),还真的找到了:
接下来是调试中经常做的一件事,就是修改某些值,观察程序的变化,作者在这里做了个实验,在某个点把DX
寄存器的值清空,然后观察游戏画面,所有细节都消失了!
这说明DX
寄存器的值很可能是控制分辨率细节的,那么修改一下,是不是能看到细节呢?
成功!有视频为证
最后一步就是写patch去让修改一劳永逸,这部分就不多说了,因为我们并没有42块钱去买游戏来玩,所以作者提供的patch也用不上,如果我们的读者愿意支援我们,非常欢迎!!!
博客原文:https://fe9aefb4.annali-af6.pages.dev/2024/11/20/tweaking-stunt-island
Patch:https://fe9aefb4.annali-af6.pages.dev/assets/2024-11-20--tweaking-stunt-island/si-8x.7z