Le premier rétro-ingénieur agentique au monde.
Orchestration LLM pour la rétro-ingénierie de binaires
La plupart des tâches suivent une relation linéaire : plus une tâche est difficile, plus elle prend généralement de temps. La rétro-ingénierie (et l'analyse binaire) est une tâche où la difficulté réelle est plutôt triviale, mais le temps d'exécution peut être de l'ordre de plusieurs heures (voire jours !), même pour un binaire contenant quelques centaines de fonctions.
Kong automatise la couche mécanique en utilisant un framework de rétro-ingénierie de niveau NSA. Kong peut prendre un binaire entièrement obscurci et dépouillé et exécuter un pipeline d'analyse complet : tri des fonctions, construction du contexte du graphe d'appels, récupération des types et symboles via décompilation guidée par LLM, et écriture des résultats dans la base de programme de Ghidra. Le résultat est un binaire où FUN_00401a30 devient parse_http_header, avec des structures, noms de paramètres et conventions d'appel récupérés.
Pourquoi cela existe
Les binaires dépouillés perdent tout le contexte qui rend le code lisible : noms de fonctions, informations de type, noms de variables, structures. Récupérer ce contexte représente l'essentiel du travail dans la plupart des tâches de RE, et il s'agit en grande partie de correspondance de motifs : reconnaître les fonctions de la bibliothèque standard, inférer les types à partir de l'utilisation, propager les noms à travers les graphes d'appels.
Les LLM sont précisément bons pour ce type de correspondance de motifs. Mais pointer un LLM sur une sortie brute de décompilateur et demander « à quoi cela sert-il ? » donne des résultats médiocres. Le modèle manque de contexte d'appel, d'informations de références croisées et d'une vue d'ensemble de la structure du binaire. De plus, la plupart des binaires obscurcis introduisent des techniques extrêmes pour empêcher la rétro-ingénierie.
Kong résout ce problème en construisant des fenêtres de contexte riches à partir de l'analyse de programme de Ghidra (graphes d'appels, références croisées, références de chaînes, flux de données) avant même de toucher au LLM, puis en orchestrant l'analyse dans l'ordre des dépendances afin que chaque fonction bénéficie que ses appelées soient déjà nommées. De plus, Kong introduit son propre pipeline de désobscurcissement agentique, une première du genre.


