Cours N° 4

Ce cours va vous apprendre comment faire un Keygen pour Hexa.exe.

Téléchargeable ICI ( Password : KrommorK ).

Un Keygen, aussi appelé KeyGenerator ou Générateur de Clés est un logiciel générant des numéros de série afin d'installer / déverrouiller / lancer une application payante. La difficulté de ce type de Crack est de comprendre l'algorithme utilisé par le programme pour ensuite le reproduire dans n'importe quel langage de programmation, ( C, C++, ASM ... ). La compréhension de l'algorithme et la programmation d'un Keygen est le fin du fin pour un Cracker car il n'y a aucune modification du programme.

La première étape consiste à trouver la routine de calcule du Sérial. Pour la localiser dans le programme, on doit trouver le message d'erreur et remonter ensuite dans le code pour voir a quel moment le code est créé a partir du nom entré.

Cours 4 Photo 1

Alors quand vous entrez un nom de plus de 10 caractères ( cf Cours N° 3 ), vous voyez que le message d'erreur indiquant qu'un code est invalide est :
"Sorry, but the name and the key you entered cannot be accepted together".

Alors ouvrez "Hexa.exe" dans OllyDBG et rechercher le message d'erreur : clic droit puis "Search for" ->> "All referenced text strings".










Cours 4 Photo 2

Dans cette nouvelle fenêtre, cherchez le contenu du message d'erreur, a savoir "Sorry, but the name and the key you entered cannot be accepted together".
Vous trouverez 2 occurrences, une en 00435BD0 et une en 004358AA et c'est cette dernière qui nous intéresse :

Cours 4 Photo 3

Alors, après avoir double cliquer dessus, vous arriverez là :

Cours 4 Photo 4

Nous voyons ici que le fait d'être enregistré ou non dépend du saut JE SHORT HexDecCh.00435890 en 0043585C. le fait de sauter ou non dépend du résultat du TEST AL,AL en 0043585A et c'est dans le CALL qui le précède que l'on va trouver notre routine. Mettez un breakpoint sur ce CALL avec F2.

Cours 4 Photo 5

Alors lancez le programme dans OllyDBG avec F9 et enregistrez-vous ( Krom / 1234 ) puis cliquez sur "Ok".

Cours 4 Photo 6

OllyDBG break en 00435855. Entrez dans le CALL avec F7 :

Cours 4 Photo 7
...
Cours 4 Photo 8
...
Cours 4 Photo 9

On voit ici que l'on saute en 00431BDE ( JNZ HexDecCh.00431D17 ) et en 00431BEF ( JL HexDecCh.00431D17 ) pour arriver en 00431D17 ce qui a pour but de remettre EAX ( donc indirectement ) AL à 0. Si AL est à 0 en 0043585C, le JE ( Jump if Equal to 0 ) Sautera par dessus le bon message pour afficher le message d'erreur. Il faut donc que les 2 sauts ( JNZ HexDecCh.00431D17 et JL HexDecCh.00431D17 ) ne sautent pas. Intéressons-nous d'abord au premier saut ( JNZ HexDecCh.00431D17 ).

Cours 4 Photo 10

Pour qu'il ne saute pas, on doit avoir ESI égal à EAX donc comme ca il n'y aura aucune différence entre ESI et EAX et le JNZ ne sautera pas car Jump if Not Zéro, pas 0 -> pas de saut ;).

Donc pour qu'il n'y ait aucune différence entre le bon et le mauvais code, le code entré doit être bon logique non ? ;) Il ne suffit plus qu'a convertir 4D2 ( EAX ) et 62A ( ESI ) en Décimal car les registres sont en Hexadécimal

Registre : Valeur Hexadécimale : Valeur Décimale :
EAX 000004D2 1234
ESI 0000062A 1578

Le Sérial pour Krom est donc 1578. Voyons maintenant ou ce Sérial est généré. Pour savoir d'ou viens ce Sérial il suffit de débugger ligne par ligne et dès que l'on verra notre Sérial ( 62A ) apparaître dans un EAX ( EAX = Sérial entré ), on saura que le Sérial aura été généré dans le CALL qui le précède ... C'est assez difficile à expliquer sans exemple, donc en voici un qui vous sera surement utile !

