Décompilateur Design – Introduction

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

Introduction
Décompilation est une forme de rétroingénierie des logiciels. Son but est de convertir un fichier binaire compilé dans un fichier source. On peut vouloir faire cela pour plusieurs raisons, telles que pour comprendre le fonctionne d’un programme, ou pour essayer de modifier un programme pour l’améliorer ou de corriger un bug.
Décompilation a été autour depuis de nombreuses années, probablement depuis que les gens ont commencé à compiler des programmes de langages de haut niveau aux formats de bas niveau telles que l’Assemblée et le code machine.
Plusieurs tentatives ont été menées à l’écriture des décompilateurs exécutables binaires. Cette page a quelques exemples.
Il y a des décompilateurs encore plus disponible pour les environnements managés qui utilisent du code-octet, comme Java et c#. Une liste exhaustive est disponible sur le wiki de transformation du programme.
Dans ces pages nous allons nous concentrer sur la décompilation des exécutables binaires ou du code machine au code source, puisque c’est beaucoup plus difficile que de décompiler le byte-code Java ou c#.
Plusieurs langages et compilateurs peuvent produire du code machine, y compris certains Java, compilateurs c# et Visual Basic. C’est pourquoi le décompilateur doit savoir quelle langue a été utilisée pour compiler le programme et devra avoir le soutien de générer cette langue. Cependant, la plupart des problèmes difficiles de décompilation apparaître lors de l’utilisation des langues moins restrictives, à savoir: C, Pascal ou C++.
La plupart des algorithmes peut être utilisée pour toutes les langues, donc nous utiliserons principalement des exemples écrits en C. Quand nous montrons un algorithme, nous allons utiliser C ou C++, puisque ce sont les langues plus disponibles sur Linux et Windows.
Indépendamment de la langue cible, un décompilateur traite principalement de 3 types d’entités :
  • Objets de code (fonctions, déclarations)
  • Objets de données (variables globales et locales)
  • Types (types de variables, les prototypes de fonction)
Le problème constant d’un décompilateur est d’essayer d’en déduire une ou plusieurs des trois entités ci-dessus d’une séquence d’octets dans le fichier binaire. Pour ce faire, il est utile de savoir comment les outils de développement (que nous appelons des outils de “l’ingénierie directe”) sont utilisés lorsque vous écrivez un programme, puisque c’est le processus que nous essayons de revenir.

Comments are closed.