-= ~Cracking tutorial~ =-

N°2

-----------------------------------------------------------------------------------------
Ce tutorial a pour but informatif et je ne serai pas responsable de ce que vous en ferez!
-----------------------------------------------------------------------------------------






I) Introduction
____________


Voila c'est mon 2e tout que j'écris sur le cracking. Comme je vous l'ai dit je ne suis pas un expert mais j'essaye d'aider les débutants à mieux comprendre les bases. Et comme je sais qu'au début c'est assez difficile a comprendre je vais prendre un logiciel d'une protection a peu près identique que la précédente et essayer de détailler le plus possible pour que cela reste clair et simple. Donc GOOOOO!!!!!!!!


Nous allons nous attaquer à Jammer 1.95 disponible sur fyres.cjb.net
Pourquoi ce logiciel me direz vous?? ben en fait un pote à moi voulait le cracker alors je lui ai rendu service :)) et puis c'est assez intéressant comme approche vers l'assembleur.



II) Passage a l'acte!!!
___________________




Il faut avant de commencer posséder les bons outils comme le 1er tout. Nous aurons besoin :
- d'un désassembleur : le plus connu WIN32DASM
- d'un éditeur hexadécimal : le meilleur HIEW
- du prog a cracker
- un cerveau
- des mains


1) désassembler le prog et localiser le jump


Bon on fait la même chose que pour le 1er tout on lance le prog et on va dans registrer. On met un faux nom, un faux serial et hop "Incomplete or incorrect information." c'est bon on est sur la bonne voie :))
Alors on lance WIN32DASM et cliquez sur String Data References (icone en haut a droite) et cherchez notre message d'erreur "Incomplete or incorrect information."
double cliquez dessus et vous tomberez sur ça :


* Reference To: MFC42.Ordinal:1903, Ord:1903h
|
:0041BFAC E8F74A0000 Call 00420AA8
:0041BFB1 8BCE mov ecx, esi

* Reference To: MFC42.Ordinal:12F5, Ord:12F5h
|
:0041BFB3 E8224F0000 Call 00420EDA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BF67(C)
|
:0041BFB8 8D8D14FFFFFF lea ecx, dword ptr [ebp+FFFFFF14]
:0041BFBE C645FC01 mov [ebp-04], 01
:0041BFC2 E836000000 call 0041BFFD
:0041BFC7 EB0D jmp 0041BFD6

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041BE71(C), :0041BE7B(C), :0041BE84(C)
|
:0041BFC9 51 push ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041BEF4(U) <================= On remarque qu'il y a un saut vers le message d'erreur à l'adresse 0041BEF4

|
:0041BFCA 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Incomplete or incorrect information." <=== notre message d'erreur!!
|
:0041BFCC 68680B4300 push 00430B68

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h
|
:0041BFD1 E80E480000 Call 004207E4



On remarque qu'il y a un saut vers le message d'erreur à l'adresse 0041BEF4 donc allons à cette adresse. Allez dans Goto puis Goto code location et rentrez 0041BEF4 et on tombe ici :


* Reference To: MSVCRT.strcmp, Ord:02B8h
|
:0041BEE7 E88E520000 Call 0042117A
:0041BEEC 59 pop ecx
:0041BEED 85C0 test eax, eax <====== test notre serial avec le vrai
:0041BEEF 59 pop ecx
:0041BEF0 7507 jne 0041BEF9 <====== si bon alors jump to 0041BEF9 sinon on continue
:0041BEF2 6A00 push 00000000
:0041BEF4 E9D1000000 jmp 0041BFCA <====== donc si mauvais on jump à 0041BFCA



2) Modifier le jump



Donc nous venons de trouver notre jne qui saute vers l'enregistrement seulement si le code est bon donc nous allons patcher ça pour qu'il saute quelque soit le code c'est a dire changer "jne" en "jmp"

