计算左/右立体声声音定位
在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上进行实验):免费,但需要现有的Ghidra12.1。x安装和64位JDK21或更高版本。
- IDA (Windows):用于具有MCP注册的现有IDA设置。
见 设置原生分析 为步骤。
用 REA 找出 DX-Ball 如何计算声音的左右位置。解释计算过程,并展示代码。
示例 prompt。把本地 DX-Ball 1.07 可执行文件的路径交给助手。REA 不附带游戏,需要用自己的副本,也可以换成手里的其他小型 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 查询在该会话打开时重用导入的二进制文件。
把伪代码与指令、引用一起阅读。结果中尚未解析的调用或数值,可以成为下一个调查问题。