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