恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
63 字节、3205 个用例:用 REA 把老游戏二进制里的函数还原成 C 代码
首页
资讯中心
/
63 字节、3205 个用例:用 REA 把老游戏二进制里的函数还原成 C 代码
63 字节、3205 个用例:用 REA 把老游戏二进制里的函数还原成 C 代码
发布时间:2026/10/16 6:07:36
63 字节、3205 个用例用 REA 把老游戏二进制里的函数还原成 C 代码【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/reaREA 是面向 AI Agent 的逆向工具让 Agent 能查二进制、追调用、读内存常量。拿 1996 年的 DX-Ball 可执行文件158,208 字节里的一个 63 字节函数做例子C 还原版通过了3,205 个与原始 x86 逐一对比的用例编译回放后63 个字节全部吻合。为什么这个 63 字节的函数值得拆开看源码不存在二进制就是唯一事实。DX-Ball 是 1996 年的打砖块游戏重建项目要的不是能跑而是每个函数都能被测试证明与原版一致的 C 实现。验证是双重的3,205 个行为差分用例 VC4.0 编译回放 63 字节全匹配两条路径互相独立。流程可以复制REA 4.1.0 配合 Ghidra 12.1.4用analyze_function、read_bytes这类原语就能完成取证整套做法适用于任何只有二进制的老程序。进度是滚雪球式的截至 2026 年 10 月的检查点项目已维护 55 个 C 函数累计与原始代码对比 45,380 次其中 33 个函数通过了编译字节匹配。反编译没看全的地方线索藏在哪反编译器丢掉了入参指令视图把它找了回来。DX-Ball 里砖块被击中时音效带左右声像。要复刻它先得回答屏幕横坐标是怎么变成左/右平衡值的对0x406400执行analyze_functionGhidra 给出来的伪代码却长这样longlong FUN_00406400(void) { longlong lVar1; lVar1 __ftol(); return lVar1; }零参数还冒出一个来路不明的__ftol()转换调用。这时别看伪代码看同一结果里附带的指令视图0x406409: MOV EAX, dword ptr [EBP 0x8] 0x40640f: FILD dword ptr [EBP -0xc][EBP0x8]是标准的 32 位栈参数位置FILD说明它随后被当作整数读进浮点寄存器——函数其实有一个整型入参暂且叫它x伪代码里丢了它。反编译的残缺处不是死路而是继续往下挖的入口。跟着调用方把x的含义钉住。REA 返回的结果里同时带调用方条目砖块命中函数在0x411f40。它的最后三条指令是0x411f5b: ADD EAX, 0x14 0x411f5e: PUSH EAX 0x411f5f: CALL 0x00406400再往前追tile_x先被乘了 30。所以x就是砖块的屏幕横坐标20 30 × tile_x取值范围 0 到 640正好覆盖一屏宽度。那几个常量从内存地址里直接读出来。指令里还有三个内存地址。对它们分别发read_bytes再按双精度浮点解码0x420068 - 1.5625 0x420070 - 500.0 0x4210a0 - 1.0其中0x4210a0存的初值是 1.0重建项目把它命名为dxball_pan_scale。证据到此齐了一个入参、两个算术常量、一个可变比例。最小的 C 还原长什么样四行运算和指令一一对应。把上面的发现排进顺序DxBallInt dxball_screen_pan(DxBallInt x) { double pan (double)x; pan pan * 1.5625; pan pan - 500.0; pan pan * dxball_pan_scale; return (DxBallInt)pan; }对应关系很直白FMUL [0x420068]乘 1.5625FSUB [0x420070]减 500.0FMUL [0x4210a0]乘比例系数结尾对0x41678c的那次CALL就是转整数。这个公式直觉上也很对比例取 1 时屏幕左边缘算出 -500中心 0右边缘 500——标准的立体声声像范围。3205 个用例怎么算出来的先说结论3,205 个行为用例全部通过编译回放 63 个字节全部匹配。两条检查路径互相独立回答的是不同问题。行为差分这条直接执行原始 x86 函数把返回值和 C 实现逐一比对横坐标取 0 到 640 的每个整数位置比例系数取 0、0.5、1、20、-1 五档含极端值541 × 5 2,705再叠加边界与中间态组合凑成 3,205 个用例任何一处不一致测试立刻失败。编译器回放这条用锁定的 VC4.0 工具链编译 C 函数应用审阅过的重定位并核对引用常量后产出的 63 个字节与原函数逐字节一致——它回答的是当年同款编译器下我的代码是否产出同样的机器码。范围要说清楚。这些结论绑定在重建项目固定的检查点a55dca272026 年 10 月 7 日上只针对这个函数游戏级集成是另一条独立任务线。完整证据清单见 website/evidence/dx-ball-sound-pan.md每条观察都带 Evidence ID。复现这条命令要几步三步一条命令就能拿到函数快照。克隆仓库git clone https://gitcode.com/GitHub_Trending/rea2/rea按 docs/installation.md 完成安装并接好 Ghidra 或 Hopper Provider。对目标二进制跑函数快照命令原样可复制scripts/rea function original/DXBALL.EXE 0x00406400 \ --snapshot .analysis/rea/dxball.snapshot.json --jsonAgent 基于快照里的指令视图、调用方条目和字节读取结果补齐证据随后用普通代码工具写 C 实现并跑差分测试。三个值得带走的点反编译的残缺处就是线索[EBP8]一读入参就回来了残缺不是放弃的理由。结论要能被复算3,205 个行为用例 63 字节编译回放两个维度交叉验证和原版一样才是可交付的说法。过程要可追溯每条观察绑 Evidence ID、结论绑固定检查点别人能原样复核。别再对着汇编猜了——让 Agent 查二进制、让测试说话一个 63 字节的函数也能交付一份能长期维护的 C 实现。【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考