
Headless Binary Ninja MCP server — ermöglicht KI-Agenten tiefgehende Reverse-Engineering-Fähigkeiten über 180 Tools.
Ein Headless-Binary Ninja-Server, der MCP (Model Context Protocol) spricht und KI-Agenten vollen Zugriff auf tiefgehende Reverse-Engineering-Workflows gibt – Disassemblierung, IL, Patching, Typen, Querverweise und mehr – ohne GUI.
Entwickelt, um im gleichen Docker-Container wie die Agenten-Laufzeitumgebung zu laufen. Keine Sidecars, keine zusätzlichen Dienste.
Dieses gesamte Projekt – Code, Tests und Dokumentation – ist zu 100 % Vibe-coded.
Existierende Binary Ninja MCP-Server sind entweder GUI-gebunden oder bieten nur eine begrenzte Werkzeugoberfläche. Dieser Server ist ausschließlich headless und für agentengesteuerte Workflows in sandbox-VM/Containerumgebungen konzipiert: Der Agent erhält die vollständige Kontrolle über das Analysesystem, automatisiert große Teile des Reverse Engineerings, während Sie interaktiv diskutieren und den Prozess steuern.
Das Ziel ist eine Schnittstelle, bei der Agenten eine Analyse im Laufe der Zeit inspizieren, verfeinern und erweitern können – Aktualisieren von Typen, Symbolen und Metadaten, inkrementelles Verbessern der Analysedatenbank, Anwenden von Patches und sicheres Iterieren mit Rückgängig/Wiederholen sowie Ausführen benutzerdefinierter Skripte, wenn ein Workflow etwas Maßgeschneidertes benötigt.
binja.eval und binja.call für alles, was der Werkzeugkatalog nicht abdeckt.3.11+binaryninja-Python-Modul in Ihrer Laufzeitumgebung (für echte Analyse)git clone https://github.com/mrphrazer/binary-ninja-headless-mcp.git
cd binary-ninja-headless-mcp
pip install .
Oder direkt aus dem Repository-Root installieren ohne Klonen:
pip install git+https://github.com/mrphrazer/binary-ninja-headless-mcp.git
Stdio-Transport (Standard):
python3 binary_ninja_headless_mcp.py
TCP-Transport:
python3 binary_ninja_headless_mcp.py --transport tcp --host 127.0.0.1 --port 8765
Fake-Backend-Modus (kein Binary Ninja erforderlich):
python3 binary_ninja_headless_mcp.py --fake-backend
Dieser Server spricht standardmäßig MCP über stdio (Standard) oder tcp, sodass jeder MCP-fähige Agenten-Host ihn nutzen kann.
claude mcp add binary_ninja_headless_mcp -- python3 /path/to/binary-ninja-headless-mcp/binary_ninja_headless_mcp.py
Oder fügen Sie es der .mcp.json Ihres Projekts hinzu:
{
"mcpServers": {
"binary_ninja_headless_mcp": {
"command": "python3",
"args": ["binary_ninja_headless_mcp.py"],
"cwd": "/path/to/binary-ninja-headless-mcp"
}
}
}
codex mcp add binary_ninja_headless_mcp -- python3 binary_ninja_headless_mcp.py
binary_ninja_headless_mcp.python3 mit den Argumenten ["binary_ninja_headless_mcp.py"] wenn cwd das Repository-Root ist, oder verwenden Sie einen absoluten Skriptpfad in args.cwd auf den Repository-Pfad, wenn relative Pfade wie samples/ls korrekt aufgelöst werden sollen.--fake-backend hinzu.health.ping, dann session.open.Empfohlenes Bereitstellungsmodell: Führen Sie den Agentenprozess und diesen MCP-Server im selben Container-Image aus.
Beispiel-Basisimage:
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN python -m pip install --upgrade pip && pip install ruff pytest
CMD ["python3", "binary_ninja_headless_mcp.py"]
Falls Sie eine echte Binary Ninja-Analyse im Container benötigen, fügen Sie Ihre Binary Ninja-Laufzeitumgebung und Lizenz im selben Image hinzu und starten Sie den Agenten mit diesem konfigurierten MCP-Server.
initializepingtools/listtools/callshutdownVerhalten von tools/list:
offset oder limit angegeben ist, wird eine seitenweise Ausgabe verwendet (offset=0, limit=50 Standard im Seitenmodus).prefix (z. B. binary.)query (Teilstring-Übereinstimmung mit Werkzeugname/-beschreibung)offset, limit, total, has_more.has_more=true), werden next_offset und ein notice-Hinweis eingefügt.Verhalten von Werkzeugaufruf-Antworten:
structuredContent ist die kanonische vollständige Nutzlast.content[0].text ist eine kompakte Zusammenfassungszeichenfolge (keine vollständige JSON-Duplizierung).Dieses Repository ist gut getestet und hat durchgesetzte Qualitätsgates.
pytest --collect-only -q für die aktuelle Anzahl der gesammelten Tests aus.ruff format --check .ruff check .pytestBINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1, sodass Prüfungen ohne Binary Ninja-Installation ausgeführt werden können.read_only=true).binary.basic_blocks_at und function.basic_blocks werden seitenweise ausgegeben (offset/limit).memory.read hat eine harte Antwortbegrenzung: length ≤ 65536.stdio/tcp) ist standardmäßig nicht authentifiziert.binja.eval und breiten API-Zugriff über binja.call.ruff format --check .
ruff check .
BINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1 pytest -q
Verwenden Sie den integrierten MCP-Feature-Fuzzer, um eine breite Werkzeugoberfläche gegen samples/ls zu testen.
Echtes Binary Ninja-Backend:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --iterations 120 --seed 1337
Fake-Backend-Smoke-Test:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --fake-backend --iterations 20
JSON-Coverage-Bericht schreiben:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --report-json /tmp/mcp-fuzzer-report.json
Nützliche Flags:
--min-success-tools N: Beendet sich mit einem Fehler, wenn weniger als N Werkzeuge erfolgreich waren.--verbose: Gibt jeden Werkzeugaufruf während des Fuzzings aus.--update-analysis: Öffnet die Seedsitzung mit update_analysis=true.Der Server stellt derzeit 181 Werkzeuge in 36 Funktionsgruppen bereit.
analysis.status: Analysestatus abrufenanalysis.progress: Analysestand-Momentaufnahme abrufenanalysis.update: Asynchrone Analyseaktualisierung auslösenanalysis.update_and_wait: Analyseaktualisierung ausführen und auf Abschluss wartenanalysis.abort: Analyse abbrechenanalysis.set_hold: Analysewarteschlange anhalten/freigebenannotation.rename_function: Funktion umbenennenannotation.rename_symbol: Symbol an Adresse umbenennenannotation.undefine_symbol: Benutzersymbol an Adresse undefinierenannotation.define_symbol: Symbol an Adresse definierenannotation.rename_data_var: Datenvariable umbenennenannotation.define_data_var: Datenvariable definierenannotation.undefine_data_var: Datenvariable undefinierenannotation.set_comment: Kommentar an Adresse setzenannotation.get_comment: Kommentar an Adresse abrufenannotation.add_tag: Benutzerdaten-Tag an Adresse hinzufügenannotation.get_tags: Tags an Adresse abrufenarch.info: Architektur- und Plattformmetadaten abrufenarch.disasm_bytes: Bytes mit ausgewählter Architektur disassemblierenarch.assemble: Befehlstext mit ausgewählter Architektur assemblierenbaseaddr.detect: Basisadresserkennung ausführenbaseaddr.reasons: Gründe für Basisadresserkennung abrufenbaseaddr.abort: Basisadresserkennung abbrechenbinary.summary: Binär-/Sitzungszusammenfassung abrufenbinary.save: Aktuelle Binäransicht in einem Dateipfad speichernbinary.functions: Funktionen seitenweise auflistenbinary.strings: Gefundene Zeichenketten seitenweise auflistenbinary.search_text: Rohtext/-bytes in einer Sitzung durchsuchenbinary.sections: Abschnitte seitenweise auflistenbinary.segments: Segmente seitenweise auflistenbinary.symbols: Symbole seitenweise auflistenbinary.data_vars: Datenvariablen seitenweise auflistenbinary.get_function_at: Funktion anhand der Adresse findenbinary.get_function_disassembly_at: Vollständige Disassemblierung für die Funktion abrufen, die eine Adresse enthältbinary.get_function_il_at: Vollständige IL für die Funktion abrufen, die eine Adresse enthältbinja.info: Binary Ninja-Version/Installationsinfo zurückgebenbinja.call: Generische API-Brücke: bn.* oder bv.* Zielpfad aufrufenbinja.eval: Python-Code mit bn, sessions und optionalem bv auswertendata.typed_at: Typisierte Datenvariable an einer Adresse abrufendatabase.create_bndb: .bndb aus Sitzung erstellendatabase.save_auto_snapshot: Automatische Momentaufnahme speicherndatabase.info: Datenbankstatus für Sitzung abrufendatabase.snapshots: Datenbank-Momentaufnahmen auflistendatabase.read_global: Globalen Datenbank-String-Schlüssel lesendatabase.write_global: Globalen Datenbank-String-Schlüssel schreibendebug.parsers: Für diese Ansicht gültige Debuginfo-Parser auflistendebug.parse_and_apply: Debuginfo parsen und auf die Ansicht anwendendisasm.linear: Lineare Disassemblierungszeilen abrufendisasm.function: Vollständige Disassemblierung für die Funktion abrufen, die eine Adresse enthältdisasm.range: Disassemblierungszeilen für einen Adressbereichexternal.library_add: Externe Bibliothek hinzufügenexternal.library_list: Externe Bibliotheken auflistenexternal.library_remove: Externe Bibliothek entfernenexternal.location_add: Externe Standortzuordnung hinzufügenexternal.location_get: Externe Standortzuordnung abrufenexternal.location_remove: Externe Standortzuordnung entfernenfunction.basic_blocks: Grundblöcke in einer Funktion seitenweise auflistenfunction.callers: Aufrufer einer Funktionfunction.callees: Aufgerufene einer Funktionfunction.variables: Funktionsvariablen auflistenfunction.var_refs: Variablenreferenzen in MLIL/HLIL auflistenfunction.var_refs_from: Variablenreferenzen, die von einer Adresse ausgehen, auflistenfunction.ssa_var_def_use: SSA-Variablendefinition und -verwendungen abrufenfunction.ssa_memory_def_use: SSA-Speicherdefinition und -verwendungen nach Speicherversion abrufenfunction.metadata_store: Funktionsmetadaten nach Schlüssel speichernfunction.metadata_query: Funktionsmetadaten nach Schlüssel abfragenfunction.metadata_remove: Funktionsmetadaten nach Schlüssel entfernenhealth.ping: Gesundheitsprüfungil.function: IL-Funktionslisteil.instruction_by_addr: IL-Befehl nach Quelladresse abrufenil.address_to_index: Adresse auf IL-Index/Indizes abbildenil.index_to_address: IL-Index auf Quelladresse abbildenil.rewrite.capabilities: IL-Umschreibungsunterstützung für eine Funktion und IL-Ebene auflistenil.rewrite.noop_replace: No-op-IL-Ausdrucksersetzung durchführenil.rewrite.translate_identity: IL mit Identitätszuordnungs-Callback übersetzenloader.rebase: BinaryView neu basierenloader.load_settings_types: Typnamen der Ladeeinstellungen auflistenloader.load_settings_get: Werte der Ladeeinstellungen abrufenloader.load_settings_set: Einen Ladeeinstellungswert setzenmemory.read: Bytes aus der Ansicht lesen (length <= 65536)memory.write: Bytes (hex) in die Ansicht schreibenmemory.insert: Bytes (hex) in die Ansicht einfügenmemory.remove: Bytes aus der Ansicht entfernenmemory.reader_read: Ganzzahlwerte über BinaryReader lesenmemory.writer_write: Ganzzahlwerte über BinaryWriter schreibenmcp.response_format: Erklärt Werkzeug-Ergebnisfelder (structuredContent vollständige Nutzlast, content[0].text Zusammenfassung)metadata.store: Metadaten nach Schlüssel speichernmetadata.query: Metadaten nach Schlüssel abfragenmetadata.remove: Metadaten nach Schlüssel entfernenpatch.assemble: Befehlsbytes an Adresse assemblieren und patchenpatch.status: Patch-Verfügbarkeit an Adresse überprüfenpatch.convert_to_nop: Befehl auf NOP patchen, wenn unterstütztpatch.always_branch: Bedingten Sprung auf immer springen patchen, wenn unterstütztpatch.never_branch: Bedingten Sprung auf nie springen patchen, wenn unterstütztpatch.invert_branch: Bedingten Sprung durch Invertierung patchen, wenn unterstütztpatch.skip_and_return_value: Befehl auf Überspringen und Wert zurückgeben patchen, wenn unterstütztplugin.valid_commands: Kontextgültige Plugin-Befehle auflistenplugin.execute: Kontextgültigen Plugin-Befehl ausführenplugin_repo.status: Plugin-Repositories und Plugin-Status auflistenplugin_repo.check_updates: Plugin-Repository-Updates überprüfenplugin_repo.plugin_action: Installations-/Deinstallations-/Aktivierungs-/Deaktivierungsaktion für Repository-Plugin ausführenproject.create: Projekt erstellenproject.open: Projekt öffnenproject.close: Verfolgtes Projekt schließenproject.list: Projektordner/-dateien auflistenproject.create_folder: Projektordner erstellenproject.create_file: Projektdatei aus Base64-Daten erstellenproject.metadata_store: Projektmetadaten speichernproject.metadata_query: Projektmetadaten abfragenproject.metadata_remove: Projektmetadaten entfernensearch.data: Nach rohen Bytesmustern suchen (Hex-String)search.next_text: Nächste Textübereinstimmung findensearch.all_text: Alle Textübereinstimmungen im Bereich finden (Regex optional)search.next_data: Nächste Daten-/Bytesmuster-Übereinstimmung findensearch.all_data: Alle Daten-/Bytesmuster-Übereinstimmungen im Bereich findensearch.next_constant: Nächstes Konstantenvorkommen findensearch.all_constant: Alle Konstantenvorkommen im Bereich findensection.add_user: Benutzerabschnitt hinzufügensection.remove_user: Benutzerabschnitt entfernensegment.add_user: Benutzersegment hinzufügensegment.remove_user: Benutzersegment entfernensession.open: Binärdatei öffnen und Sitzung erstellensession.open_bytes: Binärsitzung aus Base64-kodierten Bytes öffnensession.open_existing: Weitere Sitzung aus der Datei einer bestehenden Sitzung öffnensession.close: Eine offene Sitzung schließensession.list: Offene Sitzungen auflistensession.mode: Sicherheits-/Determinismusmodus der Sitzung abrufensession.set_mode: Sicherheits-/Determinismusmodus der Sitzung aktualisierentask.analysis_update: Asynchrone Analyseaktualisierungsaufgabe startentask.search_text: Asynchrone Suchaufgabe startentask.status: Aufgabenstatus abrufentask.result: Aufgabenergebnis abrufentask.cancel: Aufgabe abbrechen (bestmöglich)transform.inspect: Transformations-Extraktionspipeline inspizieren/verarbeitentype.parse_string: Einzelnen Typ-String parsentype.parse_declarations: C-Deklarationen für Typen/Variablen/Funktionen parsentype.define_user: Benutzertyp aus Typquelle definierentype.rename: Typ umbenennentype.undefine_user: Benutzertyp undefinierentype.import_library_type: Typ aus Typbibliothek importierentype.import_library_object: Objekttyp aus Typbibliothek importierentype.export_to_library: Typ in Typbibliothek exportierentype_archive.create: Typarchiv erstellen und optional anhängentype_archive.open: Typarchiv öffnen und optional anhängentype_archive.list: Angehängte Typarchive auflistentype_archive.get: Ein verfolgtes Typarchiv abrufentype_archive.pull: Typen aus einem Typarchiv ziehentype_archive.push: Typen in ein Typarchiv schiebentype_archive.references: Eingehende/ausgehende Archivreferenzen für einen Typ abfragentype_library.create: Typbibliothek erstellen und optional anhängentype_library.load: Typbibliothek laden und optional anhängentype_library.list: An die Ansicht angehängte Typbibliotheken auflistentype_library.get: Eine verfolgte Typbibliothek abrufenuidf.parse_possible_value: Benutzerinformierten möglichen Wertsatz-String parsenuidf.set_user_var_value: Funktionsbenutzervariablenwert setzenuidf.clear_user_var_value: Funktionsbenutzervariablenwert löschenuidf.list_user_var_values: Alle Benutzervariablenwerte für eine Funktion auflistenundo.begin: Rückgängig-Transaktion beginnenundo.commit: Rückgängig-Transaktion festschreibenundo.revert: Rückgängig-Transaktion rückgängig machenundo.undo: Rückgängig durchführenundo.redo: Wiederholen durchführenvalue.reg: Registerwert an/nach einer Adresse abrufenvalue.stack: Stack-Inhalte an/nach einer Adresse abrufenvalue.possible: Möglichen IL-Wertsatz an einer Adresse abrufenvalue.flags_at: Gelifteten IL-Flag-Lese-/Schreibzustand an einer Adresse abrufenworkflow.list: Registrierte Workflows auflistenworkflow.describe: Workflow-Topologie und -Einstellungen beschreibenworkflow.clone: Workflow klonenworkflow.insert: Aktivitäten vor einer Aktivität einfügenworkflow.insert_after: Aktivitäten nach einer Aktivität einfügenworkflow.remove: Workflow-Aktivität entfernenworkflow.graph: Workflow-Graphen zusammenfassenworkflow.machine.status: Workflow-Maschinenstatus abrufenworkflow.machine.control: Workflow-Maschinenlaufzeit steuernxref.code_refs_to: Code-Referenzen auf eine Adressexref.code_refs_from: Code-Referenzen von einer Adressexref.data_refs_to: Datenreferenzen auf eine Adressexref.data_refs_from: Datenreferenzen von einer AdresseFür weitere Informationen kontaktieren Sie Tim Blazytko (@mr_phrazer).
binary.functions_at: Funktionen an einer Adresse auflistenbinary.basic_blocks_at: Grundblöcke an einer Adresse seitenweise auflisten