mcpField
B
Binary Ninja MCP

Binary Ninja MCP

ローカル
github.com/fosdickioセキュリティ45729 週間前に更新

Binary Ninja MCP について

Binary Ninja MCP は、Binary Ninja の解析機能を LLM クライアントから利用できるようにするプラグインで、MCP サーバーとブリッジを含みます。AI の支援を受けながらリバースエンジニアリングを行う人を対象としています。

主な機能

  1. 01Binary Ninja と MCP クライアントのリアルタイム接続
  2. 02逆コンパイル・IL・逆アセンブルのツール
  3. 03関数や変数のリネームとコメント付与
  4. 04複数バイナリの管理と切り替え
  5. 05対応 MCP クライアントの自動セットアップ

活用シーン

  1. 01未知のファイルを AI の支援で解析
  2. 02CTF のリバーシング問題の解決
  3. 03変数の一括リネームと関数コメントの追加

MCP 対応

プラグインは Binary Ninja の機能を HTTP エンドポイントとして公開し、ブリッジが MCP クライアントをそれに接続します。逆コンパイル、相互参照、型操作などのツールを提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Binary Ninja MCP

このリポジトリには、Binary Ninja の機能をお好みの LLM クライアントとシームレスに統合する Binary Ninja プラグイン、MCP サーバー、ブリッジが含まれています。

Binary Ninja MCP ロゴ

機能

  • Binary Ninja と MCP クライアント間のシームレスなリアルタイム統合
  • AI の支援によるリバースエンジニアリングのワークフローの強化
  • すべての MCP クライアントに対応(Cline、Claude desktop、Roo Code など)
  • 複数のバイナリを開き、アクティブなターゲットを自動的に切り替え

例

CTF チャレンジの解決

この拡張機能を使って CTF チャレンジを解決するこちらの YouTube デモ動画をご覧ください。

コンポーネント

このリポジトリには、2 つの独立したコンポーネントが含まれています。

  1. HTTP エンドポイントを通じて Binary Ninja の機能を公開する MCP サーバーを提供する Binary Ninja プラグインです。MCP プロトコルを実装するあらゆるクライアントで使用できます。
  2. お好みの MCP クライアントを Binary Ninja MCP サーバーに接続する、独立した MCP ブリッジコンポーネントです。

前提条件

  • Binary Ninja
  • Python 3.12+
  • MCP クライアント(自動セットアップに対応しているクライアントは以下に記載しています)

インストール

MCP クライアント

MCP クライアントが自動セットアップされるように、Binary Ninja MCP をインストールする前に MCP クライアントをインストールしてください。現在、以下の MCP クライアントの自動セットアップに対応しています。

1. Cline(推奨)
2. Roo Code
3. Claude Desktop(推奨)
4. Cursor
5. Windsurf
6. Claude Code
7. LM Studio
拡張機能のインストール

MCP クライアントをインストールした後、Binary Ninja Plugin Manager を使うか、手動で MCP サーバーをインストールできます。どちらの方法でも、MCP クライアントの自動セットアップに対応しています。

MCP クライアントが設定されていない場合は、まずクライアントをインストールしてから、拡張機能を再インストールしてください。

Binary Ninja Plugin Manager

Binary Ninja の Plugin Manager(Plugins > Manage Plugins)から拡張機能をインストールできます。

Plugin Manager

手動インストール

拡張機能を手動でインストールするには、このリポジトリをBinary Ninja のプラグインフォルダーにコピーします。

[任意] MCP クライアントの手動セットアップ

対応している MCP クライアントを使用し、上記のインストール手順に従った場合、手動でセットアップする必要はありません。

MCP クライアントのエントリーは、コマンドラインから管理することもできます。

python scripts/mcp_client_installer.py --install    # auto setup supported MCP clients
python scripts/mcp_client_installer.py --uninstall  # remove entries and delete `.mcp_auto_setup_done`
python scripts/mcp_client_installer.py --config     # print a generic JSON config snippet
npm パッケージを使用する(推奨)

MCP クライアントをセットアップするには、公式 npm パッケージを使用する方法を推奨します。

npx -y binary-ninja-mcp

MCP クライアントには、次の設定を使用してください。

{
  "mcpServers": {
    "binary-ninja-mcp": {
      "command": "npx",
      "args": ["-y", "binary-ninja-mcp", "--host", "localhost", "--port", "9009"]
    }
  }
}

または、グローバルにインストールした場合:

