Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ghidra_svr_bridge — Plugin Binary Ninja qui synchronise l'analyse de manière bidirectionnelle avec un dépôt Ghidra Server, via un sous-processus de pont Java. | Kitploit
Outils/GitHubGitHub/gmh5225/ghidra_svr_bridge
Analyse StatiqueAnalyse de CodeRétro-ingénierieScripting et AutomatisationUtilitaires et FrameworksAnalyse de Binaires
GitHubgmh5225/ghidra_svr_bridge

ghidra_svr_bridge

Plugin Binary Ninja qui synchronise l'analyse de manière bidirectionnelle avec un dépôt Ghidra Server, via un sous-processus de pont Java.

Voir le dépôt
2il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

binja-ghidra

Un plugin Binary Ninja qui se connecte à un dépôt Ghidra Server et importe son analyse — symboles, noms de fonctions et commentaires — directement dans une vue binaire Binary Ninja ouverte.

Ce qu'il fait

Ghidra et Binary Ninja ont chacun leurs forces. Ce plugin vous permet d'utiliser les deux sur le même binaire sans copier manuellement les noms ou les commentaires entre eux. Connectez-vous à un Ghidra Server en cours d'exécution, parcourez ses dépôts, et double-cliquez sur n'importe quel fichier de projet pour extraire son analyse dans la vue BN actuellement ouverte.

La synchronisation se fait dans les deux sens.

