首页 / 资讯中心 / 文章详情

反编译是怎么做的:Tenkaichi3Decomp字节级还原PS2游戏的完整教程

反编译是怎么做的:Tenkaichi3Decomp字节级还原PS2游戏的完整教程 ★ FEATURED ARTICLE
【免费下载链接】Tenkaichi3DecompPC port of Dragon Ball Z: Budokai Tenkaichi 3, built on the BT3-Decompiled project.项目地址https://gitcode.com/gh_mirrors/te/Tenkaichi3Decomp点击查看免费下载Tenkaichi3Decomp是 PS2 名作《龙珠Z电光石火3》Dragon Ball Z: Budokai Tenkaichi 3SLUS-21678的 PC 原生移植项目它建立在BT3-Decompiled反编译工程之上不是模拟器而是把游戏原本的MIPS 汇编逐函数还原成 C 代码再用当年的Sony ee-gcc 2.96编译器重新编译直到产出的二进制与原版字节完全一致最后再垫上全新的 PC 渲染、声音与输入层。本文带你走一遍这套反编译 → 字节级验证 → PC 移植的完整流程。一、先搞懂反编译和重编译不是一回事 很多人以为反编译就是把机器码翻译回 C 语言。实际上 Tenkaichi3Decomp 追求的目标更苛刻——匹配反编译matching decompilation❌ 普通反编译写出逻辑上等价的 C能跑就行✅ 匹配反编译写出的 C 必须编译出和原版一模一样的机器码每一个字节、每一条指令都不能差。为什么要这么较真因为 PS2 的浮点运算、随机数序列、30 帧/秒的帧逻辑都高度依赖执行时序逻辑等价的代码在联网对战、录像回放时会逐渐跑偏。字节级一致才能保证移植版与主机版行为完全相同。二、项目结构代码从哪来到哪去目录作用src/、include/游戏本体代码来自反编译工程PC 改动写在#ifdef PORT里port/src/PC 侧新代码Vulkan/OpenGL 渲染器、内存卡、电影播放、设置窗口port/tools/构建工具64 位指针重写、打包、光盘数据提取port/data/游戏内置数据表的形状只有标签和大小数值启动时从你的光盘读取config/symbols/符号表每个函数/全局变量的名字和地址docs/反编译发现的游戏机制笔记战斗、AI、HUD、存档等⚠️ 注意仓库里不包含任何游戏数据需要你自己准备的 USA 版光盘镜像.iso安装时程序会校验镜像是未修改的 SLUS-21678 版本。三、MIPS 汇编反编译的完整工作流 整个流程记录在 docs/decomp_guide.md可以概括为一个循环步骤 1读汇编用 splat 反汇编工具把可执行文件拆成一堆.s文件。每个函数长这样nonmatching FunctionName, 0xSIZE glabel FunctionName ...MIPS 指令... endlabel FunctionName步骤 2手写 C按地址顺序一个 C 文件覆盖一段连续的地址范围跳过不行、乱序也不行。类型来自 include/types.hs8 u8 s16 u16 s32 u32 f32等。步骤 3记录符号名每取一个名字就写进 config/symbols/ 下的符号文件格式固定Name 0x00123456; // type:func gGlobal 0x002FF080; // size:0x8猜测的名字要标// guess且全项目不许重名。步骤 4fdiff 逐函数比对运行python3 scripts/fdiff.py src/area/module.c它会用ee-gcc 2.96按原版参数-O2 -fno-strict-aliasing游戏代码-G8、CRI 库-G0编译你的 C 文件把每个函数与原版二进制并排逐条指令比对输出OK表示匹配重定位字段会被掩码屏蔽所以链接前也能检查。步骤 5迭代到全部 OK再链接进大工程.venv/bin/python configure.py ninja cmp build/SLUS_216.78.rom disc/SLUS_216.78.rom # 必须完全静默 cmp build/DBZP.BIN disc/BIN/DBZP.BIN python3 scripts/progress.py # 统计反编译百分比只有ninja成功 两个镜像cmp静默才算真正通过这就是项目里常说的gate。四、ee-gcc 2.96为什么必须用当年那台编译器 ⚙️这是字节级反编译最玄学也最关键的一环。项目做过一轮完整的工具链排查见 docs/decomp_guide.md 的 Toolchain check 一节结论非常干脆游戏用的编译器是gcc version 2.96-ee-001003-1PS2 EE 处理器专用分支其他所有公开 ee-gcc 版本2.9、2.95、3.2最多只能保住 16% 的函数匹配换 118 组编译参数、361 种组合没有任何一组能救活卡住的函数反而都会弄坏已匹配的函数去掉-fno-strict-aliasing会弄坏 1060 个函数加-g会弄坏 84 个——所以原版就是无调试信息编译的。这意味着你手写的 C 必须迎合 25 年前编译器的脾气。docs/decomp_guide.md 里沉淀了几十条血泪经验举几个汇编现象对应的 C 写法lui/addiu而不是gp_rel小全局变量≤8 字节必须声明成完整类型extern s32 tbl[]不行beq 1 / slti 2 / beq 2阶梯那是一个switch且显式写了case 0: break;sltvssltu、divvsdivu有符号/无符号写反了多出一条move v1,s1原版重复计算了一个表达式别帮编译器优化分支延迟槽里凭空多一条指令看include/gcc_prelude.inc的预序列规则Sony 汇编器会把分支前一条指令塞进延迟槽甚至连long是 64 位、浮点字面量3.14159265f一位都不能少fdiff 看不见.lit4常量池必须人工对字节这些细节都有记录。五、fdiff 逐函数比对反编译的单元测试 ✅scripts/fdiff.py 是整个工程的质量门禁思路很巧妙掩码屏蔽重定位位跳转目标、%hi/%lo/%gp_rel立即数这些链接时才知道的字段被按R_MIPS_26 / HI16 / LO16 / GPREL16掩掉因此函数没链接也能提前验证函数级粒度一个文件 100 个函数99 个OK、1 个卡住能精确知道差在哪几条指令原版在左、你的在右并排打印盲区靠真镜像补fdiff 看不见数据初值比如一张颜色表写错一个字节所以最终裁判是链接后build/与disc/两个 ROM 的cmp全量比对——历史上 11 色调色板里 5 个颜色写错的 bug 就是这样被揪出来的。对怎么写都凑不齐寄存器的疑难函数项目还配了两件重武器差分行为测试build/scratch_difftest/把原版字节和你的 C 在同一个随机内存上各跑 3000~4000 组种子比对返回值、每一条外发调用的参数、写出的每个字节——59 个未匹配函数全部测试只抓到 1 个真实行为差异而且恰好是原版的复制粘贴 bug已记录在 docs/known_bugs.md语句排列器scripts/permute.py对只差寄存器分配的函数自动搜索语句顺序三轮共解出 30 个函数。实在匹配不上的函数会写成INCLUDE_ASM(...)保留原版汇编并把最佳 C 尝试留在#if 0里加注释绝不偷偷改对。六、链接最后一公里的对齐地狱 函数全 OK 之后链接阶段还有独立的一整套坑因为数据段的布局也是原版的字节每个 C 文件在 config/SLUS_216.78.yaml 里要登记自己的c/.rodata/.lit4/.sdata子段起点地址原版把.rodata补齐到 16 字节、现代编译器只补 8 字节——差 8 字节时就要手工提前 8 字节放下一段汇编数据块跳转表按对象起点做 16 字节对齐有时得把 C 文件向前扩展、用INCLUDE_ASM把前面的函数拉进来才能对齐src/battle/btl_seq.c 就是例子两个可执行文件要一起管主程序SLUS_216.78约 1.8 MB 代码 菜单覆盖层DBZP.BIN737 个函数加载在 0x334C00开发者内部叫它PROGRESS。进度统计由 scripts/progress.py 给出。截至最新提交主程序 94.96%、覆盖层 99.24% 的代码由 C 编译产出两个镜像字节一致约 7270 个函数全部匹配仅剩 45 个INCLUDE_ASM。七、从反编译到 PC 移植 ️字节级一致之后移植就变成了一层干净的工程渲染port/src/gs/里的 Vulkan 渲染器重画 PS2 的画面描边、辉光、深度着色、远景模糊都可开关没有 Vulkan 的机器自动落到 OpenGL 3.3数学层游戏 30 帧的战斗模拟用 PS2 VU0 数学PC 上由softfloat_ps2.c逐位复现保证帧确定性联网port/matchmaking/是一个完整的 Cloudflare Worker 匹配服务房间码 TURN 中继回滚帧数由房主设定数据仓库只带数据表的空壳port/data/启动时从你自己的光盘镜像里取真实数值。游戏机制的发现全部沉淀在 docs/systems/战斗帧结构、格斗家对象、AI 对手、HUD、存档块 等每条结论都标注Verified编译出原版字节或Inferred从反汇编推断。八、新手入门路线如何动手参与 想上手贡献建议按这个顺序读README.md —— 项目总览、安装与源码构建python3 install.py --iso 你的镜像docs/decomp_guide.md —— 反编译一个模块的完整方法论核心文档docs/status.md —— 当前进度交接笔记看最新状态怎么验证docs/agent_rules.md —— 并行协作的规矩参考已完成的范例src/sys/heap.c include/sys/heap.h。环境上你需要tools/ee-gcc2.96/Sony 编译器、tools/binutils/mips-ps2-decompals-*MIPS 汇编器/反汇编器、Python splat ninja以及一份合法获得的 SLUS-21678 光盘镜像。日常验证三板斧.venv/bin/python configure.py ninja cmp build/SLUS_216.78.rom disc/SLUS_216.78.rom python3 scripts/fdiff.py src/area/module.c九、为什么字节级反编译值得做确定性浮点、随机数、帧时序逐位一致联网对战和回放才不会跑偏可修改性C 代码可以随便加功能本项目就加了在线对战、新渲染器、自定义关卡/音乐改完还能一眼看出影响可移植性字节一致是移植的地基——同一份游戏逻辑跑在 Linux、Windows 甚至 Apple Silicon实验性上研究价值反编译过程顺带发现了原版随机数只刷新 396/624 状态字的怪实现、碰撞检测里的死代码、以及多个修不得的原版 bugdocs/known_bugs.md。小结Tenkaichi3Decomp 展示的是一条可复制的路——原版编译器 符号表 逐函数字节比对 全量镜像验证把一个 PS2 游戏 7000 多个函数逐一请回 C 语言世界再在这个完全透明的地基上构建 PC 移植。如果你对 MIPS 汇编、编译器行为或游戏逆向感兴趣docs/decomp_guide.md 里那几十条踩坑笔记本身就是最好的教材。许可说明port/下移植代码为 AGPL-3.0早期为 MITsrc/游戏代码版权归原作权利方所有项目不包含游戏资源需自备光盘镜像。赞分享【免费下载链接】Tenkaichi3DecompPC port of Dragon Ball Z: Budokai Tenkaichi 3, built on the BT3-Decompiled project.项目地址https://gitcode.com/gh_mirrors/te/Tenkaichi3Decomp点击查看免费下载相关推荐LuaDec51反编译实战从字节码到源代码的完整还原方案LuaDec51反编译实战从字节码到源代码的完整还原方案 LuaDec51是一款专注于Lua 5.1版本的字节码反编译工具能够将编译后的Lua字节码.lu开发工具LuaJIT反编译神器LJD从字节码到源码的完整还原指南LuaJIT反编译神器LJD从字节码到源码的完整还原指南 你是否曾经面对一个编译后的LuaJIT字节码文件却苦于无法理解其内部逻辑或者需要分析某个Lua脚bbhost反编译实践200个游戏函数被重写为源码位精确验证体系是怎么做到的bbhost反编译实践200个游戏函数被重写为源码位精确验证体系是怎么做到的 bbhost 是让《血源诅咒》Bloodborne在 PC 上运行的开源移上一篇din_mmoe基准评测指南推荐模型性能评估方法与结果解读下一篇刚刚AI 交易 Agent 对苹果一战赚了 26.6%开源圈彻底坐不住创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站