{
  "mcpServers": {
    "binary-ninja-mcp": {
      "command": "binary-ninja-mcp",
      "args": ["--host", "localhost", "--port", "9009"]
    }
  }
}
Python ブリッジを使用する(レガシー)

その他の MCP クライアントでは、Python ブリッジを直接使用してください。

{
    "mcpServers": {
        "binary_ninja_mcp": {
            "command": "/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/.venv/bin/python",
            "args": [
                "/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/bridge/binja_mcp_bridge.py"
            ]
        }
    }
}

注:/ABSOLUTE/PATH/TO をプロジェクトディレクトリの実際の絶対パスに置き換えてください。インストール済みの依存関係にアクセスするには、仮想環境の Python インタープリターを使用する必要があります。

使用方法

  1. Binary Ninja を開き、バイナリを読み込みます
  2. 左下に表示されるボタンをクリックします
  3. MCP クライアントから使用を開始します

これで、現在開いているバイナリ(または複数のバイナリ)について、LLM にプロンプトを送信できます。プロンプトの例:

CTF チャレンジ
You're the best CTF player in the world. Please solve this reversing CTF challenge in the <folder_name> folder using Binary Ninja. Rename ALL the function and the variables during your analyzation process (except for main function) so I can better read the code. Write a python solve script if you need. Also, if you need to create struct or anything, please go ahead. Reverse the code like a human reverser so that I can read the decompiled code that analyzed by you.
マルウェア解析
Your task is to analyze an unknown file which is currently open in Binary Ninja. You can use the existing MCP server called "binary_ninja_mcp" to interact with the Binary Ninja instance and retrieve information, using the tools made available by this server. In general use the following strategy:

- Start from the entry point of the code
- If this function call others, make sure to follow through the calls and analyze these functions as well to understand their context
- If more details are necessary, disassemble or decompile the function and add comments with your findings
- Inspect the decompilation and add comments with your findings to important areas of code
- Add a comment to each function with a brief summary of what it does
- Rename variables and function parameters to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive, using mcp_ as prefix.
- NEVER convert number bases yourself. Use the convert_number MCP tool if needed!
- When you finish your analysis, report how long the analysis took
- At the end, create a report with your findings.
- Based only on these findings, make an assessment on whether the file is malicious or not.

対応機能

以下の表に、使用可能な MCP 関数を示します。

