
Réimplémentation en C++ du cœur analytique de Ghidra sans dépendances JVM, offrant une analyse binaire embarquable, les fondations Pcode/Sleigh et des interfaces prêtes pour l'IA pour le reverse engineering.
Réimplémentation en C++ du cœur analytique de Ghidra (SoftwareModeling + Utility), dépouillé des dépendances Java/JVM. Conçu pour l'intégration IA, la performance et l'intégrabilité. Fait partie du projet Enigma Engine.
Une réimplémentation en C++ du cœur analytique de Ghidra — pas de JVM, pas de Java, contrôle total.
Ghidra est un puissant framework de rétro-ingénierie développé par la NSA en Java. Enigma est une réécriture complète de son cœur analytique en C++ moderne, conçue pour être :
Ce n'est pas une sortie de transpileur Java-vers-C++. Chaque fichier est traduit et vérifié manuellement, avec une couverture de tests complète.
La base de code Java de Ghidra est mature mais difficile à étendre dans certaines directions :
| Problème | Réponse d'Enigma |
|---|
| Démarrage JVM + surcoût du GC | C++ natif, zéro runtime |
| Difficile à intégrer dans des projets non-Java | Bibliothèque statique/partagée |
| L'intégration IA nécessite des ponts JNI | API C++ directe |
| Système de plugins monolithique | Composants modulaires et remplaçables |
Développement actif — la fondation analytique est stable et testée.
Le système de types de base, le modèle d'adresses, les interfaces mémoire, le framework de paramètres et les fondations Pcode/Sleigh sont implémentés et passent les tests. Le projet suit un ordre de traduction strict de bas en haut : aucun module n'est ajouté tant que toutes ses dépendances ne sont pas en place et vérifiées.
Système de build : CMake + Ninja + CTest — zéro avertissement, tous les tests passent.
Enigma reflète la structure interne des packages de Ghidra, traduite en namespaces C++ :
include/ghidra/
├── [Address system] Address, AddressSpace, AddressFactory, AddressRange
├── [Data types] DataType, Structure, Union, Enum, Pointer,
│ Array, TypeDef, FunctionDefinition, ...
├── [Memory] MemBuffer, MemoryBlock, Memory, ByteProvider
├── [Settings] Settings + full SettingsDefinition hierarchy
├── [Pcode / Sleigh] PcodeOp, Varnode, SleighLanguage, SequenceNumber
└── [Utilities] MathUtilities, DataConverter, Msg, TaskMonitor, ...
src/
└── [.cpp implementations for complex classes]
Décisions de conception clés :
interface → C++ abstract class avec méthodes virtual puresArrayList / HashMap → std::vector / std::unordered_mapnull Java → std::optional<T>Address fusionné de l'interface + implémentation en un seul type valeur (évite l'allocation sur le tas)Enigma est un remplacement complet de Ghidra — chaque composant existant en Java aura un équivalent C++, y compris l'interface utilisateur, le système de plugins, le désassembleur, le décompilateur et le moteur de scripts.
L'objectif actuel est le cœur analytique — la fondation sur laquelle tout le reste se construit. Une fois qu'il sera solide et testé, les couches restantes (GUI, chargeurs, plugins d'analyse, scripting) suivront dans l'ordre.
Rien n'est définitivement exclu. Tout est une question de priorité.
git clone https://github.com/adam-040/Enigma.git
cd Enigma
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build --output-on-failure
.sla / .pspec)Enigma — nommé d'après la machine de chiffrement de la Seconde Guerre mondiale, cassée par rétro-ingénierie. Ça semblait approprié.
Ce projet est une traduction de Ghidra, qui est sous licence Apache License 2.0.
Enigma est distribué sous la même licence. Voir LICENSE pour plus de détails.