IDA ProおよびGhidra用のTCP JSONブリッジサーバーで、デコンパイル、クロスリファレンス、シンボル、vtable、RTTI、メモリパッチングを外部スクリプトや自動化パイプラインに公開します。
IDA Pro および Ghidra 向けの軽量 TCP JSON ブリッジサーバー。シンプルなソケットプロトコルを介してリバースエンジニアリングワークフローを公開します。
外部ツール、CLI スクリプト、Python ユーティリティ、自動化パイプラインが、手動での GUI 操作なしにデコンパイル、クロスリファレンス、シンボル、仮想テーブル、RTTI、構造体、メモリパッチを照会できるようにします。
複数のバイナリを同時に開いて大規模なリバースプロジェクトに取り組む場合(例: ゲームクライアント、ランチャー、DLL プロキシ、スタブを同時に開く場合):
BASE_PORT = 5073 からスキャンを開始し、空いているポートが見つかるまで連続するポート(5073、5074、5075、5076...)を自動的にプローブします。IDA Pro では、Python インタプリタは複数のスクリプト実行を通じて生存し続けます:
ID_Server.py は実行中のサーバーハンドルを builtins._ida_bridge_prev に登録します。stop() を自動的に呼び出し、そのスレッドを join(join(3.0))して、新しいサーバーを起動する前にポートをクリーンに解放します。Address already in use や孤立したスレッドが発生することはありません。QUIT、STOP、EXIT、または SHUTDOWN を送信します。サーバーは {"ok": true, "shutdown": true} で確認し、即座に閉じます。ida_bridge_stop() を呼び出すか、単に IDA を閉じます(デーモンスレッドは自動的に終了します)。is_cancelled() はソケットタイムアウトを介して 1 秒ごとにチェックされます)、QUIT を送信します。.idb / .i64)を開きます。File -> Script file... / Alt+F7 経由)で以下を実行します:
import ID_Server
127.0.0.1:5073(または次に利用可能なポート)でリッスンを開始します。ida_bridge_stop()
Window -> Script Manager)で、Ghidra_Server.py を含むフォルダを追加するか、Python インタプリタで直接実行します。127.0.0.1:5073(または次の空きポート)にバインドします。コマンドは TCP(127.0.0.1:<PORT>)経由で送信されるプレーンな改行区切りの文字列です。サーバーは JSON オブジェクト(またはレガシーコマンドの場合はタブ区切りテキスト)で応答します。
| コマンド | 構文 | 説明 |
|---|---|---|
PING | PING | ヘルスチェック。"pong" を返します。 |
CURRENT | CURRENT | 現在のカーソルアドレス、関数名、サイズ、アセンブリ命令、デコンパイルされたコードを返します。 |
NAME | NAME <ea> | <ea> で定義されたシンボル/関数名を返します。 |
FUNC | FUNC <addr> | 完全な関数メタデータ、エントリポイント、サイズ、シグネチャ、アセンブリ、Hex-Rays/Ghidra デコンパイルを返します。 |
DECOMP | DECOMP <addr> | FUNC のエイリアス。ターゲット関数をデコンパイルします。 |
DISASM | DISASM <ea> [n] | <ea> から始まる [n] 命令の逆アセンブリ行を返します(デフォルト: 40)。 |
FIND | FIND <substr> | <substr> に一致するすべてのシンボルと関数名を大文字小文字を区別せずに検索します(最大 300 件)。 |
EXPORT | EXPORT [path] | すべての非ダミーシンボル、マングル名とデマングル名をテキストファイルにエクスポートします(デフォルト: C:\Contexto\ida_names.txt)。 |
HELP | HELP | サーバーがサポートするすべての利用可能なコマンドの JSON リストを返します。 |
QUIT | QUIT | クライアント接続をグレースフルに閉じ、ブリッジサーバーソケットを停止します。 |
| コマンド | 構文 | 説明 |
|---|---|---|
XREF | XREF <addr> | <addr> を対象とするすべての受信クロスリファレンス(コード呼び出し、データ読み取り/書き込み)をリストします。 |
XFROM | XFROM <addr> | <addr> から発信されるすべての送信クロスリファレンスをリストします。 |
CALLERS | CALLERS <addr> | 受信リファレンスをフィルタリングして呼び出しサイトのみを返します(解決された間接呼び出しを含む)。 |
READERS | READERS <addr> | 受信リファレンスをフィルタリングして <addr> から読み取る命令のみを返します。 |
WRITERS | WRITERS <addr> | 受信リファレンスをフィルタリングして <addr> に書き込む命令のみを返します。 |
DECOMP_XREF | DECOMP_XREF <addr> | <addr> のすべての呼び出し関数を単一のリクエストで一括デコンパイルします。 |
IMPORTXREF | IMPORTXREF <name> | インポートされた Windows/C API のバイナリ全体にわたるすべての呼び出しサイトを特定します(例: IMPORTXREF WSASendTo)。 |
TRACE | TRACE <addr> | <addr> 周辺の実行フローと基本ブロックをトレースします。 |
| コマンド | 構文 | 説明 |
|---|---|---|
READPTR | READPTR <addr> [count] | メモリをポインタチェーン(32 ビットまたは 64 ビット)として読み取り、各ターゲットを分類します(func、string、vtable)。 |
FINDPTR | FINDPTR <addr> | グローバルデータとテーブルをスキャンして <addr> を参照するポインタを検索します(vtable、ディスパッチテーブルを発見)。 |
STRUCT | STRUCT <addr> [n] | 連続するメモリをヒューリスティックにダンプし、フィールドを int、float、ポインタ、文字列として解釈します。 |
DEFSTRUCT | DEFSTRUCT <name> [size] | データベースの型ライブラリに新しい名前付き構造体を作成します。 |
SETFIELD | SETFIELD <struct> <off> <type> [name] | <off> の構造体フィールドを <type> とオプションのフィールド名で定義または変更します。 |
MKPTRS | MKPTRS <addr> [count] | 生のデータベースバイトを型付きポインタに一括変換します。 |
NEARSTR | NEARSTR <addr> | 範囲内のコードまたはデータセクションで近くにある文字列参照を検索します。 |
| コマンド | 構文 | 説明 |
|---|---|---|
VTABLE | VTABLE <funcaddr> | <funcaddr> を含む仮想テーブルを特定し、隣接するメソッドスロットも含めます。 |
VTDUMP | VTDUMP <addr> [count] | 仮想テーブル全体をダンプします: 各スロットをそのメソッド名、オフセット、インデックスに解決します。 |
RTTI | RTTI <addr|Name> | MSVC C++ RTTI 構造(TypeDescriptor -> CompleteObjectLocator -> vftable)を走査して、クラス階層と基底クラスを解決します。 |
| コマンド | 構文 | 説明 |
|---|---|---|
STR | STR <ascii> | すべてのロードされたセグメントにわたって ASCII 文字列を検索します。 |
WSTR | WSTR <utf16> | すべてのロードされたセグメントにわたって UTF-16 ワイド文字列を検索します。 |
BYTES | BYTES <hex> | 生のオペコードまたはデータバイトシーケンスを検索します(例: BYTES 55 8B EC 83 EC)。 |
| コマンド | 構文 | 説明 |
|---|---|---|
RENAME_FUNC | RENAME_FUNC <addr> <name> | <addr> の関数を <name> に名前変更します。 |
RENAME_SYMBOL | RENAME_SYMBOL <addr> <name> | グローバルデータシンボルまたは変数を名前変更します。 |
RENAME_LABEL | RENAME_LABEL <addr> <name> | コードラベルまたはジャンプターゲットを名前変更します。 |
RENAME_LOCAL | RENAME_LOCAL <func> <old> <new> | デコンパイラビュー内のローカル変数を名前変更します。 |
RETYPE | RETYPE <func> <var> <type> | デコンパイラ内の変数またはパラメータのデータ型を変更します(例: RETYPE 00401000 a1 Player*)。 |
SETCONV | SETCONV <func> <convention> | 呼び出し規約を設定します(__cdecl、__stdcall、__fastcall、__thiscall)。 |
MAKEFUNC | MAKEFUNC <addr> | <addr> に関数境界の作成を強制します。 |
PATCH | PATCH <addr> <hex> | データベース内のバイトを直接上書きします(例: PATCH 00401234 90 90)。 |
PCODE | PCODE <addr> | 深いコンパイラ分析のために Hex-Rays Microcode または Ghidra P-Code 中間表現をダンプします。 |
import socket
import json
class BridgeClient:
def __init__(self, host="127.0.0.1", port=5073):
self.host = host
self.port = port
def send(self, cmd: str) -> dict:
s = socket.socket()
s.connect((self.host, self.port))
s.sendall((cmd + "\n").encode("utf-8"))
chunks = []
while True:
chunk = s.recv(16384)
if not chunk:
break
chunks.append(chunk)
if b"\n" in chunk:
break
s.close()
raw = b"".join(chunks).decode("utf-8", errors="ignore").strip()
try:
return json.loads(raw)
except json.JSONDecodeError:
return {"raw": raw}
# Example usage:
client = BridgeClient(port=5074)
# Decompile target function
res = client.send("FUNC 007B11C0")
if res.get("ok"):
print("Function Name:", res.get("function_name"))
print(res["code"][:300])
# Trace incoming callers
callers = client.send("CALLERS 007B11C0")
print("Total callers:", callers.get("count"))
MIT