Mettez la ligne sur jne 0041BEF9 et notez l'offset en bas 1BEF0. Donc on lance hiew dans les commandes msdos, on va dans décode puis F5 pour goto et rentrez 1BEF0. Vous êtes sur 75 qui correspond à jne donc F3 puis entrez EB qui correspond à jmp en hexa, F9 puis F10.
On relance notre prog et on met Prof_Squall comme nom et comme code 123 | 123456789 mais problème ca marche pas pourtant on a effectue un changement... Cela veut dire qu'il y a plusieurs vérifications du serial si on met par exemple comme serial 123 | 1234567890 Miracle ça marche !!! Donc en fait il faut retourner vers notre message d'erreur et trouver d'autres sauts appelant le message on y retourne et on a ça :


* Référence To: MFC42.Ordinal:1903, Ord:1903h
|
:0041BFAC E8F74A0000 Call 00420AA8
:0041BFB1 8BCE mov ecx, esi

* Référence To: MFC42.Ordinal:12F5, Ord:12F5h
|
:0041BFB3 E8224F0000 Call 00420EDA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BF67(C)
|
:0041BFB8 8D8D14FFFFFF lea ecx, dword ptr [ebp+FFFFFF14]
:0041BFBE C645FC01 mov [ebp-04], 01
:0041BFC2 E836000000 call 0041BFFD
:0041BFC7 EB0D jmp 0041BFD6

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:0041BE71(C), :0041BE7B(C), :0041BE84(C) <=========================== Tiens!!!! 3 sauts vers le messages d'erreurs!!

:0041BFC9 51 push ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041BEF4(U) <================= On remarque qu'il y a un saut vers le message d'erreur à l'adresse 0041BEF4

:0041BFCA 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Incomplete or incorrect information." <=== notre message d'erreur!!
:0041BFCC 68680B4300 push 00430B68

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h
:0041BFD1 E80E480000 Call 004207E4


Quand on remonte un peu on retrouve 3 sauts conditionnels vers le message d'erreur donc pour mieux comprendre pourquoi on a pas été enregistre ben allons y !!! donc pareil on fait goto code location et on met 0041BE71 et on tombe sur ça :




* Reference To: MFC42.Ordinal:035C, Ord:035Ch
|
:0041BE67 E8E8480000 Call 00420754
:0041BE6C 33C9 xor ecx, ecx
:0041BE6E 394DE0 cmp dword ptr [ebp-20], ecx
:0041BE71 0F8452010000 je 0041BFC9
:0041BE77 837DE408 cmp dword ptr [ebp-1C], 00000008
:0041BE7B 0F8C48010000 jl 0041BFC9
:0041BE81 83FF0A cmp edi, 0000000A
:0041BE84 0F8C3F010000 jl 0041BFC9



Rappelez vous les 3 adresses faisant référence au message d'erreur : 0041BE71, :0041BE7B, :0041BE84 et comme par hasard les 3 adresses sont à côte avec pleins de comparaisons. En fait il faudrait enlever les je et jl pour que le programme ne saute pas vers le message d'erreur donc pas de probs!! on met la ligne sur je 0041BFC9 et on note l'offset 1BE71 alors on lance hiew, décode, F5 (goto) 1BE71. Le but ici c'est de mettre des "nop" sur les sauts qui veut dire NO OPERATION correspondant à 90 en hexa.

Mais il faut savoir une chose avant c'est que par exemple :
je 0041BFC9 correspond à 0F8452010000 en hexa donc pour pas faire n'importe quoi dans le programme on remplace 0F8452010000 par 909090909090 sinon si on met par exemple 90 cela va décaler le programme et rajouter des lignes de commande qui n'ont rien à faire ici... Même si c'est un peu confus vous comprendrez mieux quand vous aurez d'autres connaissances en assembleur. Donc on modifie le programme comme ceci :



:0041BE67 E8E8480000 Call 00420754
:0041BE6C 33C9 xor ecx, ecx
:0041BE6E 394DE0 cmp dword ptr [ebp-20], ecx
:0041BE71 909090909090 nop nop nop nop nop nop
:0041BE77 837DE408 cmp dword ptr [ebp-1C], 00000008
:0041BE7B 909090909090 nop nop nop nop nop nop
:0041BE81 83FF0A cmp edi, 0000000A
:0041BE84 909090909090 nop nop nop nop nop nop


Une fois la modification faite F9 puis F10 on peut donc relancez notre programme et rentrez n'importe quel serial pour être enregistre!!!! :)))