Le 24 Juin 1998
Crack de Kyodai v4.52 par Artex
Ceci est un de mes premiers cracks et mon deuxième compte-rendu de crack. Il est assez simple.
Bon allons-y. On a besoins de :
- Kyodai v4.52 qui se trouve sur http://namida.animanga.com/kyodai.html (735 ko) ou bien sur différents sites de sharewares (Si vous le trouvez pas, envoyez-moi un message). Ce petit programme sympa est un jeu de Majhong (j’ sé pas komen çà s’écrit !) qui est, je trouve très bien fait.
- Wdasm (hum, n' importe lequel ; en ce qui me concerne j' utilise plusieurs versions en même temps car parfois (souvent) ils ne donnent pas les mêmes 'string data references')
- Un Editeur héxadécimal quelconque (j’ aime pas trop hexworkshop que j’ ai craqué en suivant les conseils de poulpi (thanks !), je lui préfère Aris hexedit32, question de goût…)
- 10 minutes pour tout faire et tout comprendre.
- Un Coca car il faut craquer Zen ;) (l' alcool c' est toujours mauvais pour la santé;) Après tout, craquer est aussi un plaisir !
Zou !
1- On joue 5-10 minutes avec le prog (et oui, après tout c' est un jeu, non ;) pour voir de quoi çà a l' air (et si çà vaut le coups de le craquer ;) On note le max d' infos genre en haut dans la barre d' état il y a marqué "Unregistred", dans le menu help il y a une option register et dans la fenêtre register il y a de la place pour un nom et un code (serial number). Bon, allez, on attaque !
2- On desassemble le prog avec Wdasm.
3- On regarde les 'strings references' : on trouve plein de trucs intéressants genre "Unregistred", "-registered to", "please remember", "sorry, wrong password", "thanks again" etc, etc…
4- On va utiliser "-Unregistred version, please-". Double clique dessus (dans le menu 'string data reference') et une 2ème fois pour voir si il n' y a pas d' autres occurences dans le prog. Non, une seule fois réference à "-Unregistred version, please-" Bon, c' est déjà çà de pris !
Voici ce que l' on obtient pour la string reference de "-Unregistred version, please-"
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004455CD(C) <- Là !
|
:00445624 C6837823000000 mov byte ptr [ebx+00002378], 00
:0044562B 8B8348020000 mov eax, dword ptr [ebx+00000248]
:00445631 8B4024 mov eax, dword ptr [eax+24]
* Possible StringData Ref from Code Obj ->"- Unregistered version - Please "
->"register !!"
|
:00445634 BA88564400 mov edx, 00445688
:00445639 8B08 mov ecx, dword ptr [eax]
:0044563B FF510C call [ecx+0C]
On voit en remontant quelques lignes au dessus un appel Conditionnel fait à partir de l' adresse 004455CD.
Il aurait été très intéressant de remonter encore un peu plus haut dans le listing. Nous aurions pu voir alors ceci :
* Referenced by a CALL at Addresses:
|:0044575B , :00449DC7 <- Tiens, deux adresses qui appellent cette subroutine…
|
:004455A8 55 push ebp
:004455A9 8BEC mov ebp, esp
:004455AB 6A00 push 00000000
:004455AD 53 push ebx
:004455AE 56 push esi
:004455AF 57 push edi
:004455B0 8BD8 mov ebx, eax
:004455B2 33C0 xor eax, eax
:004455B4 55 push ebp
:004455B5 6854564400 push 00445654
:004455BA 64FF30 push dword ptr fs:[eax]
:004455BD 648920 mov dword ptr fs:[eax], esp
:004455C0 8B835C230000 mov eax, dword ptr [ebx+0000235C]
:004455C6 E8E1DFFBFF call 004035AC
:004455CB 85C0 test eax, eax <- tiens, un test et
:004455CD 7E55 jle 00445624 <- un saut conditionnel vers "unregistered version, please register" (cf plus haut…)
:004455CF 8D4DFC lea ecx, dword ptr [ebp-04]
:004455D2 8B935C230000 mov edx, dword ptr [ebx+0000235C]
:004455D8 8BC3 mov eax, ebx
:004455DA E8EDDBFFFF call 004431CC
:004455DF 8B45FC mov eax, dword ptr [ebp-04]
:004455E2 8B9360230000 mov edx, dword ptr [ebx+00002360]
:004455E8 E8CFE0FBFF call 004036BC <- tiens, un call
:004455ED 754F jne 0044563E <- et un saut conditionnel…
:004455EF C6837823000001 mov byte ptr [ebx+00002378], 01 <- attention ici on met à 1 un octet pointé… hum…
* Possible StringData Ref from Code Obj ->"- Registered to "
|
:004455F6 BA6C564400 mov edx, 0044566C
:004455FB 8D45FC lea eax, dword ptr [ebp-04]
:004455FE E8C9DEFBFF call 004034CC
:00445603 8D45FC lea eax, dword ptr [ebp-04]
:00445606 8B935C230000 mov edx, dword ptr [ebx+0000235C]
:0044560C E8A3DFFBFF call 004035B4
:00445611 8B55FC mov edx, dword ptr [ebp-04]
:00445614 8B8348020000 mov eax, dword ptr [ebx+00000248]
:0044561A 8B4024 mov eax, dword ptr [eax+24]
:0044561D 8B08 mov ecx, dword ptr [eax]
:0044561F FF510C call [ecx+0C]
:00445622 EB1A jmp 0044563E
Bon, je sais pas pour vous mais moi j' ai une intuition : il y a deux calls suivis de deux sauts conditionnels et pour l' un d' entre eux, on met à 1 un octet pointé… Hum, analysons le premier :
:004455CB 85C0 test eax, eax
:004455CD 7E55 jle 00445624
Allons voir en 00445624 :
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004455CD(C)
|
:00445624 C6837823000000 mov byte ptr [ebx+00002378], 00 <- tiens, on met à 0 le fameux octet pointé…
:0044562B 8B8348020000 mov eax, dword ptr [ebx+00000248]
:00445631 8B4024 mov eax, dword ptr [eax+24]
* Possible StringData Ref from Code Obj ->"- Unregistered version - Please "
->"register !!"
|
:00445634 BA88564400 mov edx, 00445688
:00445639 8B08 mov ecx, dword ptr [eax]
:0044563B FF510C call [ecx+0C]
Donc, si j' ai bien compris, après ce test eax, eax on va aller en 00445624 si le test se vérifie. Et dans ce cas, on sera dans la panade car "unregistered version…" c' est pas bon avec en plus la mise à 0 de l' octer pointé. Arg, les barbares !
Revenons à notre deuxième call, test, saut :
:004455E8 E8CFE0FBFF call 004036BC
:004455ED 754F jne 0044563E
:004455EF C6837823000001 mov byte ptr [ebx+00002378], 01
Ici, après le call, si le test est bon, on met à 1 le fameux octet pointé. Bon, en clair, on pourrait allez voir ce qui se trame en 004036bc mais, en a-t-on vraiment besoins ? Je crois que non, le schéma est ici très très clair. Non ?
Allons faire un tour pour voir les deux adresses qui appelle cette subroutine : il s' agit de 0044575B et 00449DC7. Il s' agit de deux calls qui sont suivis pas des cmp avec notre fameux octet pointé…
:0044575B E848FEFFFF call 004455A8
:00445760 80BB7823000000 cmp byte ptr [ebx+00002378], 00
:00445767 740C je 00445775 <- je désolé_mauvais_code !
* Possible StringData Ref from Code Obj ->"Thanks again ! You're now registered."
|
:00445769 B8B8574400 mov eax, 004457B8
:0044576E E8DDA4FEFF call 0042FC50
:00445773 EB0A jmp 0044577F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445767(C)
|
* Possible StringData Ref from Code Obj ->"Sorry, wrong password. Please "
->"check out if you entered the user "
->"name and password exactly as I "
->"gave them to you."
|
:00445775 B8E8574400 mov eax, 004457E8
:0044577A E8D1A4FEFF call 0042FC50
et l' autre a cette tête :
:00449DC7 E8DCB7FFFF call 004455A8
:00449DCC 80BB7823000000 cmp byte ptr [ebx+00002378], 00
:00449DD3 7516 jne 00449DEB <- jne utilisateur_ok
:00449DD5 6A40 push 00000040
* Possible StringData Ref from Code Obj ->"Reminder"
|
:00449DD7 B9149E4400 mov ecx, 00449E14
* Possible StringData Ref from Code Obj ->"Welcome to KYODAI MAHJONGG !"
|
:00449DDC BA209E4400 mov edx, 00449E20
:00449DE1 A124164500 mov eax, dword ptr [00451624]
:00449DE6 E819B4FDFF call 00425204
Concrètement que va-t-on faire ? On va changer deux choses :
:00445624 C6837823000000 mov byte ptr [ebx+00002378], 00
en
:00445624 C6837823000001 mov byte ptr [ebx+00002378], 01
et
:004455ED 754F jne 0044563E
en
:004455ED 744F je 0044563E
Voilà, si vous relancez maintenant Kyodai, vous voyez que vous êtes enregistré… En fait, on ne se crève pas la tête pour vraiment décortiquer le programme car nous (en tout cas moi J ) sommes fainéants comme des ours.
Si vous avez des questions ou des commentaires envoyez-moi un message à classiqueop@hotmail.com
Si vous avez craqué des progs intéressants, écrivez-moi pour que j' essaye aussi et que l' on voit si l' on a procédé de la même manière.
Si vous avez des urls avec des progs sympas pour s' entrainer à cracker, n' hesitez pas !
Et puis, écrivez des petits textes comme celui-ci car il faut que la scène Française progresse et que l' on s' entraide tous les uns les autres.
A++
Artex
----------------------------------------------------------------------------------------------------------