Kong fonctionne avec la plupart des binaires décompilables par Ghidra (pour l'instant, d'autres à venir).
| C | C++ | Go | Rust | |
|---|---|---|---|---|
| x86 | Élevée | Élevée | Moyenne | Moyenne |
| x86-64 | Élevée | Élevée | Moyenne | Moyenne |
| ARM (32-bit) | Élevée | Élevée | Moyenne | Faible |
| AArch64 | Élevée | Élevée | Moyenne | Faible |
| MIPS | Moyenne | Moyenne | Faible | Faible |
| PowerPC | Moyenne | Moyenne | Faible | Faible |
Élevée : Kong décompile, désobscurcit et récupère de manière fiable les noms, types et structures.
Moyenne : La décompilation est utilisable mais plus bruyante. Attendez-vous à une récupération partielle et à des scores de confiance plus faibles.
Faible : La décompilation présente des lacunes importantes et les résultats resteront incomplets, bruyants ou illisibles.
Remarque : La taille du binaire augmente positivement avec le nombre de fonctions, le coût LLM et le temps d'exécution. Cependant, la taille du binaire augmente également négativement avec la confiance, gardez donc cela à l'esprit lors de l'analyse de binaires plus volumineux.
Kong utilise un pipeline en cinq phases orchestré par un superviseur qui coordonne le tri, l'analyse parallèle et le post-traitement :
┌──────────────────────┐
│ Triage │
│ enumerer, classer, │
│ construire graphe │
│ d'appels, signatures │
└──────────┬───────────┘
│
▼
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Analyser │ │ Analyser │ │ ... │
│ (fn feuille)│ │ (niveau suiv)│ │ │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬───────┴────────────────┘
│
▼
┌──────────────────────┐
│ Nettoyage │
│ normaliser, dédoubl. │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Synthèse │
│ unifier noms, │
│ construire structs, │
│ désobscurcir │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Exportation │
│ analysis.json + │
│ réécriture Ghidra │
└──────────────────────┘
Triage énumère toutes les fonctions du binaire, les classe par taille (trivial / petite / moyenne / grande), construit le graphe d'appels, détecte le langage source et exécute une correspondance de signatures par rapport aux fonctions connues de la bibliothèque standard et cryptographiques. Les fonctions correspondant à une signature sont marquées comme résolues et sautent l'analyse LLM.
Analyse traite les fonctions dans l'ordre ascendant du graphe d'appels en utilisant une file de travaux. Pour chaque fonction, Kong construit une fenêtre de contexte à partir de la base de programme de Ghidra — décompilation, références croisées, références de chaînes et signatures des appelées déjà analysées — normalise la sortie du décompilateur et l'envoie au LLM pour la récupération des noms, types et paramètres. Si un obscurcissement est détecté dans la décompilation d'une fonction, Kong exécute un passage de désobscurcissement agentique avec accès à des outils symboliques avant de produire l'analyse. Les résultats sont réécrits immédiatement dans Ghidra afin que les appelants en aval voient les noms mis à jour.
Nettoyage unifie les types de structure à partir des propositions accumulées pendant l'analyse et réessaie les signatures de fonction qui n'ont pas pu être appliquées pendant le passage d'analyse.
Synthèse adopte une vue globale sur toutes les fonctions analysées. Un seul appel LLM examine les fonctions les plus connectées, unifie les conventions de nommage, synthétise les définitions de structures à partir des motifs d'accès aux champs et affine les noms qui semblent incohérents dans le contexte plus large.
Exportation écrit le fichier analysis.json final et applique tous les noms, types et signatures récupérés dans la base de programme de Ghidra.
# 1. Installer Kong
uv pip install kong-re
# 2. Définir votre/vos clé(s) API
export ANTHROPIC_API_KEY="sk-ant-..."
# et/ou
export OPENAI_API_KEY="sk-..."
# 3. Lancer l'assistant de configuration (première fois uniquement)
kong setup
# 4. Analyser un binaire
kong analyze ./chemin/vers/binaire_depouille
L'assistant de configuration vous permet de choisir les fournisseurs LLM à utiliser et définit une valeur par défaut. Kong détecte automatiquement vos installations Ghidra et JDK, charge le binaire dans une instance Ghidra en processus et exécute le pipeline complet.
git clone https://github.com/amruth-sn/kong.git
cd kong
uv sync
uv run kong setup
uv run kong analyze ./chemin/vers/binaire_depouille
| Variable | Requise | Description |
|---|---|---|
ANTHROPIC_API_KEY | Au moins une | Clé API Anthropic (Claude) |
OPENAI_API_KEY | Au moins une | Clé API OpenAI (GPT-4o) |
GHIDRA_INSTALL_DIR | Non | Chemin vers l'installation Ghidra (détection automatique si non défini) |
JAVA_HOME | Non | Chemin vers le JDK (détection automatique si non défini) |
KONG_CONFIG_DIR | Non | Surcharge du répertoire de configuration (par défaut : ~/.config/kong) |
# Lancer l'assistant de configuration
kong setup
# Analyser un binaire dépouillé (utilise le fournisseur par défaut configuré)
kong analyze ./binaire
# Analyser avec un fournisseur spécifique
kong analyze ./binaire --provider openai
# Surcharger le modèle
kong analyze ./binaire --provider openai --model gpt-4o-mini
# Afficher les métadonnées du binaire sans exécuter l'analyse
kong info ./binaire
# Évaluer la sortie de l'analyse par rapport au code source de vérité terrain
kong eval ./analysis.json ./source.c
Les résultats sont écrits dans le répertoire de sortie (par défaut : ./kong_output_{nom_du_binaire}/) :
kong_output_{nom_du_binaire}/
├── analysis.json # Tous les noms, types, paramètres de fonction récupérés
└── events.log # Trace d'exécution du pipeline
Kong a reconstruit de manière autonome la chaîne complète du backdoor XZ (CVE-2024-3094) à partir d'une liblzma.so.5.4.1 dépouillée — identifiant les cinq fonctions d'implant principales avec une confiance de 90 à 95 % en 15 minutes pour 6,63 $.
Voir BENCHMARKS.md pour l'étude de cas complète et les instructions de reproduction.
kong/
├── __main__.py # Point d'entrée CLI (click)
├── config.py # KongConfig, LLMProvider, LLMConfig
├── db.py # Stockage de configuration SQLite (~/.config/kong/)
├── banner.py # Bannière ASCII, aides pour clés API
├── agent/
│ ├── supervisor.py # Orchestrateur de pipeline
│ ├── triage.py # Énumération + classification des fonctions
│ ├── analyzer.py # Analyse de fonction guidée par LLM
│ ├── queue.py # File de travaux BFS depuis le graphe d'appels
│ ├── signatures.py # Correspondance de signatures de fonctions connues
│ ├── prompts.py # Prompt système + schéma de sortie
│ ├── events.py # Types de phase/événement pour le traçage du pipeline
│ └── models.py # Dataclass FunctionResult
├── ghidra/
│ ├── client.py # GhidraClient en processus (PyGhidra/JPype)
│ ├── types.py # FunctionInfo, BinaryInfo, XRef, etc.
│ └── environment.py # Détection automatique de Ghidra/JDK
├── llm/
│ ├── client.py # AnthropicClient
│ ├── openai_client.py # OpenAIClient
│ ├── usage.py # TokenUsage, suivi des coûts, registre de tarification
│ └── limits.py # Limites propres au modèle + limiteur de débit
├── normalizer/
│ └── syntactic.py # Normalisation de la sortie du décompilateur
├── synthesis/
│ └── semantic.py # Unification globale des noms + synthèse de structures
├── evals/
│ ├── harness.py # Extraction de la vérité terrain + notation
│ └── metrics.py # symbol_accuracy, type_accuracy
├── export/
│ └── source.py # analysis.json + réécriture Ghidra
├── signatures/
│ ├── stdlib.json # Signatures de la bibliothèque standard C
│ └── crypto.json # Signatures de fonctions cryptographiques
└── tui/
└── app.py # TUI Textual
Kong est sous licence Apache License 2.0. Kong est un projet gratuit et open source.
Cette licence est compatible avec la licence Ghidra et permet une utilisation commerciale.
Les signalements de problèmes et les demandes de fonctionnalités sont les bienvenus via GitHub Issues.
Un grand merci au projet Shannon de KeygraphHQ, qui a inspiré ce projet. Ma motivation était de reproduire le même type de pipeline que Shannon utilise pour son outil de test d'intrusion web, et de l'adapter pour l'analyse et la décompilation de binaires.
Craignez le singe.
Kong : Le premier ingénieur inverse IA au monde