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.
|