Un décompilateur qui récupère l’algorithme, pas seulement le code
Les organisations ont souvent besoin de comprendre un logiciel dont elles n’ont pas le code source : un vieux système, un composant acheté, quelque chose qui est arrivé et qui paraît suspect. Il existe déjà des outils qui retransforment le code machine en étapes lisibles. RetDec Imortek essaie d’aller plus loin et de nommer ces étapes — cette partie, c’est le standard de chiffrement avancé (AES), celle-ci un tri, celle-là la façon dont les données sont empaquetées pour l’envoi.
Le RetDec v5.0 amont est inactif depuis 2022. Il reste l’un des rares décompilateurs ouverts dotés d’une partie frontale vraiment large — et cette largeur vaut la peine d’être maintenue en vie.
Ce que c’est, en une minute
Le logiciel est livré sous une forme que la machine lit et qu’une personne ne lit pas. Quand il n’y a pas de code source — le fournisseur a disparu, le contrat ne l’a jamais inclus, le fichier vient d’un endroit auquel vous ne faites pas confiance — personne ne peut dire ce que le programme fait vraiment. Le vérifier à la main, c’est lire les instructions machine une par une.
Il démonte le fichier compilé et en reconstruit du C : les 216 binaires du corpus de test reviennent tous en C compilable. Puis il s’attaque au sens — quelle cryptographie, quel tri, quel parallélisme, quel format de fichier — et rapporte à quelle fréquence ça marche, y compris le cas où ça ne marche presque pas.
Les équipes de sécurité qui démontent des logiciels malveillants et qui ont besoin de la réponse avant d’avoir besoin du code. Les entreprises qui font tourner un logiciel dont personne n’a le source, et qui ont besoin d’une description avant de pouvoir reconstruire ou remplacer quoi que ce soit sans risque. Quiconque est coincé avec un format de fichier jamais documenté — de vieux enregistrements, une machine qui ne parle qu’à son propre logiciel.
Le vrai décodeur, compilé en WebAssembly
Tout ce qui est au-dessus est un parcours scénarisé de l’échelle d’abstraction. Voici le premier barreau qui tourne pour de vrai : Capstone — le désassembleur même que lie la version native de RetDec — en train de décoder les octets que vous collez.
capstone — WebAssembly
791 kilooctets (Ko) parce qu’un vrai décodeur x86 porte tout le jeu d’instructions — chaque encodage, préfixe et extension. C’est la taille honnête de la chose.
deps/capstone.
Formats natifs, bytecode et émergents
La sortie dépend du format, parce que prétendre que tout se décompile en C n’aide personne. La partie frontale prend les binaires natifs en Executable and Linkable Format (ELF), Portable Executable (PE) et Mach-O ; le bytecode, dont les fichiers class de la machine virtuelle Java (JVM), Dalvik Executable (DEX) et Common Intermediate Language (CIL) ; et des cibles plus récentes comme le Parallel Thread Execution (PTX) de CUDA.
ELF · PE · Mach-O
Produit du pseudocode C, plus la couche sémantique qui est la raison d’être du fork.
Python · Lua · JVM · DEX · CIL
Le bytecode Python et Lua ressort dans son propre langage ; les chemins de code managé produisent une sortie de la famille Java ou C#.
WebAssembly · CUDA PTX
WebAssembly se convertit au format texte WebAssembly (WAT). PTX est traité comme une entrée de premier rang plutôt qu’après coup.
Regardez une fonction gravir l’échelle d’abstraction
Choisissez une fonction binaire et faites-la avancer pas à pas dans le pipeline : octets bruts, désassemblage, IR élevée, pseudocode C, et enfin le verdict sémantique — l’algorithme nommé, avec les preuves qui l’ont identifié.
retdec — extraction de spécification
Verdict sémantique
Preuves
Symboles retirés, la récupération doit s’appuyer sur la seule structure — constantes, nombres de tours, forme du flot de contrôle. C’est le cas difficile, et c’est celui auquel se rapporte le F1 mesuré de 0,056.
Six familles de structures
Les conteneurs de la Standard Template Library (STL) et les structures d’exécution C++ — la forme d’un std::vector qui réapparaît à partir du motif d’allocation.
AES, la famille des algorithmes de hachage sécurisé (SHA), ChaCha20, Rivest–Shamir–Adleman (RSA) et les primitives à courbes elliptiques, identifiés par les constantes et la structure des tours.
Introsort, tri fusion, recherche dichotomique — y compris la bascule sur limite de profondeur qui trahit introsort.
Algorithmes de graphes, plus les motifs de parcours en largeur d’abord (BFS) et en profondeur d’abord (DFS).
std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) et les atomiques bruts.
Protobuf, FlatBuffers, MessagePack, JavaScript Object Notation (JSON) et le tramage en langage de balisage extensible (XML).
216 binaires, et le chiffre qui fait mal
Les 216 binaires ELF du corpus de test produisent tous du C compilable avec
--buildable, qui est actif par défaut. La récupération d’algorithmes est une autre histoire, et la façon honnête de la rapporter, c’est de donner les deux chiffres côte à côte.
| Métrique | Résultat | Condition |
|---|---|---|
| Sortie C compilable | 216 / 216 | --buildable, actif par défaut |
| F1 de récupération d’algorithmes | 0.056 | Sans noms, intervalle de confiance à 95 % 0,034–0,083 |
| F1 de récupération d’algorithmes | 1.000 | Avec noms, binaires symbolisés |
Recompilation du .c par défaut | Non | Ni ce fork ni RetDec d’origine |
En option, hors ligne, et sous contrôle
Le raffinement passe par llama.cpp avec des modèles GGUF, entièrement hors ligne, uniquement quand
RETDEC_NEURAL_REFINE=1 et un chemin de modèle sont fournis. Il est désactivé par défaut et ne remplace jamais la sortie de référence.
- Contrôle de compilation. La sortie raffinée doit passer
gcc -fsyntax-onlyavant d’être acceptée. - Validation structurelle. Le raffinement doit toujours correspondre à la structure élevée.
- Référence déterministe préservée. La sortie non raffinée du décompilateur reste l’artefact auditable. Si vous devez défendre un résultat, c’est celui-là que vous défendez.
- Pas de réseau. Inférence GGUF locale. Rien de votre binaire ne quitte la machine.
$ export RETDEC_NEURAL_REFINE=1 $ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf $ retdec-decompiler --buildable ./target.elf
Trouve ce que fait un programme quand le code source a disparu
Un logiciel est livré sous une forme qu’une machine sait lire et pas une personne. Ceci la démonte et vous dit, en termes simples, ce que le programme fait réellement.
Équipes de sécurité qui démontent des logiciels malveillants
Au lieu de pages de code illisible, vous obtenez la réponse : cette partie brouille des données, cette partie est la façon dont il contacte son serveur, cette partie est la façon dont il se cache. C’est le morceau dont un analyste a besoin en premier.
Entreprises avec de vieux logiciels et sans code source
Le système fait toujours tourner l’entreprise, et celui qui l’a écrit est parti il y a des années. Ceci récupère une description de ce qu’il fait, ce dont on a besoin avant que quiconque puisse le reconstruire ou le remplacer sans risque.
Quiconque est coincé avec un format de fichier que personne n’a documenté
De vieilles archives, une machine qui ne parle qu’à son propre logiciel, le fichier d’export d’un concurrent. Ceci en déduit la structure pour que votre propre logiciel puisse le lire.
Interface graphique utilisateur (GUI) Qt 6, ou pas de GUI du tout
Vues de code synchronisées entre C, assembleur, IR et graphes de flot de contrôle, avec navigation dans les fonctions, inspection des chaînes, un navigateur de binaire et un panneau d’assistant. Le mode sans affichage supprime toute dépendance GUI, si bien que le même build tourne en intégration continue (CI).
La licence publique générale GNU Affero (AGPL-3.0+) pour un usage open source, ou une licence commerciale pour un déploiement propriétaire. Copyright Odin Loch, exerçant sous le nom d’Imortek, 2025–2026.
Livrable en v2.0.21. Les contrôles de CI reflètent des exigences de développement plutôt que de maturité de production — déclaré par le projet, pas déduit.