dwgx@blog:~$dwgx
> cd ../posts

th06:东方红魔乡的逐字节反编译

// created

先说清楚 这不是我写的 我 fork 的。th06 是 happyhavoc(GensokyoClub)那帮人搞的东方红魔乡反编译工程(東方紅魔郷 ~ the Embodiment of Scarlet Devil 1.02h)目标是把 ZUN 当年那份 C++ 源码一比特一比特重建出来。我扒过来纯粹是它正好压在我三个兴趣的交叉点上 底层 逆向 老游戏。

馋的是 match decompilation 这套路数。不是看懂逻辑重写个差不多的 是要求你的 C++ 经过当年那套编译器编出来的机器码 跟原版 東方紅魔郷.exe 逐字节一致。这就不只是还原逻辑了 你还得还原编译器的脾气 变量入栈顺序 寄存器分配的癖好。比单纯 crack 一个游戏有意思多了 逼你理解到骨头里。

最戳我的是工具链的偏执。整个 build 是 Visual Studio 2002 加 DirectX 8.0 拼的 还是从 Web Archive 捞回来的老版本。原因很直接 ZUN 当年就用这套 你想对齐字节就得用同一把刀。Linux/macOS 上靠 wine 跑 macOS 建议用 CrossOver 绕开 CL.EXE 的堆问题。python scripts/create_devenv.py 把编译器库工具全拉下来配好 然后 python3 ./scripts/build.py 生成 build.ninja 交给 ninja 去编。

逆向那半边用 Ghidra RE 成果放在 th06-re 仓库 每晚从他们的 Ghidra Server 同步一次。干活靠 objdiff 把原版 exe 拆成一个个 object 你重写完一个函数它当场告诉你跟原版差在哪 红一片就是没对上 全绿才算数。想找活翻 config/stubbed.csv 里面全是临时打桩的函数 挑一个把声明抄进对应 cpp 照着 Ghidra 反编译输出往下啃。这个反馈闭环设计得是真聪明。

有个细节很典型 为了让现代 MSVC7 复现当年那种变量排布 工程里专门移植了一个 var_order pragma。这种为骨灰级兼容造的小轮子 就是 match decomp 的迷人之处。它还有个 portable 分支 把游戏移到 Linux 和现代 Windows 上跑 反编译的副产品能变成真能玩的移植版 这条线也值得追。

我暂时没提交重建代码 就当逆向练手在读。放这儿备个档 哪天手痒挑个 stubbed 函数对齐一下。