BN ← Ghidra (import)BN → Ghidra (checkin)
Symboles (labels, noms de fonctions)✓✓
Commentaires (EOL/PRE/POST/PLATE/REP)✓✓
Signatures de fonctions (type de retour, convention d'appel)✓✓
Paramètres de fonctions (renommer, retyper, ajouter)✓✓
Types de données (struct/union/enum/typedef + pointeur/tableau)✓✓
Équates (noms de constantes + références)✓✓
Signets✓✓
Éléments de données typés✓✓
Indicateurs de fonctions (thunk, no-return, inline)✓ en tant que tags BN—
Variables locales (sensibles au stockage)✓partiel — le mapping du stockage par registre n'est pas implémenté

Architecture

root@kitploit:~
Binary Ninja (C++ plugin)
    │  TCP / newline-delimited JSON
    ▼
ghidra-bridge-*.jar  (Java, runs as a subprocess)
    │  Java RMI / SSL
    ▼
Ghidra Server  (ghidraSvr, running on the network)

Le plugin lance un sous-processus Java (le « bridge ») au chargement. Le bridge maintient la connexion RMI vers le Ghidra Server et parle un protocole JSON simple au plugin via un socket TCP local. Cela garde tout le code Java/RMI hors du processus C++ et permet à la JVM de démarrer en arrière-plan pendant que BN termine son chargement.

La JVM du bridge initialise également le framework Application de Ghidra au démarrage, afin que le chemin d'écriture puisse utiliser les API de haut niveau du modèle de programme de Ghidra (ProgramDB, DataTypeManager, SymbolTable, FunctionManager) plutôt que des écritures brutes db.Table.putRecord() — voir Checkin write path ci-dessous.

Composants

CheminLangageRôle
plugin/C++ / Qt6Plugin de barre latérale Binary Ninja
bridge/Java 17Client RMI Ghidra + serveur bridge JSON

Plugin (C++) :

  • plugin.cpp — enregistre les paramètres et le widget de barre latérale ; démarre la JVM du bridge au chargement
  • GhidraConnection.cpp — singleton ; gère le cycle de vie du bridge et toutes les opérations basées sur RMI
  • BridgeProcess.cpp — lance le JAR du bridge comme sous-processus avec des pipes stdout/stderr ; lit la ligne de handshake READY port=N
  • BridgeClient.cpp — client TCP ; envoie des requêtes JSON, reçoit des réponses, distribue les événements asynchrones
  • SyncEngine.cpp — applique un GhidraDbExport à un BinaryView (symboles, commentaires, indicateurs)
  • ui/ProjectPanel.cpp — widget de barre latérale : arborescence des dépôts, boîte de dialogue de connexion, journal d'activité
  • ui/ConnectDialog.cpp — boîte de dialogue hôte/port/utilisateur/mot de passe

Bridge (Java) :

  • BridgeMain.java — analyse des arguments ; initialise UniversalIdGenerator et le framework Application de Ghidra ; démarre le serveur TCP ; affiche READY port=N sur stdout
  • BridgeServer.java — accepte une connexion client TCP et lui attribue une BridgeConnection
  • BridgeConnection.java — répartiteur de requêtes JSON ; sérialise les réponses de l'API Ghidra en JSON ; gère opCheckin (crée une nouvelle version du programme sur le serveur)
  • GhidraSession.java — session RMI authentifiée ; encapsule RemoteRepositoryServerHandle
  • EventStreamer.java — thread d'arrière-plan par dépôt ouvert ; pousse les RepositoryChangeEvent vers le plugin sous forme d'événements JSON asynchrones
  • DatabaseExporter.java — chemin de lecture : extrait les tables symboles/commentaires/indicateurs de fonctions/types de données/équates/signets d'un ManagedBufferFileHandle (le buffer de base de données distant de Ghidra) via un accès brut à db.jar
  • ProgramApplier.java — chemin d'écriture : ouvre le fichier buffer comme un véritable ProgramDB et applique tous les changements côté BN via les API de haut niveau de Ghidra (voir Checkin write path ci-dessous)
  • DatabaseImporter.java — helpers d'écriture brute hérités conservés uniquement comme point de test ; la méthode apply(...) de production délègue à ProgramApplier

Checkin write path

opCheckin ouvre le fichier buffer managé du programme en mode écriture, construit un ProgramDB par-dessus, et applique les changements côté BN via les API du modèle de programme de Ghidra. Les écritures brutes db.Table.putRecord() sont évitées — elles étaient la source de tous les bugs de corruption de checkin que nous avons rencontrés :

Écriture au mauvais niveauMode de défaillance
setIntValue(col, longTypeId) sur la table Function DataIntField.setLongValue tronque silencieusement via l2i → StackPurge corrompu à chaque mise à jour de signature
setByteValue(col, isUnion) sur V5V6 Composite Data Typesla colonne est un BooleanField dans Ghidra 12.x → IllegalFieldAccessException (« Illegal field access »)
setIntValue(col, 0) sur la colonne V2 Typedef Flagsla colonne est un ShortField → même crash, schéma différent
Écriture d'un en-tête composite sans lignes de paramètres de composantsCompositeEditorModel.cloneAllComponentSettings lève une ArrayIndexOutOfBoundsException quand la struct est ouverte dans Ghidra
Écriture d'un symbole PARAMETER avec SYM_ADDR_COL = adresse RAMAddress is not a VariableAddress levée par FunctionDB.loadSymbolBasedVariables à tout accès à la fonction
Passage d'un DBChangeSet null à DBHandle.save()le serveur écrit un fichier de données de changement de 0 octet → le prochain checkout échoue avec EOFException dans ProgramContentHandler.loadProgramChangeSet

ProgramApplier n'a pas ces pièges car il passe par DataTypeManager.addDataType, SymbolTable.createLabel, Listing.setComment, Function.setReturnType, etc. — des API qui maintiennent automatiquement les invariants des tables imbriquées de Ghidra. Il exécute également une passe cleanupBadVariableSymbols au début de chaque checkin pour purger la corruption laissée dans la base de données par les anciennes versions du bridge.

server-package/CleanupBadVariableSymbols.java est un GhidraScript autonome qui exécute le même nettoyage via analyzeHeadless — utile quand un fichier est trop corrompu pour être ouvert dans l'interface graphique de Ghidra.

Tests

root@kitploit:~
./test.sh          # macOS / Linux: tiers 0-3 (C++ unit + BN-headless + Java)
test.bat           # Windows equivalent
test.bat --parity  # cross-DB parity tier only (C++ BN tests + gradlew parityTest)
test.bat --e2e     # live Ghidra-server E2E (starts a local ghidraSvr)

La suite est organisée en cinq niveaux. Les niveaux 2 à 4 existent pour prouver une propriété : les mêmes données compatibles finissent stockées à la fois dans le .bndb et dans la base de données de programme Ghidra (la matrice de compatibilité en haut de ce README).

NiveauQuoiOùCondition
0Tests unitaires pursplugin/test/*.cpp (binja-ghidra-tests), bridge *Test.javatoujours
1Aller-retour Ghidra-DBbridge *RoundTripTest.java (ProgramApplier contre un vrai ProgramDB)nécessite ghidra.home / GHIDRA_HOME
2Aller-retour BN BinaryView/.bndbplugin/test/bn/ (binja-ghidra-bn-tests ; binaryninjacore headless)SKIP proprement sans licence BN compatible headless (variable d'env BN_LICENSE honorée)
3Parité inter-DBCanonicalParityTest (C++ et Java) contre les goldens partagés dans testdata/parity/fixtures/avec les niveaux 1+2
4E2E serveur livebridge LiveServerE2ETest — démarre un vrai ghidraSvr dans un répertoire temporaire, initialise via analyzeHeadless, pilote checkout → export → checkin → re-export via RMItest.bat --e2e (définit GHIDRA_E2E=1)

Oracle de parité (niveau 3). Les deux côtés vérifient indépendamment contre le même JSON canonique versionné (la forme du DatabaseExporter du bridge). Sens de l'import : le golden se charge dans un ProgramDB (Java) et dans un BinaryView via SyncEngine (C++), et chaque ré-export doit être égal au golden. Sens du checkin : des modifications BN scriptées doivent produire exactement fixtures/checkin/*/expected-preview.json (C++), et l'application de cet aperçu via ProgramApplier doit se ré-exporter en expected-after.json (Java). Si les deux côtés correspondent aux goldens partagés, les deux bases de données concordent par transitivité. Les modes de comparaison de champs et la table de normalisation des noms de types se trouvent dans testdata/parity/RULES.md ; le binaire de test est testdata/bin/parity_x64.bin (disposition dans parity_x64.md).

Pins de régression de longue date côté Java :

  • DataTypesRoundTripTest.struct_cloneSettings_doesNotThrow — les paramètres composites doivent rester cohérents avec l'en-tête (crash cloneAllComponentSettings)
  • FunctionSignaturesRoundTripTest.returnType_doesNotCorruptStackPurge — troncature IntField
  • ParametersRoundTripTest.noParameterSymbol_endsUpAtRamAddress — invariant VariableAddress

Les tests d'aller-retour et de parité nécessitent une installation de Ghidra (utilisée à l'exécution pour les services de langage). Le chemin est lu depuis la propriété système Gradle ghidra.home ou la variable d'env GHIDRA_HOME ; build.gradle transmet ghidraHome par défaut. Les tests C++ des niveaux 2/3 nécessitent en plus que binaryninjacore soit chargeable (les scripts placent le répertoire d'installation de BN dans le PATH).

