ReC98:东方 PC-98 五作的 bit-perfect 逆向
ReC98 是东方 PC-98 复原计划, nmlgc 靠众筹一点点啃出来的, 目标是把 ZUN 最早五作 TH01 到 TH05 完整还原成能编译的源码。这几作是 1997、1998 年的东西, 只在 PC-9801 上跑过, 早就停售, 连 ZUN 自己都说原始数据丢了。这里是我 fork 的一份, 不改东西, 就跟着构建、研究一遍, 因为这是我见过最硬核的逆向。
它的标准很狠: 仓库编出来的二进制要跟原版逐字节一致, 每个 commit 都得保持。手上只有二进制, 拿不到变量名和注释, 所以判据是“无法证明原始代码不可能长这样”。
没走 PyTouhou 那种黑盒重写, 坚持完整反编译。理由很实在: TH04、TH05 的杂兵弹幕是 .STD 字节码, 能另写个 VM 解, 但中 boss 和 boss 全硬编码进 exe, 绕不过去。
真正让这活儿可行的, 是认出五作共用的两个库——master.lib(16 位 x86 汇编写的 PC-98 DOS 抽象层)和 Borland C/C++ 4.0 运行时, 而且源码都找着了。光这俩在 TH05 里就占 OP.EXE 的 74%、MAIN.EXE 的 40%, 工作量直接砍掉一大块。TH01 还用了 BERO 的 Pi loader, TH03 的 ZUNSP.COM 其实是 Promisence Soft 的 SPRITE16.COM 换皮。
编译器只能用 ZUN 当年那台 Borland Turbo C++ 4.0J, 别的凑不出逐字节一致; Borland 又从没做过在 32 位 Windows 上编 16 位 DOS 的交叉编译器, 所以 C++ 只能丢进 DOS 模拟里编。构建链用 MS-DOS Player 跑 DOS 工具, Tup 做增量并行, 它靠 hook 编译器的文件打开系统调用来追 #include 依赖, 比 make 干净太多。Win11 上 build.bat 一把梭就出货, 产物落在 bin\th0?, 但跑起来得自己有原版素材, 仓库不含任何游戏数据。
TH01 的反编译 2022 年 8 月就整套完事了, 剩下几作按作者说只是时间问题。后来重心偏到对 ZUN 原始代码的文档和考据, rec98.nmlgc.net 上的项目博客反倒成了主菜。
- 仓库(我的 fork):https://github.com/dwgx/ReC98
- 原项目主页:https://rec98.nmlgc.net