恢复DX-Ball的
左/右声音位置的计算。

检查原始指令,识别输入和常量,然后检查恢复的C。

计算左右声像

在 DX-Ball 中,砖块碰撞提供一个水平屏幕坐标,声音代码把它转换为左右声像值。

起始函数 0x00406400 的反编译结果很短:一次对 __ftol() 的调用。REA 还会返回它的指令和调用者,让编程助手得以调查缺失的算术运算。

这些术语还不熟悉?
  • 指令:处理器执行的步骤,以 MOV、ADD 这样的可读形式显示。
  • 反编译器结果/伪代码: 分析工具试图将指令转换回类似C的代码。 它可能会错过部分,如本例所示。
  • 调用方:调用当前函数的函数,可以看出传入的数值。
  • 地址: 程序中的一个位置,用十六进制编写,如 0x00406400.
  • 常量: 存储在程序中的固定数值,以原始字节读取并解码。

三件证据,一个计算

  1. 01 · 指令整数输入从栈读取一个值,供浮点指令使用。
  2. 02 · 调用方屏幕坐标砖块碰撞处理函数传入 20 + 30 × tile_x。
  3. 03 · 数据字节数值常量引用的字节解码为 1.5625、500.0 和一个缩放系数。

pan = (x × 1.5625 − 500.0) × scale

REA提供指令,调用关系和字节。 编程助手一起解释它们。

询问行为

将 REA 连接到助手并配置原生分析工具后,提供本地可执行文件和一个问题:

我应该使用哪种分析工具?

REA需要其中一个来阅读原生程序:

  • Hopper(macOS 或 Linux):REA 的安装与配置流程会检测到它,或提示你安装。在 macOS 上,先打开一次 Hopper,选择演示模式或在首次分析前激活许可证。
  • Ghidra(macOS 或 Linux;在 Windows 上为实验性):免费,但需要已安装的 Ghidra 12.1.x,以及 64 位 JDK 21 或更新版本。
  • IDA(Windows):适用于已完成 MCP 注册的现有 IDA 配置。

具体步骤参见配置原生分析。

你的编程助手

用 REA 找出 DX-Ball 如何计算声音的左右位置。解释计算过程,并展示代码。

示例提示词。把本地 DX-Ball 1.07 可执行文件的路径交给编程助手。REA 不附带 DX-Ball,请使用你自己的副本;也可以就你手上的另一个小型 Windows 程序问同样的问题。

如何获取文件的完整路径?
  • Windows : 在文件资源管理器中,右键单击该文件并选择 复制为路径. 在Windows10上,在右键单击时按住Shift。
  • macOS : 在Finder中,右键单击文件,按住选项并选择 复制"..."作为路径名.
  • 任何系统: 将文件拖到终端窗口中并显示其路径。

阅读REA结果

阅读输入

REA指令摘录·0x406409
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]

指令加载一个整数参数并将其转换为浮点算术。 这是第一个伪代码视图中没有的输入。

跟随调用方

REA调用方摘录 · 0x411f5b
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400

REA 找到砖块碰撞处理函数。它先把砖块横坐标乘以 30,再加上 0x14(20),得到砖块的屏幕位置。

读取引用的常量

REA字节结果 · 解释为little-endian双精度浮点数
0x420068  000000000000f93f  → 1.5625
0x420070  0000000000407f40  → 500.0
0x4210a0  000000000000f03f  → 1.0

算术引用这些地址。 读取字节提供实际值;指令顺序告诉编程助手如何使用它们。

写入并检查恢复的函数

恢复C · 摘录
pan = (double)x;
pan = pan * 1.5625;
pan = pan - 500.0;
pan = pan * dxball_pan_scale;
return (DxBallInt)pan;

比例为 1.0 时,屏幕坐标 0、320 和 640 在整数转换前映射到 -500、0 和 500。这一计算把屏幕正中放在立体声场的中心。

编程助手使用REA的发现来编写C.单独的检查将3,205个输入与原始x86函数进行了比较,并再现了完整函数的所有63个编译字节。

查看完整调查过程和汇编与 C 的对比

用你自己的二进制文件试试

连接原生分析提供程序,然后给编程助手一个本地可执行文件或库,并指定要调查的功能。有用的起始问题包括“如何解析这个文件?”或“哪个函数处理这个菜单操作?”

如果你已经知道函数名称或地址,则可以从终端查询它。 对于已配置的Ghidra安装:

函数分析
npx -y rea-agents@latest function /absolute/path/to/program main \
  --provider ghidra --json

替换目标路径和 main 使用你自己的函数名称或地址。 每个 CLI 调用导入并分析二进制文件,然后关闭其会话。 你的编程助手 MCP 查询在该会话打开时重用导入的二进制文件。

把伪代码与指令、引用一起阅读。结果中尚未解析的调用或数值,可以成为下一个调查问题。

顶部