Prérequis

DépendanceNotes
Binary Ninja (commercial)Testé contre la version correspondant à api_REVISION.txt dans l'installation BN
Ghidra ServerTesté avec Ghidra 12.0.4. Doit être en cours d'exécution et joignable via RMI/SSL
Java 17+ JDKEclipse Adoptium JDK 21 recommandé
CMake 3.24+
Ninja
Compilateur C++MSVC 2022+ sous Windows ; clang sous macOS ; gcc/clang sous Linux
Qt 6.7+Voir Qt setup ci-dessous ; qmake doit être dans le PATH au moment de la compilation
Gradle (via wrapper)Le bridge utilise le wrapper Gradle — aucune installation séparée nécessaire
Poetry (build Qt uniquement)Requis uniquement lors de la compilation de Qt depuis le sous-module qt-build. Installer avec pip install poetry ou pipx install poetry.
libclang 19 (build Qt uniquement)Requis par le système de build de Qt. Voir qt-build/README.md pour les instructions de téléchargement.

Qt setup

Le plugin se lie à la même version de Qt 6 que celle utilisée par Binary Ninja. Vous avez deux options :

Option A — Utiliser une installation Qt existante (le plus rapide si vous avez déjà Qt)

Passez Qt6_DIR pointant vers votre répertoire CMake Qt :

root@kitploit:~
Qt6_DIR=/path/to/Qt/6.x.y/clang_64/lib/cmake/Qt6 ./build.sh

Sous macOS, le script de build détecte automatiquement Qt s'il a été installé par l'installateur en ligne de Qt sous /usr/local/Qt*.

Option B — Compiler Qt depuis le sous-module qt-build (~1-2 heures, une fois par machine)

Le sous-module qt-build (scripts de build Qt de Vector35) compile Qt 6 avec les patchs de Binary Ninja. Il nécessite Poetry et libclang 19 (voir Prérequis ci-dessus et qt-build/README.md).

Qt est installé dans qt/<version>/<compiler>/ à l'intérieur du dépôt :

