Titre

---------------------------------------- Chapitre I - Les bases ----------------------------------------

1er crackme - partie 1

 

Cible :

CrackMe1

Outils nécessaires :

OllyDbg (by Oleh Yuschuk)

 

Passons donc à la pratique. Nous allons travailler sur le crackme1, disponible dans le dossier "Pack/Chapitre I/3 - 1er crackme/ CrackMe1.rar". Ce crackme trés facile a été écrit directement en asm pour avoir un code assez simple à lire. Il va nous permettre d'appréhender les premières commandes sous Olly et les premiers principes du cracking. Aprés avoir extrait l'archive, exécuter le crackme :

 

CrackMe1

De façon trés classique, on nous demande un couple nom/mot de passe (serial) valide. On saisit donc un nom et un serial bidon ( 12345 par exemple). On clique sur OK et on a cette vilaine fenêtre qui s'affiche :

CrackMe1-BadBoy

On ferme tout ça, on ouvre Olly, menu File/Open (ou F3), on sélectionne le Crackme1 et on obtient ceci :

CrackMe1 dans Olly

On a maintenant dans Olly le code désassemblé du crackme1. Olly se positionne automatiquement sur la 1ere instruction qui va être exécutée au démarrage du programme. C'est ce que l'on appelle l'EP (Entry Point). Ici, le code est relativement court ( moins de 200 lignes), dans le cas d'un vrai programme, on atteint facilement plusieurs milliers de lignes.
Il faut donc pouvoir trouver l'emplacement qui nous intéresse : la routine qui s'occupe du serial (note : une routine est un morceau de programme effectuant une tâche spécifique). Lorsque l'on a essayé un serial bidon, on a eu le message " Serial incorrect !".
On va donc regarder si on retrouve ces mots quelque part dans le programme. Dans la fenêtre de code, faites un clic droit pour ouvrir un nouveau menu :

Search String

Positionnez le curseur sur Search for et dans le menu complémentaire cliquez sur All referenced strings (une string étant une chaîne de caractères). Une nouvelle fenêtre apparaît :

Liste des strings

Ici sont listées toutes les strings trouvées par Olly. Dans notre cas, comme pour les lignes de code, nous en avons très peu et pouvons voir de suite ce que nous cherchons. Dans le cas d'un programme beaucoup plus complexe, Olly met à notre disposition un outil de recherche. Faites un clic droit dans la fenêtre et cliquez sur Search Text. Une nouvelle boite de dialogue s'affiche :

Search text

Nous pouvons saisir une partie (ou plusieurs) de la phrase convoitée. Sélectionnez Entire block pour recherchez dans toute la liste (Forward recherche en descendant à partir de la ligne sélectionnée, Backward en remontant), cochez Ignore case pour ignorer la différence entre majuscules et minuscules puis OK, Olly vous amène directement sur le premier résultat trouvé. Si ce n'est pas le bon, CTRL+L ira au résultat suivant. Maintenant que nous avons notre ligne avec "Serial incorrect !", un double clic dessus nous ramène dans le code à la ligne où celui-ci est utilisé :

Ligne incorrect serial

Deux lignes au-dessus, nous voyons dans la marge le signe > . Cela signifie qu'un saut quelque part dans le programme fait référence à cette adresse. Sélectionnons cette ligne pour avoir plus d'infos :

Jump from

Dans la marge, une nouvelle flèche est apparue. En suivant celle-ci, on peut aller à l'origine du saut, mais il y a plus simple. Dans la fenêtre d'informations, Olly nous indique l'adresse de provenance du saut. Pour s'y rendre, clic droit sur cette ligne, puis il suffit de cliquer sur Go to JNE from 00401181 :

Boucle JNE

Nous arrivons dans une boucle, ce que nous montre l'accolade (nouveauté V2.01). Juste au-dessus de notre saut se trouve une comparaison (CMP). Le JNE (Jump Not Equal) effectuant un saut vers le message de mauvais sérial, cela veut dire que l'on sort de la boucle et donc du déroulement normal du programme dès que la comparaison est fausse. On va donc éviter de sortir en neutralisant ce saut. Pour cela, on va utiliser l'instruction NOP ( opcode = 90 h), cette instruction particulière de l'asm ne faisant rien (NOP = No OPeration). Soit on fait un clic droit dans le code et dans le menu on choisit Assemble, soit on appuie sur [barre d'espace] pour obtenir cette boite de dialogue :

Boite de dialogue Assemble

A la place de JNE SHORT CrackMe1.004011F1, on tape simplement NOP. Pour remplacer une instruction, il faut impérativement que la longueur de la nouvelle soit égale à l'ancienne afin de conserver l'alignement du code. On ne peut pas utiliser une instruction plus longue, cela entrainerait presque sûrement un plantage du programme. Ici les opcodes pour le JNE étaient : 76 6E et on veut remplacer par un NOP, dont l’opcode est 90. On doit donc compléter avec 2 octets supplémentaires, soit un NOP de plus qui ne fera qu'avancer l'exécution du programme jusqu'à la prochaine instruction. Pour faire ça automatiquement, on vérifie que Keep size et Fill rest with NOPs soient cochés (Keep size permet de conserver la taille et Fill rest with NOPs remplace les octets restants après ce que l'on a saisi par des 90). On clique sur Assemble et on revient dans le code :

Code modifié

Afin que les modifications soient bien visibles, Olly nous marque les lignes concernées en rouge. Plus qu'à tester si notre modification fonctionne. On clique sur F9 (ou F9) pour lancer le crackme, on saisit un nom et un sérial, on clique sur OK et :

Bravo

Vous avez réussi votre premier reverse, le programme accepte dorénavant n'importe quel mot de passe ! Afin de sauvegarder vos modifications, revenez dans Olly sans fermer le crackme, faites un clic droit dans le code puis Edit/Copy to executable, fermer la fenêtre qui vient de s'ouvrir, dans la boîte de dialogue qui apparaît, cliquez sur Yes, choisissez un répertoire, puis un nom par exemple CrackMe1_patch.exe et enregistrez.

Et voilà, vous avez fait votre premier crack par patching (remplacement de certains octets pour modifier le fonctionnement d'un programme).

Essayons maintenant une autre méthode ...

 

Precedent        Sommaire        Suivant