Decompiler

Un decompiler est le nom donné à un programme informatique qui effectue l'opération d'inversion à celle d'un compilateur . C'est-à-dire, il traduit un dossier contenant l'information relativement à un de bas niveau de l'abstraction (habituellement conçue pour être lisible à la machine plutôt que lisible pour l'homme) dans une forme ayant un de plus haut niveau de l'abstraction (habituellement conçue pour être lisible pour l'homme).

Introduction

Le " de limite ; decompiler" ; est le plus généralement appliqué à un programme qui traduit les programmes exécutables du (le rendement d'un compilateur ) en code source dans le langage de haut niveau évolué d'a (relativement) qui, quand compilé, produira un exécutable dont le comportement est identique que le programme exécutable original. Par comparaison, un démonteur traduit un programme exécutable en langage d'assemblage (et assembleur pourrait être employé pour l'assembler de nouveau dans un programme exécutable).

La décompilation est l'acte d'employer un decompiler, bien que la limite, une fois utilisée comme nom, puisse également se rapporter au rendement d'un decompiler. Elle peut être employée pour le rétablissement du code source perdu, et est également utile dans certains cas pour le degré de sécurité d'ordinateur , l'interopérabilité et le de correction d'erreurs. Le succès de la décompilation dépend de la quantité de l'information actuelle dans le code decompiled et de la sophistication de l'analyse exécutée là-dessus. Les formats de bytecode employés par beaucoup de machines virtuelles (telles que la machine virtuelle de Java de ou le temps d'exécution de langage commun de de cadre .NET) incluent souvent les méta-données étendues et les dispositifs à niveau élevé qui rendent la décompilation tout à fait faisable. Le de langage machine a en général beaucoup moins de méta-données, et est donc beaucoup plus dur à decompile.

Un certain de produit de compilateurs et d'outils de poteau-compilation a assombri le code (c'est-à-dire, elles essayent de produire le rendement qui est très difficile à decompile). Ceci est fait pour rendre lui plus difficile à l'ingénieur d'inversion l'exécutable.

Conception

Decompilers peut être considéré comme composé de série de phases qui contribue des aspects spécifiques du processus global de décompilation.

Chargeur

La première phase de décompilation est le chargeur, qui analyse le format de fichier binaire du programme de code machine d'entrée ou de langue intermédiaire. Le chargeur devrait pouvoir découvrir les faits de base sur le programme d'entrée, tel que l'architecture (Pentium, PowerPC, etc.), et le point d'entrée. Dans beaucoup de cas, il devrait pouvoir trouver l'équivalent de la fonction de main du programme de C., qui est le début du code écrit par l'utilisateur. Ceci exclut le code d'initialisation d'exécution, qui ne devrait pas decompiled si possible.

Démontage

La phase logique suivante est le démontage des instructions de code machine dans une représentation intermédiaire non lié à un type de machine particulier (IR). Par exemple, l'instruction de machine de Pentium eax de mouvements, pourrait être traduit à l'IR eax : = m ;

Idiomes

Les ordres idiomatiques de code machine sont des ordres de code dont ont combiné la sémantique ne ressortent pas immédiatement de la sémantique individuelle des instructions. En tant qu'élément de la phase de démontage, ou en tant qu'élément des analyses postérieures, ces ordres idiomatiques doivent être traduits en IR équivalent connu. Par exemple, le code x86 : eax de cdq ; l'edx est placé à la signe-prolongation de l'eax eax de xor, edx eax secondaire, edx a pu être traduit à eax : = ABS (eax) ;

Quelques ordres idiomatiques sont non lié à un type de machine particulier ; certains comportent seulement une instruction. Par exemple, l'eax de xor, eax dégage le registre de eax (ensembles il à zéro). Ceci peut être mis en application avec une règle non lié à un type de machine particulier de simplification, telle que le xor de a a = 0.

Généralement il est le meilleur de retarder la détection des ordres idiomatiques si possible, aux stades avancés qui moins sont affectés par la commande d'instruction. Par exemple, la phase de établissement du programme d'instruction d'un compilateur peut insérer d'autres instructions dans un ordre idiomatique, ou changer la commande des instructions dans l'ordre. Un processus de configuration avec un modèle dans la phase de démontage n'identifierait probablement pas le modèle changé. Les phases postérieures groupent des expressions d'instruction dans des epressions plus complexes, et les modifient dans une forme (normalisée) canonique, le faisant plus probablement que même l'idiome changé assortira un modèle de plus haut niveau plus tard dans la décompilation.

Analyse de programme

De diverses analyses de programme peuvent être appliquées à l'IR. En particulier, la propagation d'expression combine la sémantique de plusieurs instructions dans des expressions plus complexes. Par exemple, eax de mouvements, ajouter l'eax, substrater, eax a pu avoir comme conséquence l'IR suivant après la propagation d'expression : m : = m - (m + m) ; L'expression en résultant est plutôt le langage de haut niveau évolué, et a également éliminé l'utilisation du registre eax de machine. Les analyses postérieures peuvent éliminer le registre de ebx.

Type analyse

Un bon decompiler de code machine exécutera le type analyse. Ici, la manière s'enregistre ou les endroits de mémoire sont résultat utilisé dans les contraintes sur le type possible de l'endroit. Par exemple, une instruction de and implique que l'opérande est un nombre entier ; les programmes n'emploient pas une telle opération sur des valeurs de virgule flottante (excepté en le code de bibliothèque spéciale) ou sur des indicateurs. Une instruction de add a comme conséquence trois contraintes, puisque les opérandes peuvent être les deux nombre entier, ou un nombre entier et un indicateur (avec le nombre entier et l'indicateur résulte respectivement ; la troisième contrainte vient de la commande des deux opérandes quand les types sont différents).

On peut identifier de diverses expressions à niveau élevé qui déclenchent l'identification des structures ou des rangées. Cependant, il est difficile de distinguer plusieurs des possibilités, en raison de la liberté que le code machine ou même certains langages de haut niveau évolués tels que C permettent avec des fontes et l'arithmétique d'indicateur.

L'exemple de la section précédente a pu avoir comme conséquence le code à niveau élevé suivant :

ebx du struct T1* ; T1 de struct { international v0004 ; international v0008 ; international v000C ; } ; ebx->v000C - = ebx->v0004 + ebx->v0008 ;

Structurer

La phase pénultième de décompilation comporte structurer de l'IR dans les constructions de plus haut niveau telles que des boucles de while et des rapports conditionnels de if/then/else. Par exemple, le code machine eax de xor, eax l0002 : ou ebx, ebx jge l0003 ajouter l'eax, ebx de mouvements, jmp l0002 l0003 : mouvements, eax

a pu être traduit en :

eax = 0 ; tandis que (ebx < 0) { eax += ebx->v0000 ; ebx = ebx->v0004 ; } v10040000 = eax ;

Il est plus difficile traduire code non structuré en code structuré que le code déjà structuré. Les solutions incluent replier un certain code, ou ajouter des variables booléennes. Voir le chapitre 6 de.

Coder la génération

La phase finale est la génération du code à niveau élevé dans l'arrière saison du decompiler. Juste comme un compilateur peut avoir plusieurs arrière saisons pour produire du code machine pour différentes architectures, un decompiler peut avoir plusieurs arrière saisons pour produire du code à niveau élevé dans différents langages de haut niveau évolués.

Juste avant la génération de code, il peut être souhaitable de permettre une édition interactive de l'IR, peut-être using une certaine forme de l'interface utilisateurs graphique . Ceci permettrait à l'utilisateur d'écrire des commentaires, et à des noms non-génériques de variable et de fonction. Cependant, ceux-ci sont presque comme facilement entré dans une décompilation de poteau éditer. L'utilisateur peut vouloir changer des aspects structuraux, tels que convertir une boucle de while en boucle de for. Ceux-ci sont moins aisément modifiés avec un éditeur de texte simple, bien que les outils refactoring de code source puissent assister ce processus. L'utilisateur peut devoir écrire l'information qui n'a pas identifiée pendant le type phase d'analyse, par exemple modifiant une expression de mémoire selon une rangée ou une expression de structure. En conclusion, l'IR incorrect peut devoir être corrigé, ou des modifications être apporté pour rendre le code de rendement plus lisible.

Légalité

La majorité de programmes informatiques sont couvertes par des lois de copyright . Bien que la portée précise de ce qui est couverte par copyright diffère de la région à la région, la loi sur les Droits d'Auteur fournit généralement à l'auteur (les programmeurs ou l'employeur) une collection de droits exclusifs au programme. Ces droites incluent la droite de tirer des copies, y compris des copies transformées en RAM du de l'ordinateur. Puisque le processus de décompilation implique tirer multiple de telles copies, il est généralement interdit sans autorisation du support de copyright. Cependant, parce que la décompilation est souvent une étape nécessaire en réalisant l'interopérabilité , lois sur les Droits d'Auteur de de logiciel décompilation dans des Etats-Unis et de l'Europe laiss de façon limitée.

Aux Etats-Unis, la défense de l'utilisation juste de copyright a été avec succès appelée dans des cas de décompilation. Par exemple, dans l'accolade de Sega v. de , la cour a soutenu que l'accolade pourrait légalement s'engager en décompilation afin d'éviter le dispositif de verrouillage de logiciel employé par les consoles du jeu de Sega

En Europe, la directive 1991 de logiciel prévoit explicitement une droite à decompile afin de réaliser l'interopérabilité. Le résultat d'un débat passionné entre, d'une part, des protectionnistes de logiciel, et, de l'autre, des universitaires aussi bien que les programmateurs de logiciel indépendants, l'article 6 permet la décompilation seulement si un certain nombre de conditions sont remplies :

d'abord, le decompiler doit avoir un permis d'employer le programme à decompiled.

en second lieu, décompilation doit être nécessaire pour réaliser l'interopérabilité avec le programme de cible ou d'autres programmes. L'information d'interopérabilité peut ne pas être donc facilement disponible, comme les manuels ou la documentation traversants du api . C'est une limitation importante. La nécessité doit être prouvée par le decompiler. Le but de cette limitation importante est principalement de fournir une incitation pour que les réalisateurs documentent et pour révèlent l'information de l'interopérabilité de leurs produits.

troisièmement, le processus de décompilation doit, si possible, être confiné aux parties du programme de cible concernant l'interopérabilité. Puisqu'un des buts de la décompilation est de gagner un arrangement de la structure de programme, il peut être difficile se réunir cette troisième limitation. Encore, le fardeau de la preuve est sur le decompiler.

En outre, l'article 6 prescrit que l'information obtenue par la décompilation ne peut être employée pour d'autres buts et qu'elle ne peut être donnée à d'autres.

De façon générale, la droite de décompilation fournie par Article 6 est intéressante, car elle codifie ce qui est prétendu être pratique commune dans l'industrie de logiciel. Peu de procès européens sont connus pour avoir émergé de la droite de décompilation. Ceci a pu être interprété en tant que signification de l'un ou l'autre une de deux choses : 1) le droit de décompilation n'est pas employé fréquemment et la droite de décompilation a pu donc avoir bien été inutile, ou 2) les fonctions de droite de décompilation et fournit la certitude légale suffisante pour ne pas provoquer des conflits légaux. Dans un rapport récent concernant l'exécution de la directive de logiciel par les Etats membres européens, la Commission européenne semble soutenir la deuxième interprétation.

Random links:Antoine Héroet | Opération Gaff | Existence de Dieu | Ion N. Petrovici | Decompiler