Reverse Engineering Tools

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


Même au cours du développement, programmeurs utilisent régulièrement des outils d’ingénierie inverses pour vérifier la justesse de leur programme. L’outil le plus utilisé est clairement le débogueur.

Débogueurs sont le meilleur outil d’ingénierie inverse, car ils permettent l’exécution étape par étape du programme et l’inspection des variables du programme. Si un débogueur est utilisé pour déboguer l’original code source ou code machine dépend de savoir si les informations de débogage est disponible au débogueur. En général les informations de débogage sont générée par le compilateur via un interrupteur (comme – g pour gcc) et sont transmise par l’assembleur et l’éditeur de liens pour le débogueur. Différentes normes sont utilisées entre les compilateur et débogueur à cet effet, et nous allons les examiner lorsque nous parlons de formats de fichier objet, puisqu’il s’agit d’informations très utiles, même pour les autres outils d’ingénierie inverses.
Alors qu’un débogueur peut faire exécution ou analyse « dynamique » du programme cible, les autres outils ne peuvent le faire l’analyse « statique ».
Démontage est une des caractéristiques des débogueurs, mais elle peut aussi être réalisée par un outil autonome, un désassembleur. Un désassembleur convertit une séquence d’octets qui sera potentiellement exécuté par le processeur, en une série de lignes de texte qui représentent l’opération exécutée par ces octets. Il s’agit d’un processus très grossière, et elle est sujette aux erreurs. Il repose sur l’hypothèse que la séquence d’octets étant démontée représente une instruction de processeur (le « code »). Si le compilateur a mis quelques données dans la section de texte, le désassembleur essaiera de convertir qui en instructions ; même pire que cela, le flux d’instructions peut devenir hors synchronisé, puisque beaucoup d’instructions ont des arguments qui s’étendent sur plus d’un octet. Nous examinerons ce problème encore une fois, lorsque nous parlons de l’identification des zones de code et les données.
Désassembleurs plus intelligents sont capables de fournir plus d’informations sur une instruction spécifique. En particulier, si l’instruction fait référence à une variable globale ou il appelle une fonction globale. N’oubliez pas que le processeur ne sait rien sur les fonctions et variables. Il ne connaît que les adresses mémoire. Par conséquent, un désassembleur intelligent devrait être capable de combiner des informations provenant de différentes parties du fichier binaire et de les présenter d’une manière significative.
« objdump » est un programme Linux qui a le plus de ces fonctionnalités.
D’un point de vue technique, le « objdump » n’est pas un disassember ; C’est un tombereau d’objet (d’où le nom). Un tombereau d’objet est très utile en ce qu’il peut montrer l’intégralité du contenu des fichiers binaires compilés, non seulement la zone de code. En fait, fichiers objets peuvent avoir beaucoup plus d’informations que ce que verra le processeur. Ils ont généralement des informations sur en mémoire une zone du fichier sera chargée ainsi qu’une liste de bibliothèques liées dynamiquement qui sont nécessaires pour exécuter le programme, ainsi que le code nécessaire pour lier et charger ces bibliothèques pendant l’exécution. Fichiers objets peuvent avoir également un ensemble de noms pour les adresses (symboles globaux) et dans certains cas informations même sur les variables locales et les types.
Même avec la richesse des informations fournies par un tombereau d’objet, l’information est encore au niveau de l’ordinateur. Le dumper objet montrera ce que le processeur et le système d’exploitation fonctionnent sur. Seulement dans des cas très rares, vous pouvez voir la source de votre programme mélangé avec le démontage de sortie (dans ce cas vous n’avez pas besoin de tout autre outil pour analyser le programme, puisque déjà, vous avez les sources).
Si vous voulez avoir une vue plus haut niveau du programme, vous devez convertir la vue de la machine en vue d’un programmeur. Autrement dit, vous avez besoin élever le niveau d’abstraction, introduisant des concepts qui ont été utilisés pendant la phase de développement, et qui ont été perdus au cours de la compilation et la phase de liaison.
C’est ce que décompilateurs : ils essaient de reconstituer l’information qui est partiellement perdue lors de la création du programme binaire. Ce document décrit la façon de procéder. Puisqu’il s’agit d’un sujet très technique, il est prévu que le lecteur connaît au moins un langage d’assemblage et de l’architecture du processeur. La plupart des algorithmes sont processeur indépendant, donc n’importe quel processeur vous savez. Le plus largement accessible processeur est x 86, donc la plupart des exemples utiliseront ce CPU, mais cela ne devrait pas vous empêchent de suivre le contenu, sauf dans certains cas de coin.