Transmettre les outils d’ingénierie (compilateurs, assembleurs, linkers)

Original: http://www.backerstreet.com/decompiler/forward_tools.htm

 


Outils d’ingénierie avancées sont des programmes qui se déplacent d’un programme d’un niveau centré sur l’homme de l’abstraction vers une machine orientée niveau d’abstraction. Interface principale de la plupart des programmeurs de la machine est l’environnement de compilation. L’environnement de compilation prend comme entrée un ou plusieurs fichiers dans un langage de haut niveau comme le C ou Java, plus un certain nombre de supporter des fichiers tels que les bibliothèques et les fichiers de ressources et tous les convertit en un exécutable pour un environnement d’exécution particulier, disons Linux ou Windows (nous n’envisageons pas les formats de représentation programme niveau supérieures tels que UML, bien qu’ils peuvent aussi être la cible de décompilation). Cette opération s’effectue à travers un certain nombre d’étapes qui implique des programmes individuels :
  • Chaque fichier source de langage de haut niveau est compilé dans l’Assemblée par un compilateur pour ce langage de haut niveau.
  • Chaque fichier de langage d’assemblage, qu’ils soient créés par un compilateur ou directement par le programmeur, est converti en un fichier objet réadressable par un programme assembleur. L’assembleur n’est pas préoccupé de la langue dans laquelle a été utilisée pour écrire le fichier de source de haut niveau. Il concerne uniquement sur le processeur exécutera le code binaire. C’est la première étape l’information peut être perdue, étant donné que l’assembleur ne peut pas voir beaucoup de l’information qui est importante pour le programmeur, tels que les types et les noms de variables locales.
  • Chaque fichier objet réadressable est combinée avec un certain nombre de bibliothèques qui prennent en charge l’environnement d’exécution cible par l’éditeur de liens. L’éditeur de liens peut se soucient pas du processeur qui exécutera le programme. Il peut seulement soin propos quelle information est nécessaire pour le programme à charger par le système d’exploitation cible. L’éditeur de liens peut décider de supprimer les informations du fichier binaire généré qu’il pense que la volonté ne pas être nécessaire d’exécuter le programme.
Comme on le voit, à chaque étape quelques informations qui était vitales pour le programmeur, quand il a écrit le programme sont prélevées à la sortie de chaque outil car il n’est pas nécessaire à l’exécution finale du programme.
Ce qui est pire, c’est que le programmeur lui-même peut charger chaque outil de générer ou de supprimer des renseignements précieux. Lorsque vous utilisez un compilateur, l’utilisateur peut décider de :
  • générer des informations supplémentaires pour améliorer le débogage du code (l’option de ligne de commande -g des compilateurs Unix est utilisée à cet effet)
  • générer le code qui est plus difficile à comprendre pour l’homme, mais est mieux exécuté par les processeurs ; c’est-à-dire pour générer un code par optimisé la – O1-O2 ou commandement supérieur line options. Optimisation des compilateurs, à travers une série de transformations qu’ils effectuent sur les instructions générées, rendre le code final moins lisible même lorsque les informations de débogage dans le fichier final et la source d’origine est disponible et inspecté par un débogueur. Débogage de code optimisé est un domaine digne de recherche à part entière et n’est pas considéré dans le présent document, bien que plusieurs des techniques peuvent s’appliquer à un « débogueur hors optimisation ».
Lorsque vous utilisez les autres outils, l’utilisateur peut également affecter le fonctionnement d’un décompilateur, par exemple en demandant à l’éditeur de liens de supprimer toute information symbolique du fichier binaire.
Dès lors, n’importe quel outil que nous pouvons utiliser pour comprendre le programme peut être considéré comme un outil d’ingénierie inverse.

Comments are closed.