Utiliser un débogueur - OllyDbg Introduction à l'utilisation d'un débogueur de
Utiliser un débogueur - OllyDbg Introduction à l'utilisation d'un débogueur de bas niveau - OllyDbg Contenu 1. introduction o A quoi sert un débogueur o Notions nécessaires 2. un petit montage 3. Interface OllyDbg 4. Voies d'approche 5. Remontage 6. Plugins 1. Introduction Suite à ma ligne de tutoriels destinés à la programmation, je vais aborder un sujet qui m'intéresse beaucoup et peut-être intéressant pour les programmeurs en général : le désassembleur et les débogueurs. Tout d'abord, il serait intéressant de clarifier un peu ce qu'est un débogueur et ce qu'est un désassembleur, car bien qu'ils aillent presque toujours ensemble, ils ont des objectifs différents. Le désassembleur est quelque chose qui peut transformer le langage machine en langage assembleur, transcrivant les instructions envoyées au processeur à ses mnémoniques en assembleur (asm). À ne pas confondre avec un décompilateur, qui cherche à convertir le code natif en un langage de niveau supérieur tel que C, C++ ou Basic. Les débogueurs sont des programmes capables d'analyser, de déboguer et de tester des applications. Actuellement, la plupart des IDE de programmation ont un débogueur intégré (Visual Studio, par exemple). Leur utilisation principale est l'identification et la gestion des erreurs, car il est possible d'exécuter le code ligne par ligne (ou instruction par instruction) et d'analyser l'évolution des variables et le comportement du code. Les débogueurs de fichiers binaires déjà compilés - comme les exécutables Windows (EXE) - suivent le même concept que les débogueurs normaux, mais comme le code a déjà été compilé, il doit avoir un désassembleur intégré au débogueur pour décoder les instructions. Il existe actuellement des dizaines de débogueurs et désassembleurs, parmi lesquels les plus connus sont : W32DASM, IDA, WinDbg, SoftICE et Ollydbg. Dans ce tutoriel, vous utiliserez OllyDbg car c'est l'un des meilleurs et des plus puissants débogueurs (y compris un désassembleur) disponibles sur le marché. C'est aussi petit et gratuit. Site officiel d'OllyDbg, avec lien de téléchargement : http://www.ollydbg.de 1.1 A quoi sert un débogueur ? Beaucoup de gens se demandent pourquoi utiliser un débogueur, puisque dans la plupart des cas, vous avez accès au code source d'origine (si vous avez programmé l'application). Je citerai ci-dessous quelques-unes des plus grandes utilisations d'un débogueur : La gestion des erreurs. Certainement l'un des principaux. Parfois, lors de la programmation d'une application, une petite erreur passait inaperçue, provoquant un dysfonctionnement ou une opération illégale. Dans de nombreux cas, il vous est plus facile d'analyser le binaire déjà compilé dans un débogueur que d'essayer de trouver l'erreur dans le code d'origine. Au sein de ce même poste, on peut citer la correction de bugs dans les applications déjà abandonnées (à condition d'avoir l'autorisation de la société détentrice des droits). Ingénierie inverse. Le processus d'ingénierie inverse du logiciel ne pourrait pas être effectué efficacement sans l'utilisation d'un débogueur/désassembleur. Beaucoup de gens ont tendance à confondre craquage et ingénierie inverse, car ce sont des concepts différents. L'ingénierie inverse en soi est une activité complètement cool, car une grande partie de ce que nous voyons aujourd'hui n'était possible que grâce à l'ingénierie inverse. La création de pilotes Linux pour des périphériques qui ne fonctionnaient auparavant qu'avec Windows (WinModems) est un bon exemple de la façon dont la rétro-ingénierie nous apporte de bonnes choses. Apprentissage. L'utilisation de débogueurs et d'ingénierie inverse est l'un des meilleurs moyens d'apprendre le langage assembleur. Vous programmez quelque chose dans un langage de niveau moyen ou élevé, puis analysez la sortie du binaire compilé dans un débogueur. Avec ces connaissances, il est possible de mieux maîtriser le langage et de créer des algorithmes plus optimisés et plus efficaces. 1.2 Concepts nécessaires Pour comprendre le fonctionnement d'un débogueur, il est nécessaire de connaître un peu certains concepts liés à l'informatique, comme le fonctionnement de la mémoire, du processeur, des batteries et des adresses. Des connaissances de base en assembleur sont également requises, car c'est le langage que nous devrons analyser. Si vous débutez dans l'assemblage, soyez assuré que dans les chapitres suivants je vous en donnerai un aperçu, suffisant pour comprendre notre applet d'étude. Voici une brève liste de concepts : Processeur/CPU : C'est le cerveau de chaque ordinateur. C'est lui qui décode les instructions et exécute les codes opérationnels. Il est essentiellement composé d'une unité logique-arithmétique (ALU), d'une unité à virgule flottante (FPU), de registres, d'un cache, d'un bus et d'un générateur d'horloge. Mémoire RAM : Emplacement de stockage temporaire des données (elles sont effacées lorsque l'ordinateur est éteint). Chaque application utilise de la mémoire pour stocker ses données et celles-ci sont récupérées et gérées par le processeur. Adressage mémoire : Il s'agit d'une plage de valeurs qui pointent vers un emplacement mémoire spécifique. Chaque fois que vous écrivez ou lisez des données en mémoire, il est nécessaire d'indiquer l'adresse où se trouve cette valeur, afin que le processeur puisse la récupérer. Pile : C'est une structure de données. Sa principale caractéristique est son fonctionnement, où il suffit de mettre ou de supprimer des valeurs, sans indiquer d'adresse (LIFO – Last in, First Out – Last in, first out). Cela fonctionne de la même manière qu'une pile de livres où vous les empilez. Lorsque vous devez supprimer l'un d'entre eux, il est nécessaire de supprimer tous les livres d'en haut.' Registres : petits morceaux de mémoire présents à l'intérieur des processeurs (à ne pas confondre avec la mémoire RAM). Extrêmement rapide, car le processeur les utilise comme moyen temporaire de stocker des données et d'effectuer des opérations. La quantité de données pouvant être stockées dépend du type de processeur. Les processeurs 32 bits peuvent stocker des nombres jusqu'à 32 bits dans chaque registre, sans avoir besoin de routines de conversion. 2. Un petit montage Pour déboguer les binaires compilés, il est nécessaire d'avoir une connaissance (au moins basique) du langage assembleur, car c'est là que le langage machine est traduit. Assembly (ou asm, pour faire court) est un langage de bas niveau qui interprète essentiellement les codes opérationnels (opcodes, voir ci-dessous) et les transcrit dans leurs mnémoniques. C'est littéralement une traduction en langage machine. L'utilisation du langage assembleur peut être variée et peut faire un peu de tout, mais il est largement utilisé dans la programmation de base du noyau et dans les algorithmes qui doivent être hautement optimisés, où asm est le langage idéal, car il s'agit d'un langage purement traduit par machine . Je n'ai pas l'intention d'expliquer maintenant tout le fonctionnement, la structure et les commandes de la langue. Je vais juste vous donner un aperçu de certains termes et une brève description des commandes les plus basiques et les plus courantes que vous pouvez trouver. Nous devons d'abord définir ce que sont les mnémoniques et quels sont les opcodes. Les opcodes (traduits en code opérationnel ou code d'opération) sont l'instruction envoyée et interprétée par le processeur. Chaque opcode, lorsqu'il est interprété par le processeur, effectuera une opération. Les mnémoniques sont les mots ou les combinaisons de lettres utilisés pour représenter un opcode, rendant le langage machine plus lisible. Voici un exemple de mnémonique de commande MOV : MOV EAX,1 Cette commande d'assemblage déplace simplement la valeur 1 dans le registre EAX (nous verrons cela plus loin dans l'explication des commandes). Lors de la transformation en langage machine (par un assembleur), cette commande est traduite en un ensemble de nombres pouvant être interprétés par le processeur : B801000000 La théorie derrière la traduction des mnémoniques en opcode (et vice versa) est assez complexe, en particulier pour la plate-forme Intel sur l'architecture IA32. C'est un processus qui doit être réalisé petit à petit et sortirait un peu du contexte de ce tutoriel. La principale difficulté du langage assembleur est certainement sa structure, qui s'écarte du standard des langages de niveau supérieur comme le C ou le Pascal. Pas de si avec plusieurs comparaisons, commutateurs, pour ou pendant. Tout se fait avec de simples comparaisons et sauts, perdant sa linéarité (similaire au GoTo de BASIC). Heureusement, nous disposons aujourd'hui de débogueurs très intelligents capables de structurer et d'identifier les routines et les répétitions, ce qui facilite grandement le travail d'interprétation. Même avec ces améliorations, je pense toujours qu'il est important d'avoir un stylo et du papier à vos côtés, où vous pouvez prendre des notes et aller structurer/convertir le code au fur et à mesure que vous les interprétez. Pour l'assemblage, l'emplacement des valeurs et des variables est toujours basé sur les adresses qu'elles occupent en mémoire. Le nom que vous définissez pour une variable lors de la programmation est remplacé par l'adresse mémoire qu'elle occupe. Chaque instruction a également une adresse, qui est utilisée pour contrôler le flux et la structure du code. Chaque fois que vous faites un saut, il est nécessaire d'indiquer l'adresse à laquelle le code doit aller, comme ce qui s'est passé dans les numéros de ligne des anciens BASIC. Voir un exemple ci- dessous de ce à quoi ressemblerait un code en C et son résultat compilé en assembleur, en utilisant uniquement des registres communs uploads/S4/ utiliser-un-debogueur.pdf
Documents similaires
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/1ERFkxhMR6GuCAbOYCl6GBqMq3mN1QsyxqD1gvRfCwgc9iUdwHVytCTRFJbMO50PyBLn4hAviFkBw3IkTavkP9W0.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/rVsFpdyNzn8I0wCcK2n55mtV6RDhfy02PrLCm7IcODx7Yqpvcv8UrTHOuIhuCE5hfXykc5UPr7EqaTQR2YAJv2bv.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/q2OStlJ4bmqvk5qdpY5U0fVp59WZcpBsvfPTKy2Wfh2L5cuh4sscYsLj1U0t67M88eJDJsvlhIPntzNx3qpBns6S.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/3IIHMYvKHusDBU8c6ivP40TrAmO605UWU698odLOMwtTucwzzldnwDlbf0fg35bjaRCPGFcgLz1k0Ew3aJWviNLq.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/uzwqzZ3SKAqq3VAiGnM2i6xbq9XZSzpdC02vnUKURlsXnnFBYwkzPt14zN6YAZhe2Z0Z6Yv8Xxpc6Nzg1SUmbx58.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/BkXPdd3yqX8cwsyNwmiIbwXE9ZLLg0kKEW4pGOcms1opbUTmCDaJAjbLPZpUsa7SVA7dZfwcQJ9hayXfkeVjmZY7.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/WGfyyCL1RXdsoVzhVsb3AY26i4JHk9gjAytqzO4YabMUiZkHEeQgBVFXO8QBnlhO9g6OyzbK7Uc8fjBV6o1Q29sk.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/zR99vINBgspAoQYyCVs8Kcczidbj1Fr2XWr1SmXm2S1ekThHo4jI9HiCRyg3QHN7K1pf3VojV2oQMZqFgerhThlq.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/NeMjJ4UTypwRiE175f8ybHRw2YEbLIOOTS8P9pYlpEIjBrUrWWBgL883IckqzCEzUdTw4SWfN0dZyp839M3cXD5J.png)
![](https://b3c3.c12.e2-4.dev/disserty/uploads/preview/LGDPXnYDxurXFIti6jRu3DYP8f7NJW53oC9KRftv9TRhNtbpNx06RHcUTPwyb3dWWZ3uztVSwK3qhBJJ9J4FLWFt.png)
-
24
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jui 06, 2022
- Catégorie Law / Droit
- Langue French
- Taille du fichier 0.2685MB