志愿者完成了《塞尔达传说:时之笛》的反编译 C语言代码可读

通过将近两年的努力,一个由志愿者组成的团队,终于完成了对《塞尔达传说:时之笛》的反编译任务。更确切地说,他们将可执行 ROM 文件转换成了人类可读(且可编辑)的 C 语言代码,为后续的 PC 移植和各种 MOD 奠定了基础。
图片
上周日,ZRET 逆向工程团队成员 Kenix 在该项目的 Discord 服务器上宣布:
在数十人的帮助下,我们最终完成了这个项目,并取得了惊人的成就。我们一度认为可能永远无法完整每项功能匹配,因而这项激动人心的壮举还是相当让人难以置信的。
在 100% 完成开源任务之前,最终的反编译功能仍需与 ZRET 的 GitHub 存储库合并。
直到提交并审核通过,团队才得以通过编译器来运行数万行 C 代码(以及来自合法卡带的图形和声音资源),并最终生成 1:1 的原版《时之笛》ROM 副本。
完整的反编译过程,持续了至少 21 个月。虽然自动化软件工具有一定用处,但想要将代码反编译成人类可读的 C 语言,还是需要人工解析 15000 多个函数中的每一个。
在弄清楚每个部分的用意的同时,ZRET 团队还需要清理代码,以消除任何混淆、或逻辑过程中引入的 bug 。
图片
回顾 2019 年完成的类似项目,最终让广大玩家体验到了多个高分辨率的 PC 移植体验。然而 ZRET 团队成员 Rozlette 在去年接受 ARSTechnica 采访时透露:
从 C 代码到WindowsPC 移植的构建过程,并没有想象中那么容易。毕竟项目中有许多代码和 N64 硬件的使用有关,比如 N64 的渲染管道,就与现代 PC 平台上的 OpenGL 大不相同。
在 ZRET 项目的推进过程中,Kenix 表示相关移植工作超出了最初预想的范围。即便如此,团队还是颇有兴趣地研究了相关代码,以深入了解有关游戏内部运作和创作的细节。
此外反编译代码能够更加轻松地创建新的游戏模式 / 随机方案,从而进一步拓展游戏的可玩性与观赏性。
图片
对于为何要投身于这个项目,Rozlette 曾于去年坦言,这一切都是出于对儿时游戏的热爱。
这对我来说就像一个大谜题,且其中每个函数都是一个片段。当我处理一个未知的代码函数,然后意识到它在游戏中的作用时,就会让自己感受到相当大的鼓励。
Kenix 在 Discord 上指出:虽然反编译工作可能已经达到了 100%,但团队后续仍有许多工作要做。
我们一直致力于反编译游戏的《Master Quest Debug》版本,然而《时之笛》其实还有十多个其它版本,我们也计划为它们提供反编译和相关支持。
此外反编译代码需要额外的文档,重组、并对变量重新命名,以使他人更易使用底层代码。
最后,由 ZRET 公开的追踪器页面可知,Majora's Mask 和 Minish Cap 的相关反编译项目也仍在推进过程中(大约分别完成了 24% / 48%)。