TUT DU CRACK DE KYODAI V12.00
by ub0.g0ss
Disclaimer
Ce tut n'a qu'un but qui est celui d'instruire et de mieux comprendre les protections utilisées dans les programmes. Il n'existe que pour apprendre et faire apprendre. Si ce programme vous plaît et vous intéresse, merci de vous enregistrer auprès de l'auteur après la période d'essai. Je ne saurais à aucun moment encourager quiconque souhaiterait utiliser ce texte à des fins autres que celui pour lequel il est rédigé.
A GAME WORTH PLAYING IS A GAME WORTH BUYING
Introduction
Salut, je vais essayer de vous expliquer la manière dont j'ai procédé pour cracker ce prog, il s'agit d'un jeu dans le genre Mahjong, très bien fait et de plus avec une protection que je n'avais jamais osé abordé auparavant. J'ai donc décidé de me lancer. J'écris ce tut parce que j'aimerais faire réagir ceux qui ont déjà rencontré ce genre de protection et voir comment ils l'ont contournée. Surtout, j'aimerais savoir si mes réflexions étaient les bonnes, parce qu'à certains moments, j'ai plus l'impression d'avoir eu de la chance qu'autre chose.
Bon passons ce blabla et voyons le prog!
Disponibilité ici : Kyodai mahjong v12
Type de protection
Le prog est un shareware limité à 30 jours d'utilisation, il y a une boite d'enregistrement dans laquelle il faut entrer son nom et un numéro de série.
De plus, il y a une protection anti softice (meltice) et le prog est compressé via Aspack 2.01 apparemment.
Et pour couronner le tout, il est impossible de le désassembler directement avec windasm.
La méthode
Dans un premier temps, on lance le prog pour voir ce qu'il propose de beau! Tiens il ne veux pas se lancer du tout!!! J'essaye de le désassembler avec windasm, ca plante!!!
Eh ben, je crois que ce prog va me donner du fil à retordre!
Je lance le FP loader de frogs print et bingo, un écran bleu caractéristique d'une détection anti softice apparait 2 fois. Le code de détection est 0B, c'est à dire le code de meltice (voir la doc de frogice pour ça).
En fait meltice essaye d'ouvrir les drivers de softice avec l'API CreateFileA
On pose donc un BPX createfilea sous softice, puis on lance le proggy.
softice break en 004A3376, après avoir appuyé 25 fois sur F12 pour sortir des routines genre user et kernel, voilà ce que nous voyons :
:004A3376 E8B531F6FF CALL KERNEL32!CreateFileA >> on arrive ici :004A337B 83F8FF CMP EAX,-01 >> softice présent? :004A337E 7408 JNZ 004A3388 >> saute si softice non détecté :004A3380 50 PUSH EAX :004A3381 E88A31F6FF CALL KERNEL32!CloseHandle >> ferme le prog sinon
Ok, si on change le JNZ en JMP, on sautera toujours même si
softice est détecté.
C'est à dire qu'en 004A337E, on remplace le 74 par EB. (on le
note sur une feuille).
Maintenant on appuie sur F5 et softice break à nouveau. On appuie sur F12 1 fois et on arrive ici :
:004A33B2 E87931F6FF CALL KERNEL32!CreateFileA >> on arrive ici :004A33B7 83F8FF CMP EAX,-01 >> softice présent? :004A33BA 7408 JNZ 004A33C4 >> saute si softice non détecté :004A33BC 50 PUSH EAX :004A33BD E84E31F6FF CALL KERNEL32!CloseHandle >> ferme le prog sinon
On a exactement la même chose qu'avant, on va donc remplacer
le JNZ par JMP ici aussi.
Soit en 004A33BA, on change le 74 en EB (on le note aussi sur une
feuille).
On retire nos BPX, en faisant BC * et on lance le prog. Pour ça, on utilise le FP loader de frogsprint.
On peut enfin voir à quoi ressemble ce prog, au démarrage on a un énorme nagscreen qui nous explique ce qu'est kyodai. Il est également dit que ce nag disparaitrait en même temps qu'on s'enregistre. Cool, une chose de moins à faire.
On va directement dans AIDE puis S'ENREGISTRER, et là on entre un nom et un serial.
On fait surgir softice (CTRL-D) et on pose un BPX hmemcpy. On quitte softice et on valide notre entrée en cliquant sur CONFIRMER.
Softice break, on appuie sur F12 jusqu'a arriver au prog qui nous intéresse (KYODAI!CODE+000B5E8B), le code peut varier.
Ensuite on trace avec F10 jusqu'à ce qu'on voit un TEST ou SAUT précédé d'un CALL.
On arrive ici normalement :
:004B6E8B E87484F7FF CALL 0042F304 :004B6E90 8B55FC MOV EDX,[EBP-04] :004B6E93 8D838C2B0500 LEA EAX,[EBX+00052B8C] :004B6E99 E8CECEF4FF CALL 00403D6C :004B6E9E 8BC3 MOV EAX,EBX :004B6EA0 E8AFD80200 CALL 004E4754 :004B6EA5 8BC3 MOV EAX,EBX :004B6EA7 E8DC170000 CALL 004B8688 >> CALL qui va calculer le serial, on y entre. :004B6EAC 84C0 TEST AL,AL :004B6EAE 7426 JZ 004B6ED6 >> Ici un saut juste après un test
Donc on entre dans le CALL en 004B6EA7, en appuyant sur la touche F8. On arrive ici :
:004B8688 55 PUSH EBP :004B8689 8BEC MOV EBP,ESP ... :004B86BF E8ACCCFFFF CALL 004B5370 :004B86C4 8B45FC MOV EAX,[EBP-04] >> EAX contient le bon serial :004B86C7 8B968C2B0500 MOV EDX,[ESI+00052B8C] >> EDX contient notre serial bidon :004B86CD E8D2B9F4FF CALL 004040A4 >> Procédure de vérif du serial :004B86D2 0F852E030000 JNZ 004B8A06 >> Saute vers bad cracker si serials différents :004B86D8 8B86882B0500 MOV EAX,[ESI+00052B88] >> Sinon on continue, EAX contient notre nom :004B86DE BA9C8A4B00 MOV EDX,004B8A9C >> EDX contient un autre nom : johnny+X/C3'98! :004B86E3 E8BCB9F4FF CALL 004040A4 >> Vérification des deux noms :004B86E8 0F84C0020000 JZ 004B89AE >> Saute vers very bad cracker si noms égaux ... :004B8725 8B86882B0500 MOV EAX,[ESI+00052B88] >> EAX contient notre nom :004B872B BAEC8A4B00 MOV EDX,004B8AEC >> EDX contient un autre nom, ici Cobra 1997 :004B8730 E86FB9F4FF CALL 004040A4 >> Vérification des deux noms :004B8735 0F8473020000 JZ 004B89AE >> Saute vers very bad cracker si noms égaux. ... :004B89A7 E8F8B6F4FF CALL 004040A4 >> Vérification des deux noms :004B89AC 751E JNZ 004B89CC >> Saute vers good cracker si noms différents :004B89AE BA688D4B00 MOV EDX,004B8D68 >> On arrive ici si les noms sont égaux :004B89B3 8BC6 MOV EAX,ESI ... :004B89C7 E9A2000000 JMP 004B84A8 >> On sort (si les noms sont égaux alors le prog s'efface du HD) :004B89CC B301 MOV BL,01 >> On arrive ici si good cracker. ...
Bon, je vais résumer la situation :
En 004B86C7, si vous faites un D EAX, sous softice, vous verrez le serial correspondant à votre nom. Vous pouvez vous arrêter là mais le but ici est d'apprendre et de comprendre non?
En 004B86D2, on voit un saut conditionnel qui envoie vers le nag mauvais serial si les codes sont mauvais. On va inverser ce saut, c'est suffisant pour ce prog, et comme ça on sera enregistré avec n'importe quel serial sauf 1, le bon. Mais d'ici à ce qu'on trouve le bon au hasard!!!! lol
Donc en 004B86D2, on remplace le JNZ par JZ, soit le 0F85 par 0F84.
Ensuite, à partir de 004B86D8, le prog compare notre nom avec une liste de noms, c'est ce qu'on appelle une black list, ce sonr les noms qui étaient utilisés dans les autres versions pour s'enregistrer. Si vous entrez un de ces noms, le prog se fazit un plaisir de'effacer le jeu de votre disque dur!!!!
Donc voilà, nous connaissons les parties à modifier dans le programme, il ne reste plus qu'à le patcher.
Comme le prog est compressé avec Aspack, il y a plusieurs solutions :
- On le décompresse et on le patch normalement avec un éditeur
hexa, facile mais l'EXE fera presque 3 fois sa taille d'origine.
- Trouver un espace libre dans le prog et y insérer notre patch.
C'est ce que nous allons faire.
Le patch en mémoire :
D'abord, nous allons récapituler et constituer notre patch sur papier.
Voila ce que nous avons :
MOV Byte ptr [004A337E],EB >> notre premier patch meltice MOV Byte ptr [004A33BA],EB >> notre deuxième patch meltice MOV Byte ptr [004B86D3],84 >> notre changement JNZ en JZ
Il faut maintenant connaître le point d'entrer du prog décompressé en mémoire. La dessus, comme c'est la première fois que je le fait, je ne sais pas si j'agis correctement, j'aimerais avoir vos commentaires sur cette partie de manière à m'expliquer mes erreurs, car il y en a surement.
J'ai posé un BPX GetProcAddress. Ensuite j'ai lancé le prog et softice break. La j'ai agrandi la fenêtre des codes au maximum et j'ai commencé à faire défiler la fenêtre avec les flèches jusqu'a trouver un POPAD suivi d'un saut, un push ou un call, enfin une instruction qui nous envoie quelques part.
Je suis tombé à l'adresse 006BA4F3, sur un POPAD :
:006BA4ED 89853B3E4400 MOV [EBP+00443E3B],EAX :006BA4F3 61 POPAD >> La on a notre POPAD :006BA4F4 7508 JNZ 006BA4FE :006BA4F6 B801000000 MOV EAX,00000001 :006BA4FB C20C00 RET 000C :006BA4FE 6800000000 PUSH 00000000 Voila notre PUSH, il y a des 00000000 :006BA503 C3 RET
Pour l'instant on a des 00000000 sur notre PUSH, on va poser un BPX dessus pour qu'il break et nous donne le point d'entrée.
On pose donc un BPX 006BA4FE.
On retire notre Breakpoint GetProcAddress en faisant BC 0
et on appuie sur F5. softice break à l'adresse 006BA4FE et cette fois ci nous voyons notre point d'entrée.
:006BA4FE 68888D4E00 PUSH 004E8D88
Notre point d'entrée se trouve donc en 004E8D88.
Il reste un trouver un espace vide ou placer notre code.
Pour cela, j'ai continuer à faire défiler ma fenêtre de codes avec les flèches vers le bas jusqu'a trouver un espace rempli de zero. Gros coup de chance, à partir de l'adresse 006BBF0D, il y a toute une flopée de zero, on va pouvoir placer notre code ici.
Donc je récapitule :
Déjà il faut se rendre à l'adresse 006BBF0D pour y placer notre code, et enfin on retourne à notre point d'entrée.
J'ai essayé de remplacer le PUSH en 006BA4FE et de faire PUSH 006BBF0D, mais il écrase mon adresse et la remplace par des zeros. Ensuite il remet un PUSH 004E8D88, donc à mon avis, il décompresse plusieurs fois, et ce qu'il faut c'est trouver l'endroit de la dernière décompression. Je n'ai pas eu le courage de chercher, alors j'ai changé le saut en 006BA4F4.
J'ai remplacé : 006BA4F4 7508 JNZ 006BA4FE par : 006BA4F4 E9141A0000 JMP 006BBF0D
Ici, j'avoue franchement ne pas savoir à quoi sert ce JNZ et le MOV EAX qu'il y a en dessous. Si quelqu'un pouvait m'éclairer la dessus ce serait bien. D'avance merci!!!
En tout cas maintenant notre saut est créé, et il nous emmène jusqu'a notre espace libre. Il ne reste plus qu'à appliquer le code :
:006BBF0D C6057E334A00EB MOV Byte ptr [004A337E],EB >> notre premier patch meltice :006BBF14 C605BA334A00EB MOV Byte ptr [004A33BA],EB >> notre deuxième patch meltice :006BBF1B C605D3864B0084 MOV Byte ptr [004B86D3],84 >> notre changement JNZ en JZ :006BBF22 E961CEE2FF JMP 004E8D88 >> on va vers notre point d'entrée.
Voila, pour rappel, on applique ces modifs sous softice en tapant A puis entrée sur la ligne que l'on veut modifier et on entre notre code assembleur. On obtient alors la correspondance en hexa.
Ensuite, on prend un éditeur hexa, et on fait nos modifs définitivement. Pour ça, j'ai utilisé un prog qui donne l'offset à partir de l'adresse. Procurez vous ce petit utilitaire très pratique (je ne sais plus ou je l'ai trouvé), sinon il faudra relevé une chaîne hexa avant ou après le code à modifier et faire une recherche.
On procède ainsi pour tout le code à modifier et on remplace les zeros à partir de l'adresse 006BBF0D (j'avais B890D comme offset) par notre nouveau code :
à l'adresse 006BA4F4, on entre E9 14 1A 00 00
à l'adresse 006BBF0D, on entre C6 05 7E 33 4A 00 EB C6 05 BA 33 4A 00 EB C6 05 D3 86 4B 00 84 E9 61 CE E2 FF
On sauvegarde le tout et on le lance, bingo, pas de problème avec softice, on s'enregistre, bingo il accepte n'importe quel serial. Ca fonctionne!!!!
Entre nous, j'y croyais pas trop!!!!!!
NOTE :
J'ai essayé de faire un JUMP à la place d'un JZ en 004B86D2, mais je ne sais pas comment le coder, si quelqu'un pouvait m'aider de ce côté là, ce serait vraiment sympa :
Je voulais faire :004B86D2 E9F5020000 JMP 004B89CC
De cette manière, on passait toute la procédure de vérif du nom et on pouvait entrer n'importe quel serial y compris le bon et n'importe quel nom.
Conclusion :
Et voilà ,ce prog me semblait vraziment très dur à cracker au début (pour un gros débutant comme moi!), une fois terminé, j'ai l'impression d'avoir réussi à le cracker avec beaucoup de chance et d'être passé à côté de beaucoup de choses. J'aimerais beaucoup recevoir les commentaires de "pros" des progs compressés de manière à m'expliquer mes erreurs, pour que je ne les refasse plus.
Voilà, si vous voulez m'écrire, une seule adresse : ub0.g0ss @caramail.com
Salut et à la prochaine.
ub0.g0ss