PlateformeChemin d'installation
macOSqt/6.10.1/clang_64/
Linux x86-64qt/6.10.1/gcc_64/
Windowsqt/6.10.1/msvc2022_64/
root@kitploit:~
# First time on a new machine:
./build.sh qt          # compiles Qt — takes 1-2 hours

# All subsequent builds (Qt cached in qt/, reused automatically):
./build.sh

L'étape qt n'est nécessaire qu'une seule fois. CMake et les scripts de build détectent le Qt compilé dans qt/ à chaque exécution suivante et ignorent complètement le sous-module. Le répertoire qt/ est ignoré par git.

Compilation

Checkout frais

root@kitploit:~
git clone https://github.com/mutinylaboratories/ghidra_svr_bridge.git
cd ghidra_svr_bridge
git submodule update --init   # populates binaryninja-api and qt-build (~seconds)

Suivez ensuite la configuration Qt ci-dessus (Option A ou B), puis exécutez :

root@kitploit:~
./build.sh install

macOS / Linux

root@kitploit:~
# Incremental build of both components
./build.sh

# Full clean rebuild + install into BN plugins folder
./build.sh clean install

# Build only the C++ plugin
./build.sh plugin

# Build only the Java bridge
./build.sh bridge

# Build Qt once on a machine without Qt installed
./build.sh qt

Variables d'environnement (toutes optionnelles — le script définit des valeurs par défaut raisonnables) :

root@kitploit:~
BN_INSTALL=/Applications/Binary\ Ninja.app/Contents/MacOS
Qt6_DIR=/usr/local/Qt-6.7.2/lib/cmake/Qt6

Windows

Modifiez les chemins en haut de build.bat pour qu'ils correspondent à votre environnement avant la première utilisation :

root@kitploit:~
set "JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-21.0.11.10-hotspot"
set "VSDEVCMD=C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat"
set "Qt6_DIR=C:\qt\v6.7.2\lib\cmake\Qt6"
set "BN_INSTALL=C:\Program Files\Vector35\BinaryNinja"
root@kitploit:~
rem Incremental build of both components
build.bat

rem Full clean rebuild + install into BN plugins folder
build.bat clean install

rem Build only the C++ plugin
build.bat plugin

rem Build only the Java bridge
build.bat bridge

rem Build Qt once on a machine without Qt installed
build.bat qt

La compilation C++ utilise CMake FetchContent pour cloner binaryninja-api au commit exact enregistré dans api_REVISION.txt, de sorte que l'ABI du plugin corresponde toujours à la version BN installée. Ghidra est téléchargé automatiquement par CMake lors de la première configuration si GHIDRA_HOME n'est pas défini.

Configuration

Après l'installation, définissez ces paramètres dans les réglages de Binary Ninja (Edit → Preferences → Settings, recherchez « Ghidra ») :

ParamètreDescription
ghidra.javaExeChemin complet vers java.exe
ghidra.ghidraHomeRacine de votre installation Ghidra (contient Ghidra/Framework/…)
ghidra.trustAllCertsMettez true si votre Ghidra Server utilise un certificat auto-signé
ghidra.defaultHostPré-remplit la boîte de dialogue Connect
ghidra.defaultPortPar défaut : 13100
ghidra.defaultUserPré-remplit la boîte de dialogue Connect

