Cours n°9 : Cracker un prog compressé
Objectif :
1°) Cracker et trouver le serial d'un programme qui a été compressé
Niveau :
- Assez facile (ou alors c'est que j'explique mal)
Ce qu'il vous faut :
- WinDasm (Voir page "Outils - Crack") + patch (40 Ko)
- Un éditeur hexadécimal comme HexDecCharEditor (Idem)
- Le crack-me (130 Ko)
- Le logiciel pour le décompresser (120 Ko)
Bon ben on y va !
Pour ce cours je vais utiliser un WinDasm patché, car avec les autres versions on ne verra pas les Data Strings References. Ne me demandez pas pourquoi, je n'en sais rien. Je vous conseille de garder votre ancienne version de WinDasm + la version patchée. Car ils ne donnent pas les mêmes résultats pour certains programmes. Ce patch vous permettra également de voir les Data String References des logiciels programmés en Visual Basic et il mets des couleurs (comme c'est joli :-).
Bon allez je crois que tout est prêt, alors on peut y aller. Tout d'abord comme d'habitude, en première phase, l'observation. On lance donc ce crack-me qui a été programmé en Delphi. On voit une fenêtre dans laquelle, il faut rentrer le bon serial. On tape un joli serial bidon, du style 123456 (original, non ?). On valide et là : "Wrong Serial - You are a bad cracker". Pfffff. "You are a bad cracker" : c'est vite dit ça. Attends un peu que je te désassemble, tu feras moins le malin après. Non mais ! Donc on lance notre WinDasm patché et on désassemble ce crack-me. Et qu'est-ce qu'on voit aux toutes premières lignes :
Object01: UPX0
RVA: 00001000 Offset: 00000400 Size: 00000000 Flags: E0000080
Object02: UPX1 RVA: 00036000 Offset: 00000400 Size:
0001FA00 Flags: E0000040
Object03: .rsrc RVA: 00056000 Offset: 0001FE00 Size: 00001200 Flags: C0000040
On voit qu'il a été compressé avec UPX. Et comme il est compressé, on ne voit pas de Data Strings References. C'est là qu'intervient notre décompresseur UPX. Pour le décompresser il faut copier le crack-me dans le même dossier que le décompresseur et renommez le fichier à décompressé en "1.exe" (ou alors modifiez le 'decompress.bat'). Une fois cette modification effectuée, on lance le 'decompress.bat'. Et voilà le prog est décompressé.
On désassemble alors le crack-me décompressé. Et là on voit enfin les Data Strings References. On cherche notre message "You are a bad cracker". Il n'y en a qu'un seul, donc pas de problème :
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:00442B8B(C)
|
:00442BA7 6A00 push 00000000
* Possible StringData Ref from Code Obj ->"Wrong Serial"
|
:00442BA9 B9582C4400 mov ecx, 00442C58
* Possible StringData Ref from Code Obj ->"You are a bad
cracker!"
On va donc à l'adresse 00442B8B qui est juste au dessus :
* Referenced by a (U)nconditional or
(C)onditional Jump at Address:
|:00442B5D(C)
|
:00442B79 8D55FC lea edx, dword ptr [ebp-04]
:00442B7C 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00442B82 E835FCFDFF call 004227BC
:00442B87 837DFC00 cmp dword ptr [ebp-04], 00000000
:00442B8B 751A jne 00442BA7
:00442B8D 6A00 push 00000000
* Possible StringData Ref from Code Obj ->"Nothing entered"
|
:00442B8F B92C2C4400 mov ecx, 00442C2C
* Possible StringData Ref from Code Obj ->"You have to
enter a serial"
Mais on voit que si on change ce saut, il va nous dire "Nothing entered" (= "rien d'entré" pour ceux qui ne sont pas bilingues). Ce message est appelé par un autre saut conditionnel, donc on y va :
* Possible StringData Ref from Code
Obj ->"12011982"
|
:00442B53 BAE82B4400 mov edx, 00442BE8
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00442AE7(C)
|
:00442B58 E8E70FFCFF call 00403B44
:00442B5D 751A jne
00442B79
:00442B5F 6A00 push 00000000
* Possible StringData Ref from Code Obj ->"Trial CrackMe
Cracked!"
|
:00442B61 B9F42B4400 mov ecx, 00442BF4
* Possible StringData Ref from Code Obj ->"Congrats! You
were successful!"
Ah ben ce message me plait bien ! On va donc forcé le programme à arriver sur ce message. On changera donc le 751A en 741A ou 9090. Donc ouvrez le crack-me avec l'éditeur hexadécimal (prenez bien celui qui est décompressé). Pour trouver ce 751A, je vais répéter comment faire car beaucoup de personnes me le demande par mail. On double-clique dans WinDasm sur la ligne du JNE. On regarde en bas dans la barre d'état et on voit :
Code Data @:00442B5D @Offset 00041F5Dh in File ....etc....
C'est l'offset dont on a besoin. C'est l'adresse de la ligne du JNE. L'offset ici est 41F5D. Le "h" qui suit indique que l'offset est en hexadécimal et non en décimal. Et nous vous occupez pas des "0" qui sont devant. C'est comme pour 8 ou 08 : c'est la même chose. Une fois qu'on a l'offset, on retourne dans l'éditeur hexa et on fait : "Edit" --> "Go To..." ou CTRL+T. Et on tape dans la case "Hex" (car l'offset est en hexadécimal) : 41F5D on valide. Et là comme par magie on tombe pile sur le 751A. On le change en 741A ou 9090 et on enregistre.
Un petit point sur l'enregistrement car je reçois également beaucoup de mails à ce sujet et j'en ai marre de répéter à chaque fois la même chose. Quand vous enregistrez votre programme modifié dans l'éditeur hexadécimal, si vous voulez enregistrez par dessus l'ancien il faudra fermer le crack-me s'il est déjà lancé et fermer WinDasm s'il est désassemblé avec. Sinon il vous dira "Writing failed". Mais le mieux est de l'enregistrer sous un autre nom. Et n'oubliez pas de mettre le ".exe" à la suite du nom quand vous enregistrez. Voilà.
Bon le crack-me est désormais cracké. Mais pour trouver le bon serial retournous un peu en arrière :
* Possible StringData Ref from Code
Obj ->"12011982"
<-- Tiens c'est bizarre ça !!!!
|
:00442B53 BAE82B4400 mov edx, 00442BE8
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00442AE7(C)
|
:00442B58 E8E70FFCFF call 00403B44
:00442B5D 751A jne
00442B79
:00442B5F 6A00 push 00000000
* Possible StringData Ref from Code Obj ->"Trial CrackMe
Cracked!"
|
:00442B61 B9F42B4400 mov ecx, 00442BF4
* Possible StringData Ref from Code Obj ->"Congrats! You
were successful!"
Avez-vous remarqué ce nombre : 12011982. Et bien c'est notre serial. Pas trop dur à trouver cette fois-ci, hein ?
Donc voilà comment cracker un programme qui semblait incrackable car il n'y avait pas de Data Strings References.
<<< Cours précédent Cours suivant >>>