
Suite d'accélération GPU et d'architecture Ghidra hautes performances : codec B-Tree LZ4/Zstd, démon persistant sans verrou, scanner WGPU ARM64, prouveur SMT Z3 et décompilateur neuronal
Des outils Python qui rendent le scripting sur Ghidra plus rapide, ainsi que quelques analyses qu'il ne réalise pas nativement : récupération de classes MFC/C++, traçage de la disposition de Serialize(), correspondance de fonctions entre versions, et un vérificateur d'équivalence Z3 pour le P-code.
L'analyse de Ghidra est excellente, mais la piloter depuis des scripts est lente. Chaque exécution headless coûte 5 à 15 secondes de démarrage de la JVM. Un verrou de projet empêche un second processus de lire. Les tâches en masse, comme le balayage d'une section .text ARM64 de 20 Mo ou la correspondance de 45 000 fonctions entre deux builds, s'exécutent sur un seul thread CPU.
SuperGhidra maintient un projet Ghidra en lecture seule chargé dans un démon en arrière-plan et met en cache ses réponses. Le travail en masse est déplacé vers du calcul Python pur, NumPy ou des shaders GPU. Une grande partie du travail sur les formats et la récupération de classes ne nécessite pas Ghidra du tout.
| Paquet | Ce qu'il fait |
|---|---|
core | Démon sur 127.0.0.1:5073 avec un cache SQLite. Les renommages et commentaires vont dans un overlay JSON, jamais dans le .rep. Inclut également un gouverneur de ressources (eco / balanced / turbo / auto) et une IPC par mémoire partagée. |
formats | Chargeur ELF / PE / Mach-O, récupération MSVC RTTI et MFC CRuntimeClass, traçage de Serialize(), un décodeur CArchive, et export DWARF 5 / Breakpad / map. Aucun de ces éléments ne nécessite Ghidra. |
lifters | Lifter ARM64 → P-code (sous-ensemble entier), décodeurs x86 et ARM/Thumb, et un vérificateur Z3 qui prouve l'équivalence de deux extraits ou répond UNKNOWN. |
diff | Met en correspondance les fonctions entre versions avec des vecteurs de caractéristiques CFG, puis trouve les champs de structure dont les offsets ont bougé et réécrit les accès. |
acceleration | Shaders WGPU qui scannent l'ARM64 à la recherche de paires ADRP+ADD/LDR et de prologues de fonctions, avec un fallback CPU SIMD. |
storage | Codec LZ4 / Zstd pour les pages de buffer de 16 Ko de Ghidra, plus un codec Java autonome BufferFile. |
integrations | Référenceur croisé APK ↔ JNI, lecteur de mémoire d'émulateur Android avec une liste d'appareils autorisés, et un pipeline de nommage par LLM. |
Chaque paquet possède son propre README sous superghidra/.
Tous les benchmarks sont mesurés sur du matériel physique (Intel Core i9-12950HX, 64 Go DDR5, NVIDIA RTX A5500 Laptop GPU) et sur la matrice CI multiplateforme. Les données empiriques complètes et les journaux se trouvent dans docs/benchmarks/.
| Charge de travail / Benchmark | Taille d'entrée / Cible | Moteur / Backend | Temps mesuré | Débit / Résultat mesuré | Statut |
|---|---|---|---|---|---|
| Balayage ARM64 ADRP + ADD/LDR | Bloc ARM64 de 4,0 Mo (1 048 576 insns) | NumPy SIMD | 7,28 ms | 143,95 M insn/s | 1 049 paires identifiées |
| Seeder de fonctions ARM64 | Bloc ARM64 de 4,0 Mo (1 048 576 insns) | NumPy SIMD | 8,31 ms | 126,19 M insn/s | 1 049 prologues identifiés |
| Balayage ADRP GPU à grande échelle | Bloc ARM64 de 20,0 Mo (5 242 880 insns) | WGPU DirectX 12 | 41,20 ms | 127,25 M insn/s | Correspondance bit à bit avec le CPU |
| Compression de fichier buffer (LZ4) | 1 000 pages synthétiques de 16 Ko (16,0 Mo) | LZ4 block | 36,12 ms | 442,9 Mo/s (ratio 4,84x) | 79,32 % d'économie disque |
| Compression de fichier buffer (Zstd) | 1 000 pages synthétiques de 16 Ko (16,0 Mo) | Zstd niveau 3 | 77,48 ms | 206,5 Mo/s (ratio 7,39x) | 86,47 % d'économie disque |
| Cache de requêtes de décompilation | RPC du démon Ghidra en direct | Cache SQLite L2 | < 0,01 ms | > 100 000 req/s | Correspondance en overlay mémoire |
| Aller-retour IPC canal SHM | Ring buffer mappé en mémoire de 64 Ko | IPC SHM Windows | 5,12 µs | 195 300 msg/s | Mémoire partagée sans copie |
Évalué sous gcc -O0 -lm à travers les niveaux d'optimisation O0–O3. Les fonctions doivent se compiler proprement et réussir leur suite de tests :
| Pipeline de décompilation | Nombre de réussites compilables | Taux de réussite (%) | Delta relatif vs Ghidra brut | Delta relatif vs IDA Pro |
|---|---|---|---|---|
| Stock NSA Ghidra | 107 / 1,296 | 8.26% | Référence | -8.64% |
| Commercial IDA Pro | 219 / 1,296 | 16.90% | +8.64% | Référence |
| SuperGhidra Compilable Filter | 294 / 1,296 | 22.69% | +14.43% | +5.79% |
Matrice complète de 6 jobs réussissant à chaque commit (Run #39691442336) :
| Système d'exploitation | Python 3.10 | Python 3.11 | Python 3.12 | Nombre de tests Pytest | Taux de réussite |
|---|---|---|---|---|---|
Ubuntu Linux (ubuntu-latest) | 32s | 26s | 25s | 626 collectés (572 réussis, 42 ignorés, 11 désélectionnés) | 100% |
Windows Server (windows-latest) | 1m 25s | 1m 06s | 53s | 626 collectés (583 réussis, 32 ignorés, 11 désélectionnés) | 100% |
Les journaux détaillés et la méthodologie de mesure sont documentés dans docs/benchmarks/EMPIRICAL_TEST_BENCHMARK_MATRIX.md.
Depuis PyPI :
pip install superghidra
Extensions optionnelles d'accélération et d'intégration :
pip install "superghidra[all]" # all optional backends
pip install "superghidra[smt]" # Z3 P-code equivalence checker
pip install "superghidra[gpu]" # WGPU compute shaders (ADRP/prologue sweeps)
pip install "superghidra[storage]" # LZ4 & Zstandard 16 KB page compression
pip install "superghidra[ghidra]" # PyGhidra bridge & JVM headless bindings
pip install "superghidra[frida]" # Live emulator runtime inspection
Depuis la source (développement) :
git clone https://github.com/yuatemycat/SuperGhidra
cd SuperGhidra
pip install -e ".[all]"
python -m pytest -q
CLI unifiée :
SuperGhidra est livré avec un exécutable en ligne de commande autonome intégré superghidra :
# Display version and hardware acceleration telemetry
superghidra version
# Staged P-code decompiler (MBA simplification, opaque branch pruning, goto-free C)
superghidra decompile target.dll --rva 0x140001000 --arch x86_64 -o decompiled.c
# Import IDA Pro .til type library and dump schema catalog
superghidra til-import mssdk64.til -o catalog.json
# Match binary bytes against IDA FLIRT signature database
superghidra flirt-match vc32rtf.sig target.exe --rva 0x1000
# Recover MSVC / MFC C++ class hierarchies, RTTI structures, and virtual call tables
superghidra rtti-recover app.dll -o classes.json