回復DX-Ballの
左/右の音の位置の計算。

元の命令を調べ、入力と定数を特定してから、復元されたCを確認します。

左/右のステレオサウンドの位置を計算する

DX-Ballでは、レンガのヒットが水平画面の位置を供給します。 サウンドコードは、それを左/右パン値に変換します。

開始機能, 0x00406400、短い逆コンパイラの結果を持っています:への呼び出し __ftol(). REAはまた、エージェントに不足している算術を調査する方法を与えるその命令と呼び出し元を返します。

これらの条件に新しいですか?
  • 説明書: プロセッサが実行する手順は、次のような読み取り可能な形式で示されています MOV または ADD.
  • 逆コンパイラの結果/擬似コード: 命令をCのようなコードに戻そうとする分析ツールの試み。 この例のように、部品が欠落する可能性があります。
  • 発信者: これを呼び出す関数。 どの値が渡されるかを示します。
  • 住所: プログラム内の場所で、次のような16進数で記述されています 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で実験):無料ですが、既存のGhidra12.1が必要です。Xのインストールおよび64ビットJDK21以降。
  • IDA (Windows):MCP登録を持つ既存のIDAセットアップの場合。

見る マシンコードプログラムの解析の設定 ステップのために。

あなたのコーディングエージェント

REAを使用して、DX-Ballがステレオサウンドの位置を計算する方法を見つけます。 計算を説明し、コードを表示します。

プロンプトの例。 エージェントにローカルのDX-Ball1.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バイトの結果·リトルエンディアンの倍精度として解釈されます
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.Separate checkを記述し、3,205個の入力を元のx86関数と比較し、完全な関数のコンパイルされた63バイトすべてを再現しました。

完全な調査とアセンブリとCの比較を参照してください

独自のバイナリで試してみてください

マシンコードの解析プログラムのプロバイダを接続します。 次に、エージェントにローカルの実行可能ファイルまたはライブラリと調査する機能を提供します。 有用な開始質問には、"このファイルはどのように解析されますか?"または"このメニューアクションを処理する関数はどれですか?”

関数名またはアドレスがすでにわかっている場合は、端末からクエリできます。 構成されたGhidraインストールの場合:

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

ターゲットパスを置き換え、 main 独自の関数名またはアドレスを使用します。 各CLI呼び出しは、バイナリをインポートして分析し、そのセッションを閉じます。 エージェントのMCPクエリは、セッションが開いている間にインポートされたバイナリを再利用します。

擬似コードを指示と参照と一緒に読んでください。 結果がコールまたは値を未解決のままにした場合は、その場所を次の質問として使用します。

トップ