Continuer en reverse engeneering
|
12-09-2011, 23h53
(Modification du message : 16-09-2013, 09h01 par ark.)
Message : #1
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
Continuer en reverse engeneering
Bienvenue à tous, ce tuto est la suite de mon premier cours (ici)
Cette fois, on va apprendre a retrouver un numéro de série généré a partir d'un nom. Pour ce faire, on va se servir des registres, visibles sur OllyDBG (si vous ne voyez pas où ils se situent, relisez le premier cours ! ) et surtout, on va faire un vrai boulot d'analyse de code, j'espère que vous êtes prêts ! Ce cours est un exemple, tout n'est pas comme ça dans la vie, ce crackme est vraiment facile comparé a ce que vous pourrez trouver plus tard si vous continuez dans cette voie. Il vous faudra souvent réfléchir a comment le programmeur a voulu sécuriser son programme... Vous rencontrerez des algorithme bien plus compliqués, avec chiffrement... Tout ça pour vous dire que ce n'est qu'avec la pratique que l'on progresse. 1) Le matos ! Bah comme pour le premier tuto, on se servira de OllyDBG. Et comme exemple, ce crackme Et pour faire un keygen, j'utiliserais le langage C, et donc un IDE pour ce langage, mais si vous préférez un autre langage, ne vous gênez pas 2) Here we go ! Pour commencer, on ouvre notre petit crackme pour voir de quoi il est question. On note (ou retiens, si vous avez la flemme :p) les messages d'erreurs de ce que nous voulons modifier. Bon, allez, on ouvre OllyDBG maintenant ! Le programme est assez court, vous n'aurez aucun mal a retrouver vos messages d'erreur préférés, mais vous pouvez tout de même faire un clic droit -> search for -> all referenced text strings. Bon, alors on obtient ce code : Code : 00401318 /$ 55 PUSH EBP On nous demande notre nom, il est ensuite enregistré dans DWORD PTR SS:[ESP+14] Donc, là , si vous voulez mettre un nom de moins de 2 ou plus de (0F)h soit 15 caractères, ben on va se démerder avec nos connaissances de base ! (J'en profite pour attirer votre attention sur le JA et le JBE, qui signifient respectivement "saute si inférieur ou égale" et "saute si supérieur ou égale") Ici, plusieurs solutions, soit on nop tout (bande de barbares, je vous vois venir !) sinon, pour être un peu plus fin, on remplace le JA et le JBE par des JMP 00401397 (pour se retrouver juste après tout ce beau monde) Ensuite, on trouve du code... Puis on nous demande notre sérial, qui se trouve finalement enregistré dans EAX. Puis arrive ces lignes : Code ASM :
CMP DWORD PTR SS:[ESP+78],EAX On voit que en 004013F9 on retrouve le message de validation. C'est donc cette ligne que l'ont va modifié pour bypasser le sérial... Mais, ce n'est pas le but de ce cours ! (Enfin, faites le si ça vous amuse.) Le CMP nous donne ici une information importante, "DWORD PTR SS:[ESP+78]" -> nous indique où est stocké le véritable sérial. Remontons un peu plus haut dans le code, nous y avons trouvé ceci : Code : 00401397 |> 8B4424 7C /MOV EAX,DWORD PTR SS:[ESP+7C] Bon, analysons le ! Déjà , on peut voir qu'il est composé d'une boucle : Code ASM :
TEST AL,AL En jetant un rapide coup d'Å“il plus haut dans le code, on peut observer cette ligne : Code ASM :
MOV DWORD PTR SS:[ESP+7C],0 L'instruction MOV permet de déplacer une source vers une destination. On l'utilise comme ceci : MOV destination, source. (en assembleur, les instructions sont lues a "l'envers" c'est a dire qu'on a la destination avant la source.) Içi, on va donc mettre la valeur 0 dans DWORD PTR SS:[ESP+7C] Au tout début de l'algorithme, on peut voir que la valeur de DWORD PTR SS:[ESP+7C] est déplacée dans le registre EAX. Ensuite, on récupère la première lettre (BYTE récupère un octet) du nom entré dans AL. Puis, l'instruction MOVSX va permettre au programme de changer le type de la chaine récupérer. C'est un peu compliqué, je ne le détaillerai pas ici, mais sachez juste que dans ce cas présent, on se retrouvera avec la valeur décimale du code ASCII de la lettre sélectionnée. Code ASM :
MOV AL,BYTE PTR SS:[ESP+EAX+14] Ensuite, cette valeur hexa est récupérée et placée dans DWORD PTR SS:[ESP+78] grâce a l'instruction ADD (bah oui, ça ne fait qu'ajouter, additionner) Puis, le programme incrémente DWORD PTR SS:[ESP+7C] qui est finalement passé dans EAX. On place ensuite la lettre suivante du nom (BYTE PTR SS:[ESP+EAX+14]) dans AL. On a ensuite un TEST. Pour que le JNZ suivant saute, il faudra que AL et la valeur 0. Or, la seule façon pour qu'il atteigne le 0, c'est d'arriver en fin de chaine, en effet, lorsque l'on enregistre une chaine, celle ci ce termine OBLIGATOIREMENT par un caractère NULL ; qui vaut 00 en hexa. Donc, pour résumer, le programme parcours le nom entré, et additionne la valeur ASCII de chaque lettres. On peut donc trouvé notre sérial !! HOP HOP HOP, minute ! Je sais pas si vous avez remarqués, mais n'oublions pas cette ligne : ADD DWORD PTR SS:[ESP+78],0A410 On ajoute la valeur (0A410)h a la valeur précédemment calculée... N'oubliez pas une ligne ! C'est toujours très important ! bon, cette valeur vaut 42000 en décimal. Le sérial sera donc composé de : Valeur ASCII de chaque lettres additionnés + 42000 Bon, ben maintenant, vous prenez une table ASCII, votre calculatrice Windows pour convertir l'hexa en décimal. Et vous trouvez le sérial pour votre nom ! Ou alors... si vous êtes flemmards, vous codez un keygen... Allez ! Au boulot ! ça y est ? bon, je vous passe le code de mon keygen en C... Mais j'espère bien que vous m'avez codé ça, parce que c'est pas bien compliqué ! :p Code C :
#include <stdio.h> Voilà , c'est la fin de ce tuto, c'était plus une analyse de code qu'une manipulation, mais j'espère que ça vous a plut ! Sachez cependant que vous pouvez placer des breakpoint (en appuyant sur f2) sur les lignes de vos choix afin de pouvoir observer ce qu'il se passe dans les registres. Attention, une opération n'est faite qu'une fois passé a la ligne suivante. Si vous avez des questions, des remarques, etc, faites m'en part ! Voilà maintenant, je vous conseille grandement de pratiquer, mangez du crackme !! |
|
13-09-2011, 11h56
Message : #2
|
|
CyberSee
Admin fondateur de N-PN Messages : 1,721 Sujets : 287 Points: 157 Inscription : Jan 2012 |
Continuer en reverse engeneering
Un autre super de bon tuto :-) Félicitation _Ark_! Rep + 20!
|
|
13-09-2011, 13h13
(Modification du message : 22-10-2011, 16h41 par Di0Sasm.)
Message : #3
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
Continuer en reverse engeneering
Merci
Au fait, tu peux m'appeler Ark, les underscores je les ai mis parce qu'avant l'inscription on peut pas mettre de pseudo de 3 lettres... :p |
|
15-09-2013, 20h16
Message : #4
|
|
Hask
Newbie Messages : 9 Sujets : 3 Points: 5 Inscription : Nov 2012 |
RE: Continuer en reverse engeneering
Dans la continuité du premier, encore une fois merci pour cet excellent tuto !
J'ai décidé de me prendre au jeu à la suite de ce tuto et de coder un petit KeyGen en C# ! (Que je pratique depuis vraiment pas longtemps, soyez indulgents !). KeyGen disponible ici pour les intéressés ! En espérant te re-croiser un de ces jours Ark |
|
16-09-2013, 09h05
Message : #5
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: Continuer en reverse engeneering
Merci Hask :)
Pas de VM windows sous la main pour test ton KeyGen, mais j'ai prévu d'en install une bientôt. Citation :En espérant te re-croiser un de ces jours ArkAh, bah passe sur IRC, il y a que ça :p |
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Débuter en reverse engeneering. | ark | 15 | 1,321 |
22-03-2018, 03h50 Dernier message: ThomasBr |
|
Débuter en reverse engineering avec 0$ | 0x41 | 9 | 611 |
14-09-2012, 19h55 Dernier message: LR-6 |
|
Introduction au reverse engineering sous Win32 | fr0g | 7 | 879 |
11-10-2011, 11h50 Dernier message: naab |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)