関数説明
decompile_function名前を指定して特定の関数を逆コンパイルし、アドレス付きの HLIL 風コードを返します。
get_il(name_or_address, view, ssa)関数の IL を hlil、mlil、llil のいずれかで取得します(MLIL/LLIL では SSA に対応しています)。
define_typesC の文字列形式の型定義から型定義を追加します。
delete_comment特定のアドレスにあるコメントを削除します。
delete_function_comment関数のコメントを削除します。
declare_c_type(c_declaration)1 つの C 宣言からローカル型を作成または更新します。
format_value(address, text, size)値を変換し、BN のアドレスに注釈を付けます(コメントを追加します)。
function_atアドレスが属する関数の名前を取得します。
fetch_disassembly名前またはアドレスを指定して、関数のアセンブリ表現を取得します。
get_entry_points()読み込まれたバイナリのエントリーポイントを一覧表示します。
get_binary_status読み込まれたバイナリの現在のステータスを取得します。
get_comment特定のアドレスにあるコメントを取得します。
get_function_comment関数のコメントを取得します。
get_user_defined_typeユーザー定義型(構造体、列挙型、typedef、共用体)の定義を取得します。
get_xrefs_to(address)アドレスへのすべてのクロスリファレンス(コードとデータ)を取得します。
get_data_decl(name_or_address, length)データシンボルまたはアドレスの C 風宣言とヘックスダンプを返します。
hexdump_address(address, length)アドレスのテキスト形式のヘックスダンプを取得します。length < 0 の場合、可能であれば定義済みのサイズを正確に読み取ります。
hexdump_data(name_or_address, length)データシンボル名またはアドレスを指定してヘックスダンプを取得します。length < 0 の場合、可能であれば定義済みのサイズを正確に読み取ります。
get_xrefs_to_enum(enum_name)列挙型に関連する使用箇所を取得します(コード内のメンバー定数に一致します)。
get_xrefs_to_field(struct_name, field_name)名前付き構造体フィールドへのすべてのクロスリファレンスを取得します。
get_xrefs_to_struct(struct_name)構造体に関連するクロスリファレンス/使用箇所(メンバー、グローバル変数、コード参照)を取得します。
get_xrefs_to_type(type_name)構造体/型に関連するクロスリファレンス/使用箇所(グローバル変数、参照、HLIL の一致箇所)を取得します。
get_xrefs_to_union(union_name)共用体に関連するクロスリファレンス/使用箇所(メンバー、グローバル変数、コード参照)を取得します。
get_stack_frame_vars(function_identifier)関数のスタックフレーム変数の情報(名前、オフセット、サイズ、型)を取得します。
get_type_info(type_name)型を解決し、宣言、種類、メンバーを返します。
get_callers(identifiers)1 つ以上の関数識別子について、呼び出し元と呼び出し箇所を一覧表示します。
get_callees(identifiers)1 つ以上の関数識別子について、呼び出し先と呼び出し箇所を一覧表示します。
make_function_at(address, platform)アドレスに関数を作成します。platform は省略可能です。BinaryView/プラットフォームの既定値を選択するには default を指定します。
list_platforms()利用可能なプラットフォーム名をすべて一覧表示します。
list_binaries()管理中/オープン中のバイナリを ID とアクティブフラグとともに一覧表示します。
select_binary(view)ID またはファイル名でアクティブなバイナリを選択します。
list_all_strings()すべての文字列を一覧表示します(ページネーションなし。すべてのページを集約します)。
list_classesプログラム内の名前空間/クラス名をすべて一覧表示します。
list_data_items定義済みのデータラベルとその値を一覧表示します。
list_exportsエクスポートされた関数/シンボルを一覧表示します。
list_importsプログラム内でインポートされたシンボルを一覧表示します。
list_local_types(offset, count)現在のデータベースにあるローカル型を一覧表示します(名前/種類/宣言)。
list_methodsプログラム内の関数名をすべて一覧表示します。
list_namespacesプログラム内のグローバル以外の名前空間をすべて一覧表示します。
list_segmentsプログラム内のメモリーセグメントをすべて一覧表示します。
list_strings(offset, count)データベース内のすべての文字列を一覧表示します(ページネーションあり)。
list_strings_filter(offset, count, filter)条件に一致する文字列を一覧表示します(部分文字列で絞り込み、ページネーションあり)。
rename_data指定したアドレスにあるデータラベルの名前を変更します。
rename_function現在の名前を指定して、関数を新しいユーザー定義名に変更します。
rename_single_variable関数内のローカル変数 1 つの名前を変更します。
rename_multi_variables関数内の複数のローカル変数の名前を一括変更します(マッピングまたはペアを指定)。
set_local_variable_type(function_address, variable_name, new_type)ローカル変数の型を設定します。
retype_variable指定した関数内の変数の型を変更します。
search_functions_by_name名前に指定した部分文字列を含む関数を検索します。
search_types(query, offset, count)部分文字列でローカル型を検索します(名前/宣言)。
set_comment特定のアドレスにコメントを設定します。
set_function_comment関数にコメントを設定します。
set_function_prototype(name_or_address, prototype)名前またはアドレスを指定して関数のプロトタイプを設定します。
patch_bytes(address, data, save_to_file)アドレスの生バイトをパッチします(アセンブリ単位ではありません)。バイトコードを指定することで、命令全体にパッチを適用できます。アドレス:16 進数(例:「0x401000」)または 10 進数。データ:16 進文字列(例:「90 90」)。save_to_file(既定値は True)を指定するとディスクに保存し、macOS では再署名します。
呼び出し可能な HTTP エンドポイントの一覧です。
  • /allStrings: すべての文字列を 1 つのレスポンスで返します。
  • /formatValue?address=<addr>&text=<value>&size=<n>: 値を変換し、アドレスにコメントを設定します。
  • /getXrefsTo?address=<addr>: アドレスへのクロスリファレンス(コード+データ)を返します。
  • /getDataDecl?name=<symbol>|address=<addr>&length=<n>: データシンボルまたはアドレスについて、宣言形式の文字列とヘックスダンプを含む JSON を返します。キー:address、name、size、type、decl、hexdump。length < 0 の場合、定義済みサイズが利用できれば、そのサイズを正確に読み取ります。
  • /hexdump?address=<addr>&length=<n>: アドレスに合わせて配置したテキスト形式のヘックスダンプを返します。length < 0 の場合、定義済みサイズが利用できれば、そのサイズを正確に読み取ります。
  • /hexdumpByName?name=<symbol>&length=<n>: シンボル名を指定してテキスト形式のヘックスダンプを返します。data_<hex>、byte_<hex>、word_<hex>、dword_<hex>、qword_<hex>、off_<hex>、unk_<hex> のような BN の自動ラベルと、単純な 16 進数のアドレスを認識します。
  • /makeFunctionAt?address=<addr>&platform=<name|default>: アドレスに関数を作成します(すでに存在する場合は何も変更しません)。platform=default の場合、BinaryView/プラットフォームのデフォルトを使用します。
  • /platforms: 使用可能なプラットフォーム名をすべて一覧表示します。
  • /binaries または /views: 管理対象/開いているバイナリを ID とアクティブフラグとともに一覧表示します。
  • /selectBinary?view=<id|filename>: 以降の操作で使用するアクティブなバイナリを選択します。
  • /data?offset=<n>&limit=<m>&length=<n>: プレビュー付きの定義済みデータ項目を返します。length は項目ごとに読み取るバイト数を指定します(定義済みサイズが上限です)。デフォルトの動作では、定義済みサイズが利用できればそのサイズを正確に読み取ります。length=-1 を指定すると、正確なサイズを強制的に読み取ります。
  • /getXrefsToEnum?name=<enum>: メンバー定数に一致する列挙型の使用箇所を返します。
  • /getXrefsToField?struct=<name>&field=<name>: 構造体フィールドへのクロスリファレンスを返します。
  • /getXrefsToType?name=<type>: 構造体/型名に関連するクロスリファレンス/使用箇所を返します。
  • /getTypeInfo?name=<type>: 型を解決し、宣言と詳細を返します。
  • /getXrefsToUnion?name=<union>: 共用体へのクロスリファレンス/使用箇所(メンバー、グローバル、参照)を返します。
  • /getStackFrameVars?name=<function>|address=<addr>: 関数のスタックフレーム変数情報を取得します。
  • /getCallers?identifiers=<name|addr>[,...]: 1 つ以上の識別子について、呼び出し元の概要(関数、呼び出し箇所、HLIL/IL スニペット)を返します。クエリパラメーター identifiers、identifier、names、または addresses を受け付けます。
  • /getCallees?identifiers=<name|addr>[,...]: /getCallers と同じスキーマで呼び出し先の概要を返し、リクエスト内の識別子ごとにすべての呼び出し先を詳述します。
  • /localTypes?offset=<n>&limit=<m>: ローカル型を一覧表示します。
  • /strings?offset=<n>&limit=<m>: 文字列をページ分割して返します。
  • /strings/filter?offset=<n>&limit=<m>&filter=<substr>: 条件で絞り込んだ文字列を返します。
  • /searchTypes?query=<substr>&offset=<n>&limit=<m>: 部分文字列でローカル型を検索します。
  • /patch または /patchBytes?address=<addr>&data=<hex>&save_to_file=<bool>: アドレスにある生バイトをパッチします(アセンブリではなく、バイト単位)。命令全体をパッチするには、そのバイトコードを指定します。アドレス:16 進数(例:"0x401000")または 10 進数。データ:16 進数の文字列(例:"90 90")。save_to_file(デフォルトは True)を指定すると、ディスクに保存し、macOS では再署名します。
  • /renameVariables: 関数内のローカル変数を一括でリネームします。パラメーター:
    • 関数:functionAddress、address、function、functionName、または name のいずれか。
    • 次のいずれかの方法でリネームを指定します。
      • renames:{old, new} オブジェクトの JSON 配列
      • mapping:old->new の JSON オブジェクト
      • pairs:old1:new1,old2:new2 形式のコンパクトな文字列 項目ごとの結果と合計を返します。順序が保持されるため、後続のペアでは先行する新しい名前を参照できます。

開発

コード品質

このプロジェクトでは、リンティングとフォーマットに Ruff を使用しています。設定は ruff.toml にあります。

Ruff を手動で実行する

問題を確認します。

ruff check .

問題を自動修正します。

ruff check --fix .

フォーマットの問題を確認します。

ruff format --check .

コードをフォーマットします。

ruff format .
GitHub Actions

GitHub Actions のワークフロー(.github/workflows/lint-format.yml)では、Ruff が次の場合に自動実行されます。

  • main ブランチへのすべてのプッシュ
  • main ブランチを対象とするすべてのプルリクエスト

リンティングエラーまたはフォーマットの問題がある場合、ワークフローは失敗し、CI でコード品質が保たれます。

貢献

貢献を歓迎します。お気軽にプルリクエストをお送りください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。