Utilisation

  1. Ouvrez un binaire dans Binary Ninja.
  2. Ouvrez la barre latérale Ghidra (l'icône « G » rouge).
  3. Cliquez sur Connect… et saisissez vos identifiants de serveur.
  4. L'arborescence des dépôts se remplit. Cliquez sur la flèche d'expansion (▶) d'un dépôt pour révéler ses dossiers et fichiers de projet.
  5. Les fichiers de projet apparaissent en gras et en bleu. Double-cliquez sur l'un d'eux pour importer son analyse dans la vue binaire actuellement ouverte.
  6. Le journal d'activité affiche la progression de l'import et la plage d'adresses des symboles appliqués.

Prérequis pour l'étape 5 : le fichier de programme doit être commité dans le dépôt du Ghidra Server (pas seulement ouvert localement dans Ghidra). Dans Ghidra : clic droit sur le fichier dans la fenêtre Project → Version Control → Add to Version Control….

Protocole du bridge

Le plugin et le bridge communiquent via un socket TCP local en utilisant du JSON délimité par des retours à la ligne. Chaque requête porte un id entier et un op chaîne ; chaque réponse renvoie l'id. Les événements asynchrones (changements de dépôt côté serveur) portent une clé "event" à la place.

OpDirectionObjectif
ping, status, connect, disconnectrequête/réponsecycle de vie de la session
list_repos, open_repo, close_reporequête/réponseénumération des dépôts
list_items, get_subfoldersrequête/réponsenavigation dans les dépôts
get_versions, get_checkoutsrequête/réponseétat du contrôle de version
checkout, terminate_checkoutrequête/réponseverrou d'écriture exclusif
open_dbrequête/réponselecture complète de la DB Ghidra → JSON (lourd)
checkinrequête/réponseapplique les changements côté BN → nouvelle version du dépôt (lourd, via ProgramApplier)
download_binary, upload_binaryrequête/réponsedéplace le binaire original en entrée/sortie
delete_itemrequête/réponsesupprime un fichier du dépôt
repo_changedévénement (async)push RepositoryChangeEvent côté serveur

Continuer sur une autre machine

Le dépôt contient tout le nécessaire pour reconstruire à partir de zéro. Configuration propre à chaque développeur qui n'est pas dans git :

  1. Clone + sous-modules :
    root@kitploit:~
    git clone https://github.com/mutinylaboratories/ghidra_svr_bridge.git
    cd ghidra_svr_bridge
    git submodule update --init --recursive
    
  2. Chemin Ghidra local : créez bridge/gradle.properties :
    root@kitploit:~
    ghidraHome=C:/Users/<you>/ghidra/ghidra_12.0.4_PUBLIC
    
    (Les slashs fonctionnent aussi sous Windows — Gradle les préfère.)
  3. Installations Ghidra + Binary Ninja : même configuration que vos autres machines.
  4. Qt : pointez soit Qt6_DIR vers une installation existante, soit exécutez ./build.sh qt (Windows : build.bat qt) une fois.
  5. Canal de release Binary Ninja : l'ABI du plugin doit correspondre au BN que vous exécutez. Sélectionnez le canal lors de la compilation ; le script récupère le commit binaryninja-api correspondant depuis GitHub :
    root@kitploit:~
    ./build.sh --channel stable    # default — latest stable release (from GitHub)
    ./build.sh --channel dev        # latest dev (dev branch head, from GitHub)
    ./build.sh --bn-api <commit>   # explicit commit, no GitHub lookup (escape hatch)
    
    --channel et --bn-api sont mutuellement exclusifs ; sans aucun des deux, le canal stable est utilisé. --channel interroge le GitHub Vector35/binaryninja-api (dernière release stable/*, ou la tête de branche dev) et nécessite donc un accès réseau. Si votre BN installé est en retard sur la dernière release, passez --bn-api avec le SHA exact issu du api_REVISION.txt de cette installation.

Lors de l'ouverture d'une nouvelle session Claude Code, les meilleurs points d'entrée sont ce README plus l'état actuel sur dev :

  • Architecture et invariants du chemin d'écriture : ce fichier
  • Chemin d'écriture de production : bridge/src/main/java/com/ghidra_svr/bridge/ProgramApplier.java
  • Harnais de test : bridge/src/test/java/com/ghidra_svr/bridge/ProgramTestBase.java
  • Suites d'aller-retour : bridge/src/test/java/com/ghidra_svr/bridge/*RoundTripTest.java
  • Commits récents : git log --oneline — chaque ligne de sujet indique ce qui a changé et pourquoi

Limitations connues / travail en cours

  • Stockage des variables locales : ProgramApplier ignore les entrées de paramètres is_local car mapper les indices de registres BN vers le stockage Ghidra nécessite une traduction de table de registres par architecture. Les paramètres fonctionnent ; les locales ne se synchronisent pas encore.
  • Authentification : uniquement nom d'utilisateur + mot de passe. Les callbacks PKI et clé SSH ne sont pas encore gérés.
  • Espace d'adressage unique : DatabaseExporter suppose un seul espace d'adressage RAM. Les espaces overlay ou les architectures Harvard peuvent produire des adresses incorrectes.
  • Fusion des change-sets : le bridge écrit un DBChangeSet vide pour maintenir le fonctionnement des checkouts. La machinerie de fusion-au-checkout de Ghidra ne peut donc pas résoudre automatiquement les modifications concurrentes entre utilisateurs BN et Ghidra — le dernier écrivain gagne.
Télécharger l’outil