L'objectif de ce projet est de mettre en œuvre un pipeline de décompilation composé de composants indépendants interagissant à travers des interfaces bien définies, comme décrit plus en détail dans les documents de conception du projet.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...Voir l'exemple d'utilisation aux exemples / démo, et ce commentaire pour plus de détails.
Dans une perspective de haut niveau, les composants du pipeline de décompilation sont conceptuellement regroupés en trois modules. Premièrement, le front-end traduit une langue source (par exemple l'assemblage x86) en LLVM IR; une représentation intermédiaire de bas niveau indépendante de la plate-forme. Deuxièmement, les structures intermédiaires structurent le LLVM IR en identifiant les primitives de flux de contrôle de haut niveau (par exemple les boucles de pré-test, les conditions à deux voies). Enfin, le back-end traduit le LLVM IR structuré dans un langage de programmation cible de haut niveau (par exemple GO).
L'affiche suivante résume les capacités actuelles du pipeline de décompilation, en utilisant une composition de composants indépendants pour traduire LLVM IR pour aller.
Traduire le code machine (par exemple l'assemblage x86) en llvm ir.
Composants frontaux tiers.
Effectuer une analyse du flux de contrôle sur le LLVM IR pour identifier les primitives de flux de contrôle de haut niveau (par exemple les boucles de pré-test).
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
Outil de génération de graphiques de flux de contrôle.
Générez des graphiques de flux de contrôle à partir de l'assemblage IR LLVM (* .ll -> * .dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
Outil de récupération de flux de contrôle.
Récupérer les primitives de flux de contrôle à partir de graphiques de flux de contrôle (* .dot -> * .json).
Traduire LLVM structuré IR en un langage cible de haut niveau (par exemple GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
Outil de génération de code Go.
Décompiler llvm IR Assembly to Go Source Code (* .ll -> * .go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
Aller l'outil de post-traitement.
Code source post-processus pour le rendre plus idiomatique (* .go -> * .go).
Focus primaire de la version 0.2: vitesse de compilation à l'échelle du projet .
Développer des composants de décompilation devrait être amusant.
Il semble y avoir une corrélation inverse entre en fonction d'une énorme bibliothèque C ++ et s'amuser à développer des composants de décompilation.
La version 0.2 du pipeline de décompilation s'efforce de résoudre ce problème en tirant parti d'une bibliothèque LLVM IR écrite en pure go. Avant cette version, la compilation à l'échelle du projet pourrait prendre plusieurs heures. Maintenant, ils terminent en moins d'une minute - la limite dure établie pour toutes les versions futures.
Libération initiale.
Focus primaire de la version 0.1: décompilation de composition .
Les décompilateurs doivent être composables et open source.
Un pipeline de décompilation doit être composé de composants individuels, chacun avec un seul objectif et une entrée et une sortie bien définies.
La version 0.1 du projet de décomposition explore la faisabilité de la composition d'un pipeline de décompilation à partir de composants indépendants et le potentiel d'exposer ces composants à l'utilisateur final.
Pour plus d'informations, reportez-vous à la décompilation de composition à l'aide du document de conception LLVM IR.
Focus primaire de la version 0.3: levage binaire conscient de type .
Les décompilateurs comptent sur un levage binaire de haute qualité.
La qualité de la sortie IR de la levage binaire de levage frontal détermine fondamentalement la qualité de la production de l'ensemble du pipeline de décompilation.
La version 0.3 vise à améliorer la qualité de la sortie LLVM IR en mettant en œuvre un frontal de levage binaire de type.
Focus primaire de la version 0.4: Analyse du flux de contrôle .
Les décompilateurs doivent récupérer les primitives de flux de contrôle de haut niveau.
L'une des principales différences entre l'assemblage de bas niveau et le code source de haut niveau est l'utilisation de primitives de flux de contrôle de haut niveau; Par exemple, les conditionnels à 1 voie, 2 voies et n-voies ( if , if-else et switch ), boucles avant et post-test ( while et do-while ).
La version 0.4 cherche à récupérer les primitives de flux de contrôle de haut niveau en utilisant des algorithmes d'analyse de flux de contrôle robustes.
Focus primaire de la version 0.5: tolérance aux défauts .
Les décompilateurs doivent être robustes.
Les composants de décompilation devraient bien répondre aux états inattendus et à une analyse incomplète.
La version 0.5 se concentre sur la stabilité et cherche à tester le pipeline de décompilation à l'aide d'un logiciel mondial semi-réel (voir la série de problèmes de défi).
Focus primaire de la version 0.6: Analyse du flux de données .
Focus primaire de la version 0.7: Analyse de type .