Bon nous allons voir en deux crackme (les programmes fournis avec le zine) comment cracker des logiciels. Evidemment, il s'agit là de 2 tutoriaux pour les débutants donc très facile. Attaquons le premier, je l'ai programmé en C++. Voici la source :
#include <iostream.h>
#include <stdlib.h>
int main()
{
char s[6];
cout<<"Entrez le password : ";
cin>>s;
if (strcmp(s,"crack")==0) cout<<"\nGood Guy";
else cout<<"\nBad Guy";
cout<<"\nVous avez entre : "<<s<<endl;;
system("PAUSE"); << Attention à
cause de cette commande le prog ne fonctionne que sur Windows
return 0;
}
Donc si le mot de passe est 'pass' alors c'est bon sinon c'est pas bon (il affiche Bad Guy).
Voici le matos qu'il nous faut :
- un désassembleur (W32Dasm)
-un éditeur hexadécimal (HexWorkshop)
Vous trouverez ces progs sur //protools.cjb.net (si je me souviens bien).
Donc on ouvre le désassembleur (on va faire avec W32Dasm). On fait Disassembler > Open File to Disassemble et on choisi notre prog (crackme.exe). Là on voit le code source mais en assembleur (voire le tut de HexWorkshop pour comprendre tout ça). On regarde le bouton des String Data Ref, merde, on ne voit pas notre message d'erreur (ce qui est très pratique pour cracker un logiciel) !!!!
En effet ce programme n'est pas très évolué et ne fait pas appel aux API Windows, c'est pour cela que l'on ne voit pas touts les chaînes de caractères. C'est pas grave, cette leçon a justement comme objectif de faire sans. On clique alors sur Goto Program Entry Point (deuxième bouton avec la lampe de poche) et on tombe sur ces lignes :
//******************** Program Entry Point ********
:004011D4 55 push ebp
On clique sur la première ligne en assembleur du Program Entry Point et on regarde en bas.
On voit : Code Data @:004011D4 @Offset 000005D4h in File:crackme1.exe
Ce qui veux dire que dans W32Dasm l'offset 5D4 correspond à l'adresse 4011D4. On prend la calculatrice de windows en mode scientifique et on fait 4011D4 - 5D4 et on obtient 400C00, c'est le chiffre de conversion offset/adresse.
Il faut savoir à quoi ressemble un programme dans la mémoire : il est composé d'une partie appelée code, une autre appelée data et plus haut se trouve la pile (tout en haut en fait). On peut
représenter ça comme ça :
Stack
|
\/ /\ |
Data
|
Code
|
Top
Je sais que c'est pas très clair mais bon... c'est juste pour vous expliquer que le programme en lui même ne commence pas au tout début car au début on trouve la description du fichier : son type (exécutable), sa date de création, sa taille, son nom... Ca explique pourquoi les instructions commencent à 4011D4 et non à 00000000.
Bottom
On ferme et on va dans l'éditeur hexadécimal, on ouvre crackme.exe et on fait une recherche sur le message d'erreur (Bad Guy). Il faut savoir qu'en C une chaîne de N caractères est codée de la façon suivante : N octets sont utilisés correspondant donc à la chaîne ; un octet supplémentaire est utilisé pour signaler la fin de la chaîne ; ce dernier est l'octet 00. On trouve alors la chaîne à l'offset 636 (voir ici), elle correspond donc au code 0A42 6164 2047 7579 00 en hexadécimal. Maintenant on veux traduire l'offset en adresse alors avec la caltos windows on fait : 400C00 + 636 = 401236 (oubliez pas de cocher Hex pour les calcul :-).
On note cette adresse et on retourne dans W32Dasm. On fait Search > Find Text puis on entre "push 00401236", on tombe sur ces lignes là :
* Reference To: msvcrt.strcmp, Ord:0282h <<
Tiens notre fonction de comparaison !
|
:0040129C E803E00000 Call 0040F2A4
:004012A1 83C410 add esp, 00000010
:004012A4 89C0 mov eax, eax
:004012A6 85C0 test eax, eax << Ici la vérification
du mot de passe !!!
:004012A8 7517 jne 004012C1 << Si eax est différent
de 0 on saute en 4012C1 afin d'afficher Bad Guy
:004012AA 83C4F8 add esp, FFFFFFF8 Sinon on continue notre
chemin
:004012AD 682C124000 push 0040122C <<Ici on affiche
Good Guy
* Possible Indirect StringData Ref from Data
Obj ->"d0A"
|
:004012B2 6828204100 push 00412028
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:00401242(C)
|
:004012B7 E8DC120000 call 00402598
:004012BC 83C410 add esp, 00000010
:004012BF EB15 jmp 004012D6 << Ici on se casse (on
va pas afficher à la fois Bad Guy et Good Guy !!)
* Referenced by a (U)nconditional or (C)onditional
Jump at Address: << On est venu ici par un jump
conditionnel en 004012A8
|:004012A8(C)
|
:004012C1 83C4F8 add esp, FFFFFFF8
:004012C4 6836124000 push 00401236 <<
Ici on affiche Bad Guy
Bon il y a plusieurs façons de cracker ce truc mais un seul objectif : faire en sorte que le programme affiche "Good Guy". On pourrait faire croire au programme que eax est à 0 ainsi on éviterais le "Bad Guy". Pour cela c'est simple : plutôt que de mettre mov eax, eax (en004012A4) on pourrais mettre xor eax, eax ainsi eax prend la valeur 0. Cela marcherais car l'instruction fait le même nombre d'octets (2 octets). En effet mov eax, eax correspond à 89C0 et xor eax, eax correspond à 31C0. Mais on va faire un truc plus classique : on va modifier le saut conditionnel.
Ce dernier va aller afficher un message d'erreur si le pass est mauvais sinon il continue. On a donc 2 possibilités. On peut inverser la condition du jump ainsi si un mauvais pass est entré le prog affiche Good Guy mais en imaginant qu'un mec entre le bon le prog va l'insulter de "Bad Guy". L'autre possibilité (et celle que l'on va retenir) est d'annuler le jump ; on continue alors bêtement notre chemin et on affiche Good Guy.
La ligne à modifier est donc :
:004012A8 7517 jne 004012C1, la traduction hexa de cette instruction est 7517. Pour l'inverser (en un je) il suffirait de mettre 7417 à la place mais nous on utilise des nop qui ne font rien d'où leur utilité ;-). Un nop correspond à 90 donc un seul octet donc pour prendre la place nécessaire on fait 2 fois rien (9090). Toujours dans W32Dasm on clique sur la ligne du jump et on regarde en bas de la fenêtre : Offset 000006A8h. On note donc sur un papier : 6A8 et 7517 puis on va dans HexWorkshop et on ouvre le crackme.
Vous faites Edit > Goto, vous cochez Hex, From begining of the file, et vous entrez 6A8. Vous tombez juste devant le 7517 (enfin le curseur se met sur la traduction ascii à coté mais c sur la même ligne). Vous tapez donc 9090 par dessus et vous enregistrez, le prog vous propose de faire une sauvegarde, c'est plus prudent (si on se loupe le prog ne marche plus).
Moi ça marche donc si vous ça marche pas c que vous avez loupez un truc. Je lance le crackme, il me demande le password, je lui dit que je l'emmerde et il me dit que je suis un gentil garçon : Mission accomplie !
Il s'agit du tutorial sur comment cracker HexWorkshop, je l'avais fait ya pas mal de temps donc j'avais eu pas mal de difficultés. Maintenant je pense que ça irais plus rapidement, pour l'avoir il faut dézipper crakme2.zip et tout est expliqué dedans même des trucs plus généraux sur les protections logiciels et des trucs sur l'assembleur donc je vous conseille de le lire si vous n'avez pas compris le tut précédent.