Redémarrez avec CTRL + F2 -> Oui, lancez le ensuite en enregistrez vous avec Krom / 1234. Le programme break sur le CALL HexDecCh.00431B48 en 00435855. Entrez-y avec F7, puis faites une série de F8 jusqu'a voir 62A dans EAX. la première fois que l'on voit 62A est à l'instruction MOV ESI,EAX en 00431BD2, donc le Sérial est généré dans ce CALL :

00431BCD  .  E8 86FEFFFF    CALL HexDecCh.00431A58


Cours 4 Photo 11

Mettez un breakpoint en 00431BDC avec F2 puis redémarrez avec CTRL + F2 -> Oui, lancez le programme avec F9 et en enregistrez vous avec Krom / 1234. Le programme break sur le CALL HexDecCh.00431B48 en 00435855. Entrez-y avec F7 puis une série de F8 jusqu'au CALL 00431BDC. Entrez-y avec F7. En faisant quelques F8, vous arriverez à une boucle qui est exécutée 4 fois ( Krom contient 4 lettres, la boucle sera exécutée le nombre de fois que de lettre contenue dans le nom ) et si vous faites un peu attention à ce qui se passe dans cette boucle ( au niveau des registres ) vous y verrez Krom lettre par lettre, multiplié, divisé, mis dans un emplacement mémoire ... et donc on est sur que c'est ici qu'on a notre routine de calcule du Sérial.

Cours 4 Photo 12
...
Cours 4 Photo 13
...
Cours 4 Photo 14

On se concentrera sur la boucle au milieu du CALL, qui est celle qui génère le Sérial. Voici le détail de la boucle de calcule du Sérial :

Cours 4 Photo 15

C'est maintenant la partie la plus délicate, comprendre l'algorithme et dans ce cas, il vous faut des notions en Assembleur. Je vous conseille de lire mon cours ASM si ce n'est pas déjà fait car il est indispensable de comprendre les instructions pour pouvoir les reproduirent. Alors on va débugger le programme ligne par ligne et regarder ce qu'il fait a chaque fois.
Redémarrez avec CTRL + F2 ->> Oui, puis F9. enregistrez vous avec Krom / 1234 puis "Ok". OllyDBG Break en 00435855, entrez dans le CALL avec F7, puis F9. Là, Olly break en 00431BCD ( Le CALL de calcule du Sérial ) entrez dans ce CALL avec F7 et faites une série de F8 jusqu'à arriver au MOV EBX,1 en 00431AC4. C'est maintenant qu'il faudra de la concentration et de la patience car nous allons le faire ensemble et lignes par lignes ce qui prendra surement un moment ...

Ligne de Séparation

Boucle N° 1


Registre : Hexadécimal : Décimal : Binaire :
ECX 00000000 0 00000000000000000000000000000000
  8000000F 2'147'483'663 10000000000000000000000000001111
ECX 00000000 0 00000000000000000000000000000000



Registre : Hexadécimal : Décimal : Binaire :
EBX 00000001 1 01
EDI 00000001 1 01
EAX 00000002 2 10


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000002 2 000000010
ECX 00000112 274 100010010
EAX 00000000 0 000000000


Pour voir ce qu'il y a à cette adresse faites CTRL + G dans la fenêtre de Dump en bas à gauche et entrez-y 0045480C.

Cours 4 Photo 16

On voit que 45480C vaut 34 mais comme EDX vaut 2 on regarde en fait sur l'adresse 0045480E ( 0045480C + 2 = 0045480E ), on a donc AL qui vaut D5.
Registre : Hexadécimal : Décimal : Binaire :
AL 000000D5 213 11010101
DL 0000004B 75 01001011
EAX 0000009E 158 10011110


Registre : Hexadécimal : Décimal : Binaire :
EAX 0000009E 158 10011110
  000000FF 255 11111111
EAX 0000009E 158 10011110


Ligne de Séparation

Boucle N° 2


Registre : Hexadécimal : Décimal : Binaire :
ECX 00000001 1 00000000000000000000000000000001
  8000000F 2'147'483'663 10000000000000000000000000001111
ECX 00000001 1 00000000000000000000000000000001


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000003 3 000000011
ECX 00000112 274 100010010
EAX 00000000 0 000000000


Pour voir ce qu'il y a à cette adresse faites CTRL + G dans la fenêtre de Dump en bas à gauche et entrez-y 0045480C.

Cours 4 Photo 17

On voit que 45480C vaut 34 mais comme EDX vaut 3 on regarde en fait sur l'adresse 0045480F ( 0045480C + 3 = 0045480F ), on a donc AL qui vaut 00.
Registre : Hexadécimal : Décimal : Binaire :
AL 00000000 0 0000000
DL 00000072 114 1110010
EAX 00000072 114 1110010


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000072 114 01110010
  000000FF 255 11111111
EAX 00000072 114 01110010


Ligne de Séparation

Boucle N° 3


Registre : Hexadécimal : Décimal : Binaire :
ECX 00000002 2 00000000000000000000000000000010
  8000000F 2'147'483'663 10000000000000000000000000001111
ECX 00000002 2 00000000000000000000000000000010



Registre : Hexadécimal : Décimal : Binaire :
EAX 00000004 4 000000100
ECX 00000112 274 100010010
EAX 00000000 0 000000000


Pour voir ce qu'il y a à cette adresse faites CTRL + G dans la fenêtre de Dump en bas à gauche et entrez-y 0045480C.

Cours 4 Photo 18

On voit que 45480C vaut 34 mais comme EDX vaut 4 on regarde en fait sur l'adresse 00454810 ( 0045480C + 4 = 00454810 ), on a donc AL qui vaut F7.
Registre : Hexadécimal : Décimal : Binaire :
AL 000000F7 247 11110111
DL 0000006F 111 01101111
EAX 00000098 152 10011000


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000098 152 10011000
  000000FF 255 11111111
EAX 00000098 152 10011000


Ligne de Séparation

Boucle N° 4


Registre : Hexadécimal : Décimal : Binaire :
ECX 00000003 3 00000000000000000000000000000011
  8000000F 2'147'483'663 10000000000000000000000000001111
ECX 00000003 3 00000000000000000000000000000011


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000005 5 000000101
ECX 00000112 274 100010010
EAX 00000000 0 000000000


Pour voir ce qu'il y a à cette adresse faites CTRL + G dans la fenêtre de Dump en bas à gauche et entrez-y 0045480C.

Cours 4 Photo 19

On voit que 45480C vaut 34 mais comme EDX vaut 5 on regarde en fait sur l'adresse 00454811 ( 0045480C + 5 = 00454811 ), on a donc AL qui vaut 24.
Registre : Hexadécimal : Décimal : Binaire :
AL 00000024 36 0100100
DL 0000006D 109 1101101
EAX 00000049 73 1001001


Registre : Hexadécimal : Décimal : Binaire :
EAX 00000049 73 01001001
  000000FF 255 11111111
EAX 00000049 73 01001001


Ligne de Séparation
Ca a été long mais on y est arrivé, mais l'algorithme qui est dans ces boucle n'est pas vraiment lisible donc en voici un petit résumé :
D5, 00, F7, 24, 5D, 5C, 0A, 8C, 10, D6, 9E, B5, 9C, 66, 00, 24, 6F, 20, 44, 4D, D4, 63, 4D, A2, F0,
10, 27, 55, 20, E7, F7, E8, A3, 47, F9, 14, AC, E8, 44, 98, 2C, 53, 58, EB, FE, 25, B0, FC, 4E, 77, CC,
66, 49, DA, 7C, C6, 8E, D1, 5C, 22, D9, C5, C8, 90, E4, BF, B4, 79, 87, 7E, 3E, 3D, 76, A3, D6, 08, 43, 1A
dans AL.




Registre : Boucle 1 : Boucle 2 : Boucle 3 : Boucle 4 :
AL D5 00 F7 24
DL 4B 70 6F 6D




Ligne de Séparation
La création du Keygen pour Hexa.exe en DOS se trouve dans le Cours N° 5.

Et la création du Keygen pour Hexa.exe en GUI se trouve dans le Cours N° 6.

Cours écrit le : 11.11.2007


Précédent Précédent - Suivant Suivant



J'espère que ce cours a été clair ;)

Si vous avez rencontré une erreur, que quelque chose ne fonctionne pas, ou que vous avez une question, vous pouvez m'envoyer un mail.

Haut de Page