计算左右声像
在 DX-Ball 中,砖块碰撞提供一个水平屏幕坐标,声音代码把它转换为左右声像值。
起始函数 0x00406400 的反编译结果很短:一次对 __ftol() 的调用。REA 还会返回它的指令和调用者,让编程助手得以调查缺失的算术运算。
这些术语还不熟悉?
-
指令:处理器执行的步骤,以
MOV、ADD这样的可读形式显示。 - 反编译器结果/伪代码: 分析工具试图将指令转换回类似C的代码。 它可能会错过部分,如本例所示。
- 调用方:调用当前函数的函数,可以看出传入的数值。
-
地址: 程序中的一个位置,用十六进制编写,如
0x00406400. - 常量: 存储在程序中的固定数值,以原始字节读取并解码。
三件证据,一个计算
- 01 · 指令整数输入从栈读取一个值,供浮点指令使用。
-
02 · 调用方屏幕坐标砖块碰撞处理函数传入
20 + 30 × tile_x。 -
03 · 数据字节数值常量引用的字节解码为
1.5625、500.0和一个缩放系数。
pan = (x × 1.5625 − 500.0) × scale
询问行为
将 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结果
阅读输入
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]
指令加载一个整数参数并将其转换为浮点算术。 这是第一个伪代码视图中没有的输入。
跟随调用方
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400
REA 找到砖块碰撞处理函数。它先把砖块横坐标乘以 30,再加上 0x14(20),得到砖块的屏幕位置。
读取引用的常量
0x420068 000000000000f93f → 1.5625
0x420070 0000000000407f40 → 500.0
0x4210a0 000000000000f03f → 1.0
算术引用这些地址。 读取字节提供实际值;指令顺序告诉编程助手如何使用它们。
写入并检查恢复的函数
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个编译字节。
用你自己的二进制文件试试
连接原生分析提供程序,然后给编程助手一个本地可执行文件或库,并指定要调查的功能。有用的起始问题包括“如何解析这个文件?”或“哪个函数处理这个菜单操作?”
如果你已经知道函数名称或地址,则可以从终端查询它。 对于已配置的Ghidra安装:
npx -y rea-agents@latest function /absolute/path/to/program main \
--provider ghidra --json
替换目标路径和 main 使用你自己的函数名称或地址。 每个 CLI 调用导入并分析二进制文件,然后关闭其会话。 你的编程助手 MCP 查询在该会话打开时重用导入的二进制文件。
把伪代码与指令、引用一起阅读。结果中尚未解析的调用或数值,可以成为下一个调查问题。