fork 一份妖妖梦 decomp 拆着玩
说清楚 这不是我写的 也不是我逆的。上海爱丽丝的《东方妖妖梦》PCB 1.00b 反编译成 C++ 的项目 原作 ZUN。我 fork 来纯粹想拆开看 顺便自己编一份能跑的。
我一直对老游戏逆向有执念。PCB 是 2003 年的东西 MSVC 7 编出来的 Win32 弹幕 exe 就那么大 但五脏俱全。定点数运算 脚本系统 资源打包 绘制循环 全塞一个 exe 里。这种一个人写完的完整游戏最适合拿来学 没有现代工程那堆抽象和依赖 顺着调用链一路读就懂了。
而且这个 decomp 站在前人肩膀上。红魔乡 th06 早有一份成熟的反编译 跟妖妖梦几乎一个模子刻的 类型 命名 文件划分 直接照搬当参考 省了大量瞎猜。
现在实现度 100% 准确度 97% 左右。能从头玩到尾 行为基本一致 但还没做到 byte accuracy 偶尔有 bug。有意思的是完整匹配的构建跑久了会自己崩 3999 个 Supervisor 周期之后 因为校验和还没跟原版一模一样 过不了完整性检查。想长跑就得 --no-matching 把它关掉。故意保留原版的自毁机制 这就是 matching decomp 好玩的地方 目标不是能跑就行 是编出来的字节跟 2003 年那份一模一样。
工具链有点复古 uv 管 Python ninja 构建 Linux 下还得靠 wine 跑 MSVC。第一个坑就在 wine 老版本解 MSVC 的 msi 彻底坏的 死活抽不出来 换最新 devel 版才行。编译入口是根目录一个脚本 直接:
uv run scripts/build.py
产物在 build/th07.exe。想跑久点不被完整性检查打断加 --no-matching 手头没原版 exe(提图标要用)加 --no-icon 也能编出个没图标的。
对我来说价值不在再玩一遍妖妖梦 是看别人怎么把一坨机器码还原成有名有姓的 C++。里面大量用 EstexNT 移到 MSVC 7 的 var_order pragma 控制局部变量在栈上的排布顺序 这种为了字节匹配精细操纵编译器的招 平时写代码根本用不上 逆向里是命根子。作者自己都在 Todo 里吐槽这是一坨没收拾的烂摊子 还没正经开始 matching。对我这种看热闹兼学习的反而正好 趁乱能看到最原始的还原痕迹。
仓库在这: https://github.com/dwgx/th07。想深入红魔乡那份 th06 才是源头 对着读收获最大。