RetDec Imortek · v2.0.21

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.

LangageC++
Versionv2.0.21
Projet amontRetDec v5.0
Étoiles2
Dernier envoirécemment
Pourquoi forker RetDec

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.

AjoutéRécupération sémantique des bibliothèques
AjoutéInterface Qt 6
AjoutéRaffinement neuronal hors ligne en option
AjoutéDétection d’algorithmes, de concurrence & de sérialisation
En clair

Ce que c’est, en une minute

Le problème

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.

La solution

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.

À qui cela s’adresse

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.

Nommer l’algorithme, c’est la partie difficile, et les deux chiffres qui la concernent sont ici. Sur un binaire qui porte encore ses propres étiquettes, le détecteur est d’accord avec elles ; les étiquettes retirées, il est proche du hasard. Le reste de cette page, c’est l’ingénierie : ce qui a été ajouté, comment ça a été mesuré, et où ça s’effondre.
Le barreau du bas, pour de vrai

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.

Décodeur
—
Instructions
—
Ceci est le décodeur, pas le décompilateur. Les barreaux au-dessus — l’élévation vers la représentation intermédiaire (IR) de LLVM, la structuration du flot de contrôle, la dénomination de l’algorithme — sont le travail de LLVM, et LLVM ne tient dans aucune page web, à aucune taille. Dire le contraire serait le mensonge le plus facile de ce site.
Capstone 5, compilé avec Emscripten, x86 uniquement. La version native lie la même bibliothèque depuis deps/capstone.
Partie frontale

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.

Natif

ELF · PE · Mach-O

Produit du pseudocode C, plus la couche sémantique qui est la raison d’être du fork.

Bytecode

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#.

Émergents

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.

Interactif

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é.

Cinq barreaux d’abstraction : octets bruts, désassemblage, IR élevée, pseudocode C, et l’algorithme nommé avec sa référence de spécification
faites défiler pour voir tout le schéma →
Le dernier barreau, c’est le produit. Tout ce qui se trouve au-dessus, les autres décompilateurs vous le donnent déjà.

retdec — extraction de spécification


          

Verdict sémantique

Pas encore récupéré
Avancez jusqu’à l’étape sémantique.

Preuves

Confiance
—
Mode
sans noms

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.

Un parcours scénarisé d’étapes de récupération réelles, écrit pour cette page. Le décompilateur lui-même est en C++ et tourne hors ligne.
Ce qu’il récupère

Six familles de structures

Runtime

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.

Cryptographie

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.

Tri & recherche

Introsort, tri fusion, recherche dichotomique — y compris la bascule sur limite de profondeur qui trahit introsort.

Graphes

Algorithmes de graphes, plus les motifs de parcours en largeur d’abord (BFS) et en profondeur d’abord (DFS).

Concurrence

std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) et les atomiques bruts.

Sérialisation

Protobuf, FlatBuffers, MessagePack, JavaScript Object Notation (JSON) et le tramage en langage de balisage extensible (XML).

Mesuré

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étriqueRésultatCondition
Sortie C compilable216 / 216--buildable, actif par défaut
F1 de récupération d’algorithmes0.056Sans noms, intervalle de confiance à 95 % 0,034–0,083
F1 de récupération d’algorithmes1.000Avec noms, binaires symbolisés
Recompilation du .c par défautNonNi ce fork ni RetDec d’origine
Lisez ces deux chiffres de F1 ensemble. 1,000 avec les symboles veut dire que le détecteur est d’accord avec la table des symboles. 0,056 sans veut dire que la récupération structurelle sur binaires dépouillés est, aujourd’hui, proche du hasard. Ne citer que le premier serait du marketing ; ne citer que le second cacherait que le pipeline fonctionne dès qu’il a quelque chose sur quoi s’appuyer.
Raffinement neuronal

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-only avant 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
À qui cela s’adresse

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.

01

É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.

02

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.

03

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.

Vous reconnaissez votre situation ? C’est ouvert aux tests bêta dès maintenant, et ce sont les retours des gens pour qui c’est construit qui le font réellement changer. Devenir bêta-testeur →
Interface

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).

Double licence

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.