Un désassembleur sert à voir ce qu'il y a à l'intérieur d'un programme (EXE, DLL,). Quand vous en désassemblerez un, vous aurez droit à un listing traduit en code assembleur. Lorsqu'un programmeur fait un programme, il utilise des instructions spécifiques à son langage (C++, Visual Basic, ...). Il enregistre ensuite son code source dans un fichier puis il le compile. Le compilateur va transformer le code source spécifique au langage en assembleur qui ne peut être lu que par le même environnement où il a été compilé. Si le programme a été compilé sous windows, il ne marchera que sous Windows. Quand vous avez un .EXE sur votre disque, celui-ci est donc en assembleur. Si vous l'ouvrez avec un éditeur hexadécimal, vous ne verrez pas d'instructions assembleur mais la valeur hexadécimale des instructions (ex : NOP équivaut à 90)
Pour voir ces instructions assembleur, il vous faut donc un désassembleur et donc W32Dasm. (il existe le logiciel IDA - le best of en la matière de désassemblage - mais il est beaucoup plus difficile d'utilisation).
L'avantage de W32dasm est qu'il possède aussi la fonction de debugging (permet d'exécuter pas à pas les instructions assembleur) et de ce fait, cela peut épargner l'utilisation de SoftIce (maître incontesté du debugging).
2. Présentation du logiciel : les menus
2.1. Disassembler
Open File to Disassemble :
Permet l'ouverture du fichier à désassembler.
Disassembler Options :
A cocher : Enable JUMP CONDITIONAL ,JUMP INCONDITIONNAL + CALL (X référence) [options par défaut].
Permet l'ouverture du fichier à désassembler.
Disassembler Options :
A cocher : Enable JUMP CONDITIONAL ,JUMP INCONDITIONNAL + CALL (X référence) [options par défaut].
Ces choix sont faits pour afficher ou non les CALL et JUMP qui vont appeler les routines qui suivent. Dans cet exemple vous voyez que l'adresse 00401A00 peut être appelée par un JUMP aux adresses 004019B3, 004019CC et 004019EC à 'Referenced by a (U) nconditionnal ... Jump ...'
Idem pour 00401A03 avec le CALL à l'adresse 004020A7 à 'Referenced by a Call...' Donc très important (pour suivre dans le listing désassemblé le déroulement du programme ou les éventuels chemins qu'il pourrait prendre)
Font :
Si vous ne voyez que des caractères illisibles, il est nécessaire de 'régler' les 'Fonts'
Idem pour 00401A03 avec le CALL à l'adresse 004020A7 à 'Referenced by a Call...' Donc très important (pour suivre dans le listing désassemblé le déroulement du programme ou les éventuels chemins qu'il pourrait prendre)
Font :
Si vous ne voyez que des caractères illisibles, il est nécessaire de 'régler' les 'Fonts'
2.2 Project
Open Project File :
Permet d'ouvrir un fichier projet précédemment sauvegardé. Les fichiers projet sont automatiquement sauvegardés quand vous sauvegardez le fichier désassemblé. Ils sont utiles au débugging.
Permet d'ouvrir un fichier projet précédemment sauvegardé. Les fichiers projet sont automatiquement sauvegardés quand vous sauvegardez le fichier désassemblé. Ils sont utiles au débugging.
2.3 Debug
Load Process :
Charge l'exécutable en mémoire.
(Pour info : les non exécutables, tels que les fichiers .DLL peuvent être débuggés.)
Attach to an Active Process :
Cette fonction permet de débugger un soft qui tourne déjà (c'est quelquefois très utile). Attention il ne peut s'agir que d'un programme 32 bits.
BreakPoint Toggle :
N'est effectif que lorsque le programme est chargé en mémoire (load process). Pose un point d'arrêt sur la ligne du code sélectionné (ligne bleu-ciel). Un point jaune apparaît lorsque le point d'arrêt est actif et bleu foncé quand il est désactivé. La touche F2 permet la pose du point d'arrêt.
Run Process :
Exécute le process si celui-ci a été préalablement chargé en mémoire. Le process s'exécutera jusqu'à ce qu'il trouve un point d'arrêt, qu'on lui demande une pause, ou que l'on active la fonction de pas à pas.
Pause Process :
Stoppe le process (stand by) en cours.
Goto Curent EIP :
Va pointer directement à l'adresse où le process est en cours et donc sur son instruction.
Single Step Thru :
Traçage ligne par ligne en n'entrant pas dans les sous-programmes. (Call)
Single Step Into :
Traçage ligne par ligne en entrant dans les sous-programmes. (Call)
Auto Single Step Thru :
Traçage automatique en n'entrant pas dans les sous-programmes. (Call)
Auto Single Step Into :
Traçage automatique en entrant dans les sous-programmes. (Call)
Terminate Process :
Termine le process en cours de debuggage.
Debugger Options :
A laisser activé (pour l'instant) 'Debug only this process' et 'Display program generated exeptions'.
Charge l'exécutable en mémoire.
(Pour info : les non exécutables, tels que les fichiers .DLL peuvent être débuggés.)
Attach to an Active Process :
Cette fonction permet de débugger un soft qui tourne déjà (c'est quelquefois très utile). Attention il ne peut s'agir que d'un programme 32 bits.
BreakPoint Toggle :
N'est effectif que lorsque le programme est chargé en mémoire (load process). Pose un point d'arrêt sur la ligne du code sélectionné (ligne bleu-ciel). Un point jaune apparaît lorsque le point d'arrêt est actif et bleu foncé quand il est désactivé. La touche F2 permet la pose du point d'arrêt.
Run Process :
Exécute le process si celui-ci a été préalablement chargé en mémoire. Le process s'exécutera jusqu'à ce qu'il trouve un point d'arrêt, qu'on lui demande une pause, ou que l'on active la fonction de pas à pas.
Pause Process :
Stoppe le process (stand by) en cours.
Goto Curent EIP :
Va pointer directement à l'adresse où le process est en cours et donc sur son instruction.
Single Step Thru :
Traçage ligne par ligne en n'entrant pas dans les sous-programmes. (Call)
Single Step Into :
Traçage ligne par ligne en entrant dans les sous-programmes. (Call)
Auto Single Step Thru :
Traçage automatique en n'entrant pas dans les sous-programmes. (Call)
Auto Single Step Into :
Traçage automatique en entrant dans les sous-programmes. (Call)
Terminate Process :
Termine le process en cours de debuggage.
Debugger Options :
A laisser activé (pour l'instant) 'Debug only this process' et 'Display program generated exeptions'.
2.4 Search
Find Text :
Utile pour la recherche d'une suite de caractères de toutes sortes. (F3 pour une recherche suivante)
Utile pour la recherche d'une suite de caractères de toutes sortes. (F3 pour une recherche suivante)
2.5 Goto
Goto code start : aller à la première ligne du code désassemblé (Ctrl S)
Goto program entry point : aller à la première ligne du démarrage du programme.(F10)
Goto page : aller à la page désirée (toutes les indications se trouvent en bas de l'écran lors de vos déplacements dans le programme).(F11) - fonction très peu utilisée !
Goto code location : aller à l'adresse mémoire désirée. (En 32 bits : adresse Code offset) (En 16 bits : Code segment + Code offset) (Shift F12)
Goto program entry point : aller à la première ligne du démarrage du programme.(F10)
Goto page : aller à la page désirée (toutes les indications se trouvent en bas de l'écran lors de vos déplacements dans le programme).(F11) - fonction très peu utilisée !
Goto code location : aller à l'adresse mémoire désirée. (En 32 bits : adresse Code offset) (En 16 bits : Code segment + Code offset) (Shift F12)
2.6 Execute Text
Lors d'une étude du programme avec le listing désassemblé, quand vous vous trouvez sur un CALL ou un JUMP (surlignement en jaune vert) : pour simuler un CALL ou un JUMP, il suffit de se placer sur l'instruction, et de faire FLECHE DROITE et vous irez automatiquement à l'adresse indiquée (il existe également les boutons 'Jump to' et 'Call'. Pour simuler le RET, vous utiliserez FLECHE GAUCHE.
2.7 Functions
- Les imports : ce sont les fonctions ou procédures appartenant au fichier actuellement désassemblé qui peuvent être appelées par un programme ou module externe. Ce sont essentiellement les API de Windows (affichées en bleu dans le listing): vous pouvez poser des BPX dessus. Visionnez les pour chaque programme : elles pourront vous être très utiles si vous voulez débugger avec SOFTICE.
- Les exports : c'est exactement l'inverse, ce sont les fonctions ou procédures qui appartiennent à d'autres fichiers (soit des DLL ou VXD ou DRV ..) qui sont appelées par le fichier actuellement désassemblé. Vous avez ici tous les fichiers à qui le programme envoie (exporte) des infos.
- Les exports : c'est exactement l'inverse, ce sont les fonctions ou procédures qui appartiennent à d'autres fichiers (soit des DLL ou VXD ou DRV ..) qui sont appelées par le fichier actuellement désassemblé. Vous avez ici tous les fichiers à qui le programme envoie (exporte) des infos.
2.8 Hexdata
La représentation du programme en Hexadécimal
2.9 Refs
- Menu references :affichage des menus du programme.
- Dialog references : affichage des dialogues du programme.
String data references : affichage des commentaires concernant le déroulement du programme. Repères posés par le créateur du programme pour s'y retrouver et qui nous sont bien utiles. Et c'est avec ces repères que W32dasm est génial. Le principe est de relever tous les contenus des boites de dialogue lors du déroulement normal du programme (ex: Votre période d'évaluation est terminée; Veuillez vous enregistrer... etc ) et ensuite de trouver dans ces ' String Dat ...' les mêmes phrases ou tout du moins ce qui se rapproche afin de se retrouver dans la routine qui crée ces boites de dialogue.
Le fait de double cliquer sur une ligne quelconque vous amène directement sur la ligne concernée dans le listing (vérifier si il y en a plusieurs). Je précise que certain de ces menus peuvent être absents suivant le type de programme.
- Dialog references : affichage des dialogues du programme.
String data references : affichage des commentaires concernant le déroulement du programme. Repères posés par le créateur du programme pour s'y retrouver et qui nous sont bien utiles. Et c'est avec ces repères que W32dasm est génial. Le principe est de relever tous les contenus des boites de dialogue lors du déroulement normal du programme (ex: Votre période d'évaluation est terminée; Veuillez vous enregistrer... etc ) et ensuite de trouver dans ces ' String Dat ...' les mêmes phrases ou tout du moins ce qui se rapproche afin de se retrouver dans la routine qui crée ces boites de dialogue.
Le fait de double cliquer sur une ligne quelconque vous amène directement sur la ligne concernée dans le listing (vérifier si il y en a plusieurs). Je précise que certain de ces menus peuvent être absents suivant le type de programme.
3. Utilisation
Ouverture du fichier à traiter :
Une session commencera toujours par un désassemblage suivi aussitôt par une sauvegarde du texte avec création d'un fichier projet, ce qui nous évitera toute perte de temps ultérieure. Car l'étape du désassemblage peut parfois prendre quelques minutes. Par la suite, on rechargera le projet précédemment sauvegardé (les noms de fichier par défaut sont très bien).
Une session commencera toujours par un désassemblage suivi aussitôt par une sauvegarde du texte avec création d'un fichier projet, ce qui nous évitera toute perte de temps ultérieure. Car l'étape du désassemblage peut parfois prendre quelques minutes. Par la suite, on rechargera le projet précédemment sauvegardé (les noms de fichier par défaut sont très bien).
3.1 Le désassemblage
Ouvrir 'Disassembler' à 'Open File To Disassemble' à sélectionnez votre programme...
Double click dessus ou 'Ouvrir'.
Le processus de désassemblage commence.
Si vous voyez en bas le désassemblage s'effectuer ligne par ligne : c'est vraisemblablement un programme 16 bits à W32dsm pourra donc seulement le désassembler mais pas le débugger.
Par contre si vous voyez la procédure s'effectuer : 'Pre processing . . .Processing Call . . .Processing Jmp . . .Disassemble . . . à Programme 32 bits + debugging possible (suivant la taille du programme : cela peut être long : 15 min. parfois mais c'est rare).
Vous voyez apparaître le listing du programme.
Evidement il faut le sauvegarder à Save Disassembly Text File and Create Project File.
Il sera créé un fichier du programme désassemblé avec l'extension ALF dans un répertoire nommé Wpjfiles que vous pourrez lire avec un éditeur texte quelconque et un fichier projet avec l'extension WPJ qui vous sera nécessaire pour lancer le débugger (aussi présent dans le répertoire Wpjfiles).
Déjà avec les 'string data ref', vous pouvez essayer de situer quelques routines importantes suivant le but que vous recherchez.
Après avoir cliqué sur le bouton 'stn ref' on peut donc double-cliquer sur une chaîne et retrouver le code qui y fait référence (du moins dans la majorité des cas ). N'oubliez pas de dbl-clic plusieurs fois car la chaîne est peut-être référencée à d'autres endroits.
Ouvrir ' Goto ' à ' Goto Program Entry Point ' : vous arrivez à la ligne de début du programme.
Lors de vos déplacements, vous pouvez à tout moment double-cliquer sur une ligne de code, ce qui fait apparaître une ligne bleue avec en bas de l'écran l'offset du code dans le fichier désassemblé (très utile pour patcher plus tard).
Double click dessus ou 'Ouvrir'.
Le processus de désassemblage commence.
Si vous voyez en bas le désassemblage s'effectuer ligne par ligne : c'est vraisemblablement un programme 16 bits à W32dsm pourra donc seulement le désassembler mais pas le débugger.
Par contre si vous voyez la procédure s'effectuer : 'Pre processing . . .Processing Call . . .Processing Jmp . . .Disassemble . . . à Programme 32 bits + debugging possible (suivant la taille du programme : cela peut être long : 15 min. parfois mais c'est rare).
Vous voyez apparaître le listing du programme.
Evidement il faut le sauvegarder à Save Disassembly Text File and Create Project File.
Il sera créé un fichier du programme désassemblé avec l'extension ALF dans un répertoire nommé Wpjfiles que vous pourrez lire avec un éditeur texte quelconque et un fichier projet avec l'extension WPJ qui vous sera nécessaire pour lancer le débugger (aussi présent dans le répertoire Wpjfiles).
Déjà avec les 'string data ref', vous pouvez essayer de situer quelques routines importantes suivant le but que vous recherchez.
Après avoir cliqué sur le bouton 'stn ref' on peut donc double-cliquer sur une chaîne et retrouver le code qui y fait référence (du moins dans la majorité des cas ). N'oubliez pas de dbl-clic plusieurs fois car la chaîne est peut-être référencée à d'autres endroits.
Ouvrir ' Goto ' à ' Goto Program Entry Point ' : vous arrivez à la ligne de début du programme.
Lors de vos déplacements, vous pouvez à tout moment double-cliquer sur une ligne de code, ce qui fait apparaître une ligne bleue avec en bas de l'écran l'offset du code dans le fichier désassemblé (très utile pour patcher plus tard).
Vous pouvez voir que l'offset donné par WinDasm est 00002F65h
Le petit h (pour hexa) à coté de l'offset ne vous sert à rien, vous l'oubliez.
Et tous les zéros avant le premier chiffre, vous pouvez les oublier aussi.
On se retrouve donc avec un offset qui est 2F65.
Ici, à ce niveau vous pouvez, si vous êtes un "pro" de l'assembleur ou si vous avez beaucoup de patience, tracer le programme (avec les flêches clavier haut et bas) manuellement : Méthode du "Dead Listing". Heureusement il y a le debugging . . .
Le texte généré, n'est pas directement modifiable sous w32dasm. La fonction copier/coller n'étant pas directement accessible. Pour copier une partie du texte, il faut cliquer dans la marge gauche première ligne puis SHIFT CLIC marge gauche dernière ligne pour faire apparaître une série de points rouges devant les lignes sélectionnées. Ensuite, cliquer sur l'icône 'copier' ou faire CTRL-C. Cette sélection est aussi imprimable (icône imprimante).
Le petit h (pour hexa) à coté de l'offset ne vous sert à rien, vous l'oubliez.
Et tous les zéros avant le premier chiffre, vous pouvez les oublier aussi.
On se retrouve donc avec un offset qui est 2F65.
Ici, à ce niveau vous pouvez, si vous êtes un "pro" de l'assembleur ou si vous avez beaucoup de patience, tracer le programme (avec les flêches clavier haut et bas) manuellement : Méthode du "Dead Listing". Heureusement il y a le debugging . . .
Le texte généré, n'est pas directement modifiable sous w32dasm. La fonction copier/coller n'étant pas directement accessible. Pour copier une partie du texte, il faut cliquer dans la marge gauche première ligne puis SHIFT CLIC marge gauche dernière ligne pour faire apparaître une série de points rouges devant les lignes sélectionnées. Ensuite, cliquer sur l'icône 'copier' ou faire CTRL-C. Cette sélection est aussi imprimable (icône imprimante).
3.2 Le debugging
Si vous voulez débugger un programme désassemblé que vous avez déjà enregistré :
Ouvrir 'Project' - 'Open Project File' : vous devez voir 'votre programme .wpj'
Double Click dessus.
Ouvrir 'Debug' - 'Load Process'
Ouvrir 'Project' - 'Open Project File' : vous devez voir 'votre programme .wpj'
Double Click dessus.
Ouvrir 'Debug' - 'Load Process'
Wadsm peut vous demander de rentrer une ligne de commande initiale (utile pour le passage de paramètres). Si vous n'avez pas de paramètres à transmettre (la majorité des cas), cliquez simplement sur load (ou décochez l'option dans le menu debugger option, enable command line).
Deux fenêtres supplémentaires s'ouvrent : la fenêtre du traçage et la fenêtre qui affiche les 'informations, données, paramètres ...etc' qui passent par les registres du microprocesseur.
Deux fenêtres supplémentaires s'ouvrent : la fenêtre du traçage et la fenêtre qui affiche les 'informations, données, paramètres ...etc' qui passent par les registres du microprocesseur.
3.2.1 La fenêtre de traçage
AutoStep Into (F5) à Traçage automatique en entrant dans les Call.
AutoStep Over (F6) à Traçage automatique en ne rentrant pas dans les Call.
Step Into (F7) à Traçage ligne par ligne en entrant dans les Call
Step Over (F8) à Traçage ligne par ligne en rentrant pas dans les Call.
Pause à Arrêt du traçage (utile pour stopper les traçage Auto...).
La touche 'api' de la fenêtre de commande sert à déclencher l'apparition de la fenêtre 'api details' (avec les paramètres passés et tout et tout...) lorsqu'on est sur un call et que l'on n'a pas coché la/les case(s) 'enable undoc api' et/ou 'enable local func details'.
Il faut donc, lorsqu'on est sur le call, cocher la case ad hoc et sélecter 'api'.
Vous constaterez que quand vous tracez ligne par ligne (ou en 'auto') les lignes parcourues dans le listing deviennent rouges ce qui pourra vous être très utile.
Lorsque l'on fait du pas a pas, on peut voir tous les paramètres passés à un sous-programme en cochant les cases 'enable undoc api details' et 'enable local functions details' du panneau de commandes.
Cette possibilité est très importante et de part son aspect pratique, dépasse softice, et de loin, en convivialité. Ainsi, lorsqu'on arrive sur un call, une fenêtre s'ouvre faisant apparaître les paramètres passés.
AutoStep Over (F6) à Traçage automatique en ne rentrant pas dans les Call.
Step Into (F7) à Traçage ligne par ligne en entrant dans les Call
Step Over (F8) à Traçage ligne par ligne en rentrant pas dans les Call.
Pause à Arrêt du traçage (utile pour stopper les traçage Auto...).
La touche 'api' de la fenêtre de commande sert à déclencher l'apparition de la fenêtre 'api details' (avec les paramètres passés et tout et tout...) lorsqu'on est sur un call et que l'on n'a pas coché la/les case(s) 'enable undoc api' et/ou 'enable local func details'.
Il faut donc, lorsqu'on est sur le call, cocher la case ad hoc et sélecter 'api'.
Vous constaterez que quand vous tracez ligne par ligne (ou en 'auto') les lignes parcourues dans le listing deviennent rouges ce qui pourra vous être très utile.
Lorsque l'on fait du pas a pas, on peut voir tous les paramètres passés à un sous-programme en cochant les cases 'enable undoc api details' et 'enable local functions details' du panneau de commandes.
Cette possibilité est très importante et de part son aspect pratique, dépasse softice, et de loin, en convivialité. Ainsi, lorsqu'on arrive sur un call, une fenêtre s'ouvre faisant apparaître les paramètres passés.
On peut aussi directement lire les paramètres de retour en cliquant sur 'Get API Result', ce qui exécute le call (step over).
Run (F9) : Lancement normal du programme (toujours sous le contrôle de Wdsm). Les modifications que vous aurez effectuées seront prises en compte ainsi que les BPX. (mais pas réellement dans le programme).
Goto Adresse : Aller directement à une adresse désirée.
La pose de BPX (break point) s'effectue avec la touche F2 (apparition d'un petit carré jaune sur la gauche de la ligne concernée dans le listing et d'une étoile dans la fenêtre de traçage).
Pour placer un bkpt on peut aussi rechercher (icone 'imp fn') les appels à une fonction désirée (par exemple messageboxa ...) et placer un bkpt (ctrl-clic marge gauche) sur tous ces appels.
Patch Code : Ouverture d'une fenêtre pour modifier fictivement une instruction.
Pour modifier le soft, il faut faire 'patch code' sur le panneau de commande.
Apparaît alors la fenêtre permettant de rentrer le code assembleur de votre modification, puis il suffira de faire 'apply patch' pour povoir modifier votre programme (panneau de commande). Bien sur dans la fenêtre principale contenant le désassemblage initial, la modification n'apparaît pas car le texte est figé.
Le patch fonctionnera donc sur le soft exécuté en mémoire.
A la sortie soit de wadsm, soit du mode debugger ('terminate' panneau de commande), le patch est perdu.
Run (F9) : Lancement normal du programme (toujours sous le contrôle de Wdsm). Les modifications que vous aurez effectuées seront prises en compte ainsi que les BPX. (mais pas réellement dans le programme).
Goto Adresse : Aller directement à une adresse désirée.
La pose de BPX (break point) s'effectue avec la touche F2 (apparition d'un petit carré jaune sur la gauche de la ligne concernée dans le listing et d'une étoile dans la fenêtre de traçage).
Pour placer un bkpt on peut aussi rechercher (icone 'imp fn') les appels à une fonction désirée (par exemple messageboxa ...) et placer un bkpt (ctrl-clic marge gauche) sur tous ces appels.
Patch Code : Ouverture d'une fenêtre pour modifier fictivement une instruction.
Pour modifier le soft, il faut faire 'patch code' sur le panneau de commande.
Apparaît alors la fenêtre permettant de rentrer le code assembleur de votre modification, puis il suffira de faire 'apply patch' pour povoir modifier votre programme (panneau de commande). Bien sur dans la fenêtre principale contenant le désassemblage initial, la modification n'apparaît pas car le texte est figé.
Le patch fonctionnera donc sur le soft exécuté en mémoire.
A la sortie soit de wadsm, soit du mode debugger ('terminate' panneau de commande), le patch est perdu.
3.2.2 Modification d'instruction dans la fenêtre 'PATCH CODE'
EIP : L'adresse où vous êtes et son instruction.
Notez en visionnant dans la fenêtre traçage l'adresse de l'instruction suivante.
Enter New Instruction Below : Entrer la nouvelle instruction.
Un message d'erreur s'affichera si le nouveau code n'est pas valide.
Votre nouvelle instruction apparaîtra dans la grande fenêtre en dessous intitulée Code Patch Listing (en ASM et Hexa).
L'adresse suivante (et l'instruction) dans EIP apparaît à Important : il y a de fortes chances pour que la nouvelle instruction que vous avez rentrée n'ait pas la même taille mémoire que celle que vous avez remplacée . Vous devez impérativement compenser par des NOP si elle est inférieure afin de retrouver la même instruction suivante. Ne pas mettre d'instruction de taille supérieure. Et évidement si égale : OK .
Notez le code Hexa.(Cela vous servira pour la vrai modif sous éditeur HEXA) Continuez vos modifs si vous avez d'autres lignes à modifier. Elles s'incrémenteront au fur et à mesure dans la grande fenêtre.
Clear Patch : Effacer toutes les modifications.(revenir à l'état initial).
Remove Last Line : Effacer la dernière ligne entrée.
Apply Patch : Appliquer les modifications (+ confirmation).
Close : Fermeture de la fenêtre (+ confirmation).
( FIN DU PATCH.)
Terminate : Arrêt du debuggeur (passe à 'Close' quand le programme est arrêté ).
Je vous rappelle qu'à ce moment vous perdrez votre patch.
Notez en visionnant dans la fenêtre traçage l'adresse de l'instruction suivante.
Enter New Instruction Below : Entrer la nouvelle instruction.
Un message d'erreur s'affichera si le nouveau code n'est pas valide.
Votre nouvelle instruction apparaîtra dans la grande fenêtre en dessous intitulée Code Patch Listing (en ASM et Hexa).
L'adresse suivante (et l'instruction) dans EIP apparaît à Important : il y a de fortes chances pour que la nouvelle instruction que vous avez rentrée n'ait pas la même taille mémoire que celle que vous avez remplacée . Vous devez impérativement compenser par des NOP si elle est inférieure afin de retrouver la même instruction suivante. Ne pas mettre d'instruction de taille supérieure. Et évidement si égale : OK .
Notez le code Hexa.(Cela vous servira pour la vrai modif sous éditeur HEXA) Continuez vos modifs si vous avez d'autres lignes à modifier. Elles s'incrémenteront au fur et à mesure dans la grande fenêtre.
Clear Patch : Effacer toutes les modifications.(revenir à l'état initial).
Remove Last Line : Effacer la dernière ligne entrée.
Apply Patch : Appliquer les modifications (+ confirmation).
Close : Fermeture de la fenêtre (+ confirmation).
( FIN DU PATCH.)
Terminate : Arrêt du debuggeur (passe à 'Close' quand le programme est arrêté ).
Je vous rappelle qu'à ce moment vous perdrez votre patch.
3.2.3 La fenêtre contenu des registres
Au centre vous voyez tout ce qui 'passe' par les registres du processeur : 'Source for Data Disp 1', (EAX,EBX,ECX,EDX,ESI,EDI,EBP et EIP étant l'adresse mémoire où vous êtes). Ainsi que dans la case en haut à gauche. Vous les verrez évoluer au fur et à mesure du traçage | donc à visionner aux moments importants du traçage notamment lors de comparaison.
- Une calculette pour les conversions Hex:Dec est utile (présente comme utilitaire dans Hworks32).
Vous avez aussi la touche 'Oper' (presque en bas sur la gauche) qui quand elle est activée vous indique le contenu des opérandes : important, par exemple, pour savoir si les sauts conditionnels vont être effectués ou pas.
Les deux lignes du bas vous indiquent l'état du processus. (Dans le cas de figure : 'Non Fatal Access Violation '=Planté ...) La case 'Bpts' vous rappelle les BPX que vous avez posés. 'Clear' pour les supprimer.
Dans la fenêtre d'état, on voit la liste des adresses des bkpt avec un '*' pour signaler que le dit bkpt est actif. On peut donc le désactiver en cliquant (clic droit) dessus et le '*' disparaît. On peut aussi effacer tous les bkpts par 'clear', les activer tous par 'AA' ou les désactiver tous par 'DA'. La touche 'copy' sert à copier tous les bkpts dans le presse papier (le contraire eut été étonnant...;-)
En dessous 'Actives Dlls': les DLL actives pendant le déroulement du programme.
On notera cependant que l'on peut examiner le contenu de 2 cases mémoire (UA1 et UA2).
Le disp 2 sert à afficher le contenu du contenu. C'est à dire que si EAX=400000, avec le disp 1 on peut regarder ce que contient la zone mem 400000 en sélectionnant EAX et si 400000 contient une adresse par ex 420000 alors disp 2 affiche le contenu de 420000 (si 'disp 1 =source de disp2' est sélectionné). Quelques fois utile pour voir le contenu de pointeurs vers index ou bien l'inverse.
En sélectionnant 'oper' comme source disp 2, on voit apparaître les valeurs des différentes opérandes pointées par l'EIP (très utile).
Sous le disp 2, on remarque 2 lignes copiables (copy) qui contiennent pour la première, le déroulement de votre 'cracking session' pas à pas et la deuxième l'activité du soft (création de process, chargement dll, ...)( nb: en faisant 'copy' sur ces lignes, on copie bien sur tout le contenu de la session et pas seulement une ligne).
Pour modifier un flag ou une case mémoire, il faut passer par le bouton 'modify data' du panneau d'état.
La fenêtre ad hoc apparaît avec en haut tous les flags modifiables par simple clic, et au centre la liste des différents registres (EIP compris) ainsi qu'une case mémoire.
Pour modifier un registre ou une case mémoire, la procédure est la même:
- choisir le format (dword, word ou byte)
- taper la valeur (il y a un bug dans la version 8.93 qui ne permet que de taper que 7 caractères)
- appliquer la valeur en cliquant sur le registre choisi (si on se trompe on revient à la position initiale en cliquant 'r').
- Une calculette pour les conversions Hex:Dec est utile (présente comme utilitaire dans Hworks32).
Vous avez aussi la touche 'Oper' (presque en bas sur la gauche) qui quand elle est activée vous indique le contenu des opérandes : important, par exemple, pour savoir si les sauts conditionnels vont être effectués ou pas.
Les deux lignes du bas vous indiquent l'état du processus. (Dans le cas de figure : 'Non Fatal Access Violation '=Planté ...) La case 'Bpts' vous rappelle les BPX que vous avez posés. 'Clear' pour les supprimer.
Dans la fenêtre d'état, on voit la liste des adresses des bkpt avec un '*' pour signaler que le dit bkpt est actif. On peut donc le désactiver en cliquant (clic droit) dessus et le '*' disparaît. On peut aussi effacer tous les bkpts par 'clear', les activer tous par 'AA' ou les désactiver tous par 'DA'. La touche 'copy' sert à copier tous les bkpts dans le presse papier (le contraire eut été étonnant...;-)
En dessous 'Actives Dlls': les DLL actives pendant le déroulement du programme.
On notera cependant que l'on peut examiner le contenu de 2 cases mémoire (UA1 et UA2).
Le disp 2 sert à afficher le contenu du contenu. C'est à dire que si EAX=400000, avec le disp 1 on peut regarder ce que contient la zone mem 400000 en sélectionnant EAX et si 400000 contient une adresse par ex 420000 alors disp 2 affiche le contenu de 420000 (si 'disp 1 =source de disp2' est sélectionné). Quelques fois utile pour voir le contenu de pointeurs vers index ou bien l'inverse.
En sélectionnant 'oper' comme source disp 2, on voit apparaître les valeurs des différentes opérandes pointées par l'EIP (très utile).
Sous le disp 2, on remarque 2 lignes copiables (copy) qui contiennent pour la première, le déroulement de votre 'cracking session' pas à pas et la deuxième l'activité du soft (création de process, chargement dll, ...)( nb: en faisant 'copy' sur ces lignes, on copie bien sur tout le contenu de la session et pas seulement une ligne).
Pour modifier un flag ou une case mémoire, il faut passer par le bouton 'modify data' du panneau d'état.
La fenêtre ad hoc apparaît avec en haut tous les flags modifiables par simple clic, et au centre la liste des différents registres (EIP compris) ainsi qu'une case mémoire.
Pour modifier un registre ou une case mémoire, la procédure est la même:
- choisir le format (dword, word ou byte)
- taper la valeur (il y a un bug dans la version 8.93 qui ne permet que de taper que 7 caractères)
- appliquer la valeur en cliquant sur le registre choisi (si on se trompe on revient à la position initiale en cliquant 'r').
L'adresse de la case mémoire à modifier se trouve en bas de la fenêtre. Ne pas oublier en sortant de faire 'modify' pour appliquer la modif.
Pour revenir au point de départ on utilisera la touche 'goto current eip' de la fenêtre d'état. Avec la version 8.93, il existe un autre bug qui fait qu'après avoir modifié un registre ou un flag, on ne peut repartir en mode pas a pas (F7). Wdasm exécute un F9 (run).
Il est aussi possible que votre version de Wdasm ne permette pas de lire les Data String de programmes VB, dans ce cas procurez-vous un patch sur le net permettant de le faire!
Pour revenir au point de départ on utilisera la touche 'goto current eip' de la fenêtre d'état. Avec la version 8.93, il existe un autre bug qui fait qu'après avoir modifié un registre ou un flag, on ne peut repartir en mode pas a pas (F7). Wdasm exécute un F9 (run).
Il est aussi possible que votre version de Wdasm ne permette pas de lire les Data String de programmes VB, dans ce cas procurez-vous un patch sur le net permettant de le faire!
3.3 Les flags
OF : Débordement = Il permet de trouver et de corriger certaines erreurs produites par des instructions mathématiques. Très utile pour éviter les plantages. Si OF=1 alors nous avons affaire à un Overflow.
DF : Direction = C'est ce Flag qui donne l'indication sur la manière de déplacer les pointeurs (références) lors des instructions de chaînes (soit positiviment, soit négativement).
IF : Interruption = Enlève la possibilité au processeur de contrôler les interruptions.
Si IF=0, le processeur ne commande pas et si IF=1 alors c'est le contraire.
TF : Exécution pas à pas
SF : Signe = Simplement, sa valeur passe à 1 si nous avons un résultat signé (négatif ou positif).
ZF : Zéro = Il s'agit du Zero Flag qui est mis à 1 lorsqu'un résultat est égal à 0. Souvent utilisé pour les diverses opérations, il est utile pour éviter des problèmes de divisions (je vous rappelle que diviser par zéro est impossible).
AF : Retenue auxiliaire = AF est l'auxiliary carry qui ressemble à CF.
PF : Parité = La valeur de ce flag est 1 si le nombre de bits d'une opérande (paramètre d'une instruction) est pair.
CF : Retenue = Dans les opérations mathématiques, il arrive que le résultat de l'opération soit codé sur un nombre supérieur de bits. Le bit en trop est placé dans CF.
DF : Direction = C'est ce Flag qui donne l'indication sur la manière de déplacer les pointeurs (références) lors des instructions de chaînes (soit positiviment, soit négativement).
IF : Interruption = Enlève la possibilité au processeur de contrôler les interruptions.
Si IF=0, le processeur ne commande pas et si IF=1 alors c'est le contraire.
TF : Exécution pas à pas
SF : Signe = Simplement, sa valeur passe à 1 si nous avons un résultat signé (négatif ou positif).
ZF : Zéro = Il s'agit du Zero Flag qui est mis à 1 lorsqu'un résultat est égal à 0. Souvent utilisé pour les diverses opérations, il est utile pour éviter des problèmes de divisions (je vous rappelle que diviser par zéro est impossible).
AF : Retenue auxiliaire = AF est l'auxiliary carry qui ressemble à CF.
PF : Parité = La valeur de ce flag est 1 si le nombre de bits d'une opérande (paramètre d'une instruction) est pair.
CF : Retenue = Dans les opérations mathématiques, il arrive que le résultat de l'opération soit codé sur un nombre supérieur de bits. Le bit en trop est placé dans CF.
3.4 Les registres de segments
CS : Segment de Code ( Code Segment ) = Ce registre indique l'adresse du début des instruction d'un programme ou d'une sous-routine.
DS : Segment de Donnée ( Data Segment ) = Ce registre contient l'adresse du début des données de vos programmes. Si votre programme utilise plusieurs segments de donnée, cette valeur devra être modifiée durant son exécution.
ES : Extra Segment = Ce registre est utilisé, par défaut, par certaines instructions de copie de bloc. En dehors de ces instructions, le programmeur est libre de l'utiliser comme il l'entend.
SS : Segment de Pile ( Stack Segment ) = Il pointe sur une zone appelée la pile.
FS : Segment supplémentaire
GS : Segment supplémentaire = Ces deux registres ont un rôle fort similaire à celui du segment ES.
DS : Segment de Donnée ( Data Segment ) = Ce registre contient l'adresse du début des données de vos programmes. Si votre programme utilise plusieurs segments de donnée, cette valeur devra être modifiée durant son exécution.
ES : Extra Segment = Ce registre est utilisé, par défaut, par certaines instructions de copie de bloc. En dehors de ces instructions, le programmeur est libre de l'utiliser comme il l'entend.
SS : Segment de Pile ( Stack Segment ) = Il pointe sur une zone appelée la pile.
FS : Segment supplémentaire
GS : Segment supplémentaire = Ces deux registres ont un rôle fort similaire à celui du segment ES.
3.5 Les registres généraux
EIP : Pointeur d'instruction : associé au registre de segment CS (CS :IP) pour indiquer la prochaine instruction à exécuter. Ce registre ne pourra jamais être modifié directement; il sera modifié indirectement par les instructions de saut, par les sous-programmes et par les interruptions.
EAX : Accumulateur = utilisé lors des opérations arithmétiques.
EBX : Base = utilisé de façon différente selon les modes d'adressage mais habituellement utilisé lors des opérations arithmétiques.
ECX : Compteur = utilisé dans les boucles (LOOP).
EDX : Données = utilisé lors d'opérations arithmétiques.
ESI : Index de Source = utilisé lors d'opérations sur des chaînes de caractères ; il est associé au registre de segment DS.
EDI : Index de Destination = utilisé lors d'opérations sur des chaînes de caractères ; il est normalement associé au registre de segment DS; dans le cas de manipulation de chaînes de caractères, il sera associé à ES.
ESP : Pointeur de Pile = associé au registre de segment SS (SS :SP) pour indiquer le dernier élément de la pile.
EBP : Pointeur de Base = associé au registre de segment SS (SS :BP) pour accéder aux données de la pile lors d'appels de sous-programmes (CALL).
EAX : Accumulateur = utilisé lors des opérations arithmétiques.
EBX : Base = utilisé de façon différente selon les modes d'adressage mais habituellement utilisé lors des opérations arithmétiques.
ECX : Compteur = utilisé dans les boucles (LOOP).
EDX : Données = utilisé lors d'opérations arithmétiques.
ESI : Index de Source = utilisé lors d'opérations sur des chaînes de caractères ; il est associé au registre de segment DS.
EDI : Index de Destination = utilisé lors d'opérations sur des chaînes de caractères ; il est normalement associé au registre de segment DS; dans le cas de manipulation de chaînes de caractères, il sera associé à ES.
ESP : Pointeur de Pile = associé au registre de segment SS (SS :SP) pour indiquer le dernier élément de la pile.
EBP : Pointeur de Base = associé au registre de segment SS (SS :BP) pour accéder aux données de la pile lors d'appels de sous-programmes (CALL).