Resident Evil 4 被完整反编译为 C++
Resident Evil 4 (GameCube) – complete byte-identical decompilation to C/C++
adonis-singh 在 GitHub 上发布了 Resident Evil 4 的完整反编译项目,针对 Nintendo GameCube 平台的 G4BE08 调试版本。该项目成功将游戏代码还原为约 55.5 万行 C/C++ 源码,不包含任何汇编文件,且重建后的二进制文件与原版实现字节级完全一致。项目使用了 SN Systems ProDG 和 Metrowerks CodeWarrior 等原始编译器,精确还原了 Capcom 和 CRI Middleware 的代码逻辑。这不仅是一项技术壮举,更为游戏逆向工程和软件保存提供了珍贵资源,所有工具链和文档均开源供研究使用。
该存储库不包含任何游戏素材,也没有从光盘复制任何代码或数据。
HN 评论区
96- groundzeros2015
我随机打开了一个文件。这看起来更像是用可编译的 C 语法模拟行为,而不是恢复游戏的原始编程代码。
void Em1eWeaponSet(cEm10* em)
{
Em10Work* w = EM10_WK(em);
w->mot[41] = 0;
w->mot[42] = 0;
…
w->mot[62] = 0;
w->mot[63] = ARC(0x26C);
w->mot[64] = ARC(0x26D);
w->mot[65] = ARC(0x276);
w->mot[66] = ARC(0x277);
w->mot[67] = 0;
w->mot[68] = 0;
w->mot[69] = ARC(0x26A);
w->mot[70] = ARC(0x26B);
w->mot[71] = ARC(0x270);
w->mot[72] = ARC(0x271);
w->mot[73] = ARC(0x272);
w->mot[74] = ARC(0x273);
w->mot[75] = ARC(0x274);
w->mot[76] = ARC(0x275);
w->mot[77] = 0;
w->mot[78] = 0;
}
- LaurensBER
尽管 (复古) 游戏圈里充斥着对 AI 的“仇恨”,但我真心对这些类型的项目(不确定这个项目是否涉及任何 AI)和模拟器感到兴奋。
从技术角度来看,模拟器简直令人惊叹,它需要深厚的技术功底、对源系统的深刻理解,其优化水平更是达到了另一个境界。
- wk_end
从保存(游戏)的角度来看,鉴于 Capcom 致力于确保 RE4 移植到绝对每一个平台(开玩笑的!),这可能是有史以来最没用的反编译项目之一。
该项目是利用泄露的调试版及其符号构建的,这充分展示了那些获取并分发这些资源的游戏保存社区所做工作的意义。
另一方面,这一点相当令人却步:
> 当编译器需要特定的源代码形状来重现寄存器选择或调度,且找不到自然的写法时,该结构会被标记为 // COMPILER-DIFF: 注释(共有 644 处:无效测试、空的 asm("") 清洗器和锚点、寄存器 T x asm("rN") 引脚、填充语句)。
对我来说,反编译的价值不在于逐字节地重现原始字节(毕竟我们已经有原始字节了),而在于通过人类可读的源代码重建对原始游戏的理解;逐字节匹配只是表明你做得对的指标。需要添加一堆垃圾代码来强迫编译器匹配原始输出,实际上恰恰表明你做得不对——这也展示了古德哈特定律的危险性,尤其是当它应用于 AI 时。
- shakna
CC0,用于反编译受版权保护的作品?这……可不是这么运作的。
作为衍生作品,你继承了原作的版权。
反编译之所以一直是一个灰色地带,是有原因的,这取决于版权持有者是否在意。
- mikae1
我对所有这些出色的反编译工作感到情感上极度纠结。
遗憾的是,所有酷炫的反编译都发生在早期以 3D 为主的主机游戏上。作为一个 Quake 狂热粉丝,我这么说:低分辨率纹理加上那种模糊的双线性过滤风格,这种外观确实不容易让人爱上。我想这只是一代人的审美问题吧。