計算左/右立體聲聲音定位
在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 查詢在該會話開啟時重用匯入的二進位制檔案。
把虛擬碼與指令、引用一起閱讀。結果中尚未解析的呼叫或數值,可以成為下一個調查問題。