Réaliser un keygen pour Acoustica MP3 Audio Mixer.

Hey, me voila de retour, pour réaliser un petit tut pour le M5.
Cette fois, l'objet de ce tut est de réaliser un keygen pour Acoustica MP3 Audio Mixer. Vous verrez rien de très compliqué.
La version sur laquelle je me base est la 2.13. Lorsque l'on lance le programme, un nag apparait, nous demande d'entrer un "registration code" sans quoi le programme va cesser de fonctionner au terme d'une semaine (soit 7 jours).

7 Jours pour vivre


Première constatation, il s'agit d'un serial unique.
Deuxième constatation, c'est tout.

EH! Bordel, on n'a que 7 jours...
Ok, primo, on va voir ce que l'on apprend avec softice. On met un serial bidon, dans mon cas 1234512345, on ne valide pas, au préalable on pose un BPX HMEMCPY sous softice.
Ceci fait on valide ... on trace un peu et au bout d'un moment on arrive ici :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004244F4(C)
|
:00424501 50 push eax
:00424502 8BCE mov ecx, esi
:00424504 E867F4FFFF call 00423970

(routine de vérification du serial)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004244FF(U)
|
:00424509 3BC3 cmp eax, ebx
(Comparaison entre notre serial/ bon serial, si ce n'est pas identique on ne saute pas)

:0042450B 751D jne 0042452A
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004244E4(C), :004244EC(C)
|
:0042450D 53 push ebx
* Possible StringData Ref from Data Obj ->"INFORM_RegistrationCodeInvalid"

(explicite non ??)
|
:0042450E 683C664400 push 0044663C
:00424513 E8389C0000 call 0042E150


Voili le secondo ...Maitenant on va analyser la routine de construction du serial.
On va donc fouiller un peu, pour voir ce que renferme le CALL 00423970 qui est appelé en 424504.
Voici ce que l'on obtient :

* Referenced by a CALL at Addresses:
|:00423EC4 , :00424504 << c'est d'ici que l'on vient
|
:00423970 83EC40 sub esp, 00000040
:00423973 55 push ebp
:00423974 8BE9 mov ebp, ecx
:00423976 8B4C2448 mov ecx, dword ptr [esp+48]

(On met notre serial [esp+48] dans ECX
ECX contient maintenant : 12D687h (3039 en hexadécimal = 1234567 en décimal)

:0042397A 56 push esi
:0042397B 81F940420F00 cmp ecx, 000F4240
(On compare ECX (12D687h) avec F4240h,
En décimal, cela donne revient à comparer 1234567 à 1000000)
:00423981 7653 jbe 004239D6
(Si ECX est inférieur à 1000000 on se casse)

:00423983 8BC1 mov eax, ecx
(EAX = ECX)

:00423985 33D2 xor edx, edx
(EDX = 0)
:00423987 BE74290100 mov esi, 00012974
(On déplace 12974h dans ESI(3) Ici, on met 12974h dans ESI, soit 76148 en décimal.
N.B. pour effectuer la conversion servez vous de la calculatrice fournie avec Windows et mettez la en mode scientifique.)


:0042398C F7F6 div esi
Cette opération (div esi) revient à diviser la valeur se trouvant dans EAX par celle étant en ESI
Dans notre cas cela donne : 1234567 / 76148
Le reste de la division étant placé dans EDX

:0042398E 85D2 test edx, edx
on test EDX
:00423990 7544 jne 004239D6
Si EDX est supérieur à 0 -> bye bye
:00423992 8B453C mov eax, dword ptr [ebp+3C]
(A ce stade la construction du serial est terminée.
Pour le keygen, seule la partie ci dessus nous concerne.)


:00423995 BE01000000 mov esi, 00000001
:0042399A 3BC8 cmp ecx, eax
:0042399C 743A je 004239D8
:0042399E 894D3C mov dword ptr [ebp+3C], ecx
:004239A1 8BCD mov ecx, ebp
:004239A3 E8F8FCFFFF call 004236A0
:004239A8 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"IDS_YOU_REGISTERED"
|
:004239AA 6828664400 push 00446628
:004239AF E89CA70000 call 0042E150
:004239B4 A1749C4400 mov eax, dword ptr [00449C74]
:004239B9 83C408 add esp, 00000008
:004239BC 6A00 push 00000000
:004239BE 6A00 push 00000000
* Possible Reference to Dialog: DialogID_0097, CONTROL_ID:040E, "03/13/93"
|
:004239C0 680E040000 push 0000040E
:004239C5 50 push eax
* Reference To: USER32.PostMessageA, Ord:01DEh
|
:004239C6 FF1500C34300 Call dword ptr [0043C300]
:004239CC 8BC6 mov eax, esi
:004239CE 5E pop esi
:004239CF 5D pop ebp
:004239D0 83C440 add esp, 00000040
:004239D3 C20400 ret 0004
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00423981(C), :00423990(C)
|
:004239D6 33F6 xor esi, esi
(Par ici la sortie!)

Une eternité pour en profiter..
Effectivement! Maintenant que l'on a compris comment le serial est construit, il nous est facile
de créer un petit générateur de numéros de séries valides.Voici un exemple de code en Visual Basic 5

-----------------------Cut Here
-----------------------
Randomize
'Initialise le générateur de nombres aléatoires
Text1.Text = Int((99 * Rnd) + 14) * 76148
'génération d'un nombre entier entre 14 et 100 multiplié par 76148
End If
-----------------------Cut Here-----------------------

A propos de la génération d'un nombre de manière aléatoire, 14 correspond à l'entier le plus petit qui,
quand on le multiplie par 76148, donne un chiffre supérieur à 1000000.
Ensuite, pour la borne supérieure, j'ai retenu 100, on peut bien évidemment retenir une autre valeur.