Keygen de IzyWeb 1.0

Par Nody

Intro.  

 

Logiciel : Izyweb 1.0

Source : http://perso.club-internet.fr/julienpo

Outils : Soft-Ice 3.2, W32Dasm 8.9, Tasm 5.0, Borland Resource WorkShop 4.5

Protection : S/N

Niveau : Apprenti

Commentaires :

 

Comme on est en vacances, je vous propose un tut un peu plus long qu'ordinaire qui se construit de cette faτon :

1/ La recherche du s/n

2/ La keygen en asm 32 bits avec une zolie DialogBoxParamA pour changer de l'infΓme keygen sous DOS.

 

I/ A la Recherche du Serial Number

 

DΦs le dΘmarrage de IzyWeb, on voit une sorte de Dialog Box qui nous rappelle que c'est un shareware, bla bla bla. .....

Il nous propose de s'enregistrer .... chose qu'on va tenter de faire, donc cliquez sur "S'enregistrer ..."

Mettez votre nom, et un s/n bidon et posez vos bpx. (bpx getdlgitemtexta, bpx getwindowtexta pour ceux qui auraient oubliΘ, et pour les courageux, n'oubliez pas les api 16 bits qui ne serviront α rien ici).

Cliquez sur le bouton "OK" et on tombe (⌠ quelle surprise) sous Soft Ice. Appuyez sur F12 pour voir qui appelle l'API GetWindowTextA et vous voyez si tout va bien MFC42.DLL, qui est la librairie de Ms Visual C++. Appuyez sur Ctrl-D car nous allons avoir 2 appels de l'api (car il y a 2 Edit Box). On retombe encore sous SI et un coup de F12 nous renvoit dans MFC42.

Il faut maintenant remonter dans le programme car de toute maniΦre, c'est izyweb.exe qui a appelΘ une fonction de MFC42 qui utilise GetWindowTextA. Appuyez donc sur F12 pas mal de fois (vous tombez successivement sur Izyweb (mais sur un ret!), MFC42, kernel32, user, MFC42 et enfin Izyweb) et on arrive en 0x0040752E.

Le prog dΘsassemblΘ est :

:0040752E lea ecx, dword ptr [ebp-18] <= ICI
:00407531 call 00408560
:00407536 mov [ebp-04], 01
:0040753A lea eax, dword ptr [ebp-1C]
<= INTERESSANT
:0040753D push eax
:0040753E lea ecx, dword ptr [ebp-18]
:00407541 call 004085A1
:00407546 lea ecx, dword ptr [ebp-18]
:00407549 call 004085BD
<= IMPORTANT !
:0040754E test eax, eax
:00407550 je 00407884
:00407556 lea ecx, dword ptr [ebp-18]
:00407559 call 004085BD
<= BINGO !
:0040755E cmp eax, dword ptr [ebp-20]
:00407561 jne 00407884

Commentaires de la source :

ICI : c'est lα o∙ on arrive

INTERRESSANT : α partir de lα, eax pointe vers le nom. (pour le vΘrifier, tapez "dd eax" qui vous donnera une adresse mΘm. et si vous faites "d adresse mΘm" vous verrez votre nom !)

IMPORTANT :

Voilα la routine appelΘe :

:004085BD push ebp
:004085BE mov ebp, esp
:004085C0 push ecx
:004085C1 mov dword ptr [ebp-04], ecx
:004085C4 mov ecx, dword ptr [ebp-04]
:004085C7 add ecx, 00000008
:004085CA call 00406430
:004085CF test eax, eax
:004085D1 jne 004085E3
:004085D3 mov ecx, dword ptr [ebp-04]
:004085D6 add ecx, 00000008
:004085D9 call 004063F0
:004085DE cmp eax, 00000008
<= ICI eax = longueur(nom)
:004085E1 jge 004085E7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085D1(C)
|
:004085E3 xor eax, eax
:004085E5 jmp 004085F5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085E1(C)
|
:004085E7 mov ecx, dword ptr [ebp-04]
:004085EA call 004085F9
:004085EF mov eax, dword ptr [ebp-04]
:004085F2 mov eax, dword ptr [eax+04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085E5(U)
|
:004085F5 mov esp, ebp
:004085F7 pop ebp
:004085F8 ret

Cette routine sert α vΘrifier la longueur de notre nom et il faut que celle-ci soit supΘrieure ou Θgale α 8 (car il y a un JGE).

Si le nom est infΘrieur α 8 caractΦres, un test de flag (0040754E) nous envoie sur la MessageBoxA "Code Invalide".

BINGO ! :

Cette routine calcule le s/n ... Vous ne me croyez pas ?

Passez au-dessus avec F10 et on tombe sur un cmp eax, dword ptr [ebp-20]

Faites "d ebp-20" et vous tombez sur le s/n que vous avez entrΘ (en hexa) et si vous faites "? eax", vous verrez le vrai s/n qui faut rentrer !

Donc pour tout ceux qui Θtait intΘressΘ uniquement α ce s/n, vous pouvez passer votre chemin, pour les autres (les vrais crackers), l'aventure continue ....

On a donc trouver le plus important : la routine de calcule du s/n ! Passons α l'acte II

 

II/ La Keygen

╟a risque d'Ωtre assez long ici .....

 

1) Le calcul du s/n

 

Voilα la routine :

* Referenced by a CALL at Addresses:
|:00406192 , :004061A8 , :00407549 , :00407559
|
:004085BD push ebp
:004085BE mov ebp, esp
:004085C0 push ecx
:004085C1 mov dword ptr [ebp-04], ecx
:004085C4 mov ecx, dword ptr [ebp-04]
:004085C7 add ecx, 00000008
:004085CA call 00406430
:004085CF test eax, eax
:004085D1 jne 004085E3
:004085D3 mov ecx, dword ptr [ebp-04]
:004085D6 add ecx, 00000008
:004085D9 call 004063F0
:004085DE cmp eax, 00000008
<= encore une vΘrif de la longueur du nom
:004085E1 jge 004085E7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085D1(C)
|
:004085E3 xor eax, eax
:004085E5 jmp 004085F5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085E1(C)
|
:004085E7 mov ecx, dword ptr [ebp-04]
:004085EA call 004085F9
<= sous routine qui calcule...
:004085EF mov eax, dword ptr [ebp-04]
:004085F2 mov eax, dword ptr [eax+04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085E5(U)
|
:004085F5 mov esp, ebp
:004085F7 pop ebp
:004085F8 ret

 

 

Et la sous-routine avec les commentaires :

 

* Referenced by a CALL at Address:
|:004085EA
|
:004085F9 push ebp
:004085FA mov ebp, esp
:004085FC sub esp, 00000030
:004085FF mov dword ptr [ebp-30], ecx
:00408602 mov ecx, dword ptr [ebp-30]
:00408605 add ecx, 00000008
:00408608 call 004063F0
:0040860D mov dword ptr [ebp-04], eax
:00408610 mov [ebp-28], 00000000
:00408617 jmp 00408622

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408641(U)
|
:00408619 mov eax, dword ptr [ebp-28]
:0040861C add eax, 00000001
:0040861F mov dword ptr [ebp-28], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408617(U)
|
:00408622 cmp dword ptr [ebp-28], 00000004
:00408626 jge 00408643
:00408628 mov ecx, dword ptr [ebp-28]
:0040862B push ecx
:0040862C mov ecx, dword ptr [ebp-30]
:0040862F add ecx, 00000008
:00408632 call 00406450
:00408637 movsx edx, al
:0040863A mov eax, dword ptr [ebp-28]
:0040863D mov dword ptr [ebp+4*eax-24], edx
:00408641 jmp 00408619

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408626(C)
|
:00408643 mov ecx, dword ptr [ebp-04]
:00408646 sub ecx, 00000001
:00408649 mov dword ptr [ebp-2C], ecx
:0040864C jmp 00408660

Cette 1Φre partie est moyennement intΘressante : elle chope le nom & le s/n entrΘs.

 

 


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408684(U)
|
:0040864E mov edx, dword ptr [ebp-2C]
:00408651 sub edx, 00000001
:00408654 mov dword ptr [ebp-2C], edx
:00408657 mov eax, dword ptr [ebp-28]
:0040865A add eax, 00000001
:0040865D mov dword ptr [ebp-28], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040864C(U)
|
:00408660 mov ecx, dword ptr [ebp-04]
:00408663 sub ecx, 00000005
:00408666 cmp dword ptr [ebp-2C], ecx
:00408669 jle 00408686
:0040866B mov edx, dword ptr [ebp-2C]
:0040866E push edx
:0040866F mov ecx, dword ptr [ebp-30]
:00408672 add ecx, 00000008
:00408675 call 00406450
:0040867A movsx eax, al
:0040867D mov ecx, dword ptr [ebp-28]
:00408680 mov dword ptr [ebp+4*ecx-24], eax
:00408684 jmp 0040864E

╟a devient intΘressant ici, le prog commence α choper les lettres du nom.

Comme il faut que le nom soit > α 8 et que le mien est "Nody", je vais prendre qqn au hasard .... disons "Pass Partout" au pif.

Le prog. dΘcompose le nom de cette faτon :

ebp-24 "P" ebp-20 "a" ebp-1C "s" ebp-18 "s"
ebp-14 "t" ebp-10 "u" ebp-0C "o" ebp-08 "t"

Il ne choppe en fait que les 4 premiΦres lettres et les 4 derniΘres (qu'il inverse)...

On remplacera cette partie par une autre routine pour notre keygen.

 


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408669(C)
|
:00408686 mov edx, dword ptr [ebp-24]
edx = "P"
:00408689 add edx, 00004CF2
edx = edx + 19698
:0040868F mov dword ptr [ebp-24], edx
ebp-24 = edx
:00408692 mov eax, dword ptr [ebp-24]
eax = ebp-24
:00408695 imul eax, 00007D00
eax = eax * 32000
:0040869B mov ecx, dword ptr [ebp-20]
ecx = "a"
:0040869E sub ecx, eax
ecx = ecx - eax
:004086A0 mov dword ptr [ebp-20], ecx
ebp-20 = ecx
:004086A3 mov edx, dword ptr [ebp-10]
edx = "u"
:004086A6 imul edx, dword ptr [ebp-20]
edx = edx * ebp-20
:004086AA mov eax, dword ptr [ebp-1C]
eax = "s"
:004086AD add eax, edx
eax = eax + edx
:004086AF mov dword ptr [ebp-1C], eax
ebp-1C = eax
:004086B2 mov ecx, dword ptr [ebp-0C]
ecx = "o"
:004086B5 imul ecx, 000087E2
ecx = ecx * 34786
:004086BB mov edx, dword ptr [ebp-08]
edx = "t"
:004086BE add edx, ecx
edx = edx + ecx
:004086C0 mov eax, dword ptr [ebp-18]
eax = "s"
:004086C3 sub eax, edx
eax = eax - edx
:004086C5 mov dword ptr [ebp-18], eax
ebp-18 = eax
:004086C8 mov ecx, dword ptr [ebp-1C]
ecx = ebp-1C
:004086CB imul ecx, 000039A4
ecx = ecx * 14756
:004086D1 mov edx, dword ptr [ebp-18]
edx = ebp-18
:004086D4 sub edx, ecx
edx = edx - ecx
:004086D6 mov eax, dword ptr [ebp-14]
eax = "t"
:004086D9 add eax, edx
eax = eax + edx
:004086DB mov dword ptr [ebp-14], eax
ebp-14 = eax
:004086DE mov ecx, dword ptr [ebp-10]
ecx = "u"
:004086E1 imul ecx, 0000000E
ecx = ecx * 14
:004086E4 mov edx, dword ptr [ebp-10]
edx = "u"
:004086E7 sub edx, ecx
edx = edx - ecx
:004086E9 mov dword ptr [ebp-10], edx
ebp-10 = edx
:004086EC mov eax, dword ptr [ebp-08]
eax = "t"
:004086EF imul eax, 00003A98
eax = eax * 15000
:004086F5 imul eax, dword ptr [ebp-14]
eax = eax * ebp-14
:004086F9 mov ecx, dword ptr [ebp-0C]
ecx = "o"
:004086FC add ecx, eax
ecx = ecx + eax
:004086FE mov dword ptr [ebp-0C], ecx
ebp-c = ecx
:00408701 mov edx, dword ptr [ebp-20]
edx = ebp-20
:00408704 imul edx, dword ptr [ebp-10]
edx = edx * ebp-10
:00408708 mov eax, dword ptr [ebp-24]
eax = ebp-24
:0040870B add eax, edx
eax = eax + edx
:0040870D mov ecx, dword ptr [ebp-08]
ecx = "t"
:00408710 sub ecx, eax
ecx = ecx - eax
:00408712 mov dword ptr [ebp-08], ecx
ebp-8 = ecx

C'est la premiΦre partie du code qui sert vΘritablement α calculer un bout du s/n.

Il n'y a rien de bien compliquer, que de l'arithmΘtique.

On gardera cette routine pour notre keygen (en remplaτant les ebp-xx par un tableau de valeurs).

 

:00408715 mov edx, dword ptr [ebp-30]
:00408718 mov [edx+04], 00000000

Mets α zΘro une variable qui pointe α [ebp-30]+4.

En va mettre τa dans notre keygen : mov dword ptr [VAR1], 0

 

:0040871F mov [ebp-28], 00000000

 

Mets α zΘro une 2Φme variable qui pointe α [ebp-28]

En va mettre τa dans notre keygen : mov dword ptr [VAR2], 0

 

:00408726 jmp 00408731

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408759(U)
|
:00408728 mov eax, dword ptr [ebp-28]
eax = [VAR2]
:0040872B add eax, 00000001
eax = eax + 1
:0040872E mov dword ptr [ebp-28], eax
[VAR2] = eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408726(U)
|
:00408731 cmp dword ptr [ebp-28], 00000008
[VAR2] = 8 ??
:00408735 jge 0040875B
:00408737 mov ecx, dword ptr [ebp-28]
ecx = [VAR2]
:0040873A add ecx, 00000001
ecx = ecx + 1
:0040873D imul ecx, 0000029A
ecx = ecx * 666
:00408743 mov edx, dword ptr [ebp-28]
edx = [VAR2]
:00408746 imul ecx, dword ptr [ebp+4*edx-24]

ici, ecx = ecx * (i)*4 + ebp-24 pour i variant de 0 α 7, ce qui correspond α notre "tableau de valeurs" (ebp-xx)


:0040874B mov eax, dword ptr [ebp-30]
/eax = [VAR1]
:0040874E mov edx, dword ptr [eax+04]
/
:00408751 add edx, ecx
edx = edx + ecx
:00408753 mov eax, dword ptr [ebp-30]
/ eax = [VAR1]
:00408756 mov dword ptr [eax+04], edx
/
:00408759 jmp 00408728
et on recommence jusqu'α [VAR2] = 8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408735(C)
|
:0040875B mov esp, ebp
:0040875D pop ebp
:0040875E ret

 

A partir de lα, on retourne en 004085EF o∙ il y a τa :

 

:004085EF mov eax, dword ptr [ebp-04]
:004085F2 mov eax, dword ptr [eax+04]

Ce qui correpsond pour nous α : eax = [VAR1]

 

Voilα la routine qui nous servira α calculer le s/n pour la keygen :

 

donnΘes de la routine :

NOM : string qui contient le nom
SN : "tableau" qui correspond aux ebp-xx pour placer les lettres du nom tel que :

ebp-24 ~ SN
ebp-20 ~ SN+4
ebp-1C ~ SN+8
[...]
ebp-08 ~ SN+28

VAR1 & VAR2 : 2 double mots (cf au-dessus)

SN2 : variable temporaire pour la conversion hexa <=> dΘc.

 

Calcul_SN Proc

push offset NOM
call lstrlen
cmp eax, 8
jl Byebye


mov bl, byte ptr [NOM]
movsx ebx, bl
mov dword ptr [SN], ebx
mov bl, byte ptr [NOM+1]
movsx ebx, bl
mov dword ptr [SN+4], ebx
mov bl, byte ptr [NOM+2]
movsx ebx, bl
mov dword ptr [SN+8], ebx
mov bl, byte ptr [NOM+3]
movsx ebx, bl
mov dword ptr [SN+12], ebx
mov bl, byte ptr [NOM+eax-1]
movsx ebx, bl
mov dword ptr [SN+16], ebx
mov bl, byte ptr [NOM+eax-2]
movsx ebx, bl
mov dword ptr [SN+20], ebx
mov bl, byte ptr [NOM+eax-3]
movsx ebx, bl
mov dword ptr [SN+24], ebx
mov bl, byte ptr [NOM+eax-4]
movsx ebx, bl
mov dword ptr [SN+28], ebx

Cette partie place les 4 premiΦres lettres et les 4 derniΦres dans le tableau SN.



mov edx, dword ptr [SN]
add edx, 00004CF2h
mov dword ptr [SN], edx
mov eax, dword ptr [SN]
imul eax, 00007D00h
mov ecx, dword ptr [SN+4]
sub ecx, eax
mov dword ptr [SN+4], ecx
mov edx, dword ptr [SN+20]
imul edx, dword ptr [SN+4]
mov eax, dword ptr [SN+8]
add eax, edx
mov dword ptr [SN+8], eax
mov ecx, dword ptr [SN+24]
imul ecx, 000087E2h
mov edx, dword ptr [SN+28]
add edx, ecx
mov eax, dword ptr [SN+12]
sub eax, edx
mov dword ptr [SN+12], eax
mov ecx, dword ptr [SN+8]
imul ecx, 000039A4h
mov edx, dword ptr [SN+12]
sub edx, ecx
mov eax, dword ptr [SN+16]
add eax, edx
mov dword ptr [SN+16], eax
mov ecx, dword ptr [SN+20]
imul ecx, 0000000Eh
mov edx, dword ptr [SN+20]
sub edx, ecx
mov dword ptr [SN+20], edx
mov eax, dword ptr [SN+28]
imul eax, 00003A98h
imul eax, dword ptr [SN+16]
mov ecx, dword ptr [SN+24]
add ecx, eax
mov dword ptr [SN+24], ecx
mov edx, dword ptr [SN+4]
imul edx, dword ptr [SN+20]
mov eax, dword ptr [SN]
add eax, edx
mov ecx, dword ptr [SN+28]
sub ecx, eax
mov dword ptr [SN+28], ecx

Simple copier/coller du code original.


mov dword ptr [VAR1], 0
mov dword ptr [VAR2], 0
jmp adr_408731

adr_408728 :

mov eax, dword ptr [VAR2]
add eax, 00000001
mov dword ptr [VAR2], eax

adr_408731 :

cmp dword ptr [VAR2], 00000008
jge adr_40875B
mov ecx, dword ptr [VAR2]
add ecx, 00000001
imul ecx, 0000029Ah
mov edx, dword ptr [VAR2]
imul ecx, dword ptr [SN+4*edx]
mov edx, dword ptr [VAR1]
add edx, ecx
mov eax, dword ptr [ebp-30]
mov dword ptr [VAR1], edx
jmp adr_408728

adr_40875B :

mov eax, dword ptr [VAR1]

Ici aussi, c'est presque un copier/coller, sauf qu'on a mis nos variables VAR1 & VAR2.

A partir d'ici, eax = le bon s/n mais en hexa.

XOR ECX,ECX
XOR EBX,EBX
MOV ebx, 10
MOV ECX,0AH

BOUCLE:
XOR EDX,EDX
DIV ECX
ADD DL,30H
CMP DL,3AH
JL POST
ADD DL,7

POST:
DEC ebx
MOV byte ptr [SN2+ebx],DL
OR EAX,EAX
JNZ BOUCLE

Cette routine convertit de l'hexa en dΘcimal. (routine pompΘe sur le tut de micky mouse sur mirc :-) )

 


mov eax, offset [SN2]
add eax, ebx

Maintenant, eax pointe vers le bon s/n en dΘcimal.


push offset eax
push offset MESS
call lstrcat

On concatΦne MESS ("Votre s/n est : ") avec le s/n

 


push MB_OK
push offset TITRE
push offset MESS
push 0
call MessageBoxA

et on affiche le tout !


xor eax, eax
xor edx, edx

Zeros :
mov byte ptr [NOM+eax], dh
mov byte ptr [SN2+eax], dh
inc al
cmp al, 40
jl Zeros

push offset MESS2
push offset MESS
call lstrcpy

On remet α 0 nos tableaux au cas o∙ le user voudrait plus d'un s/n.


jmp Byebye_2

Byebye :
push MB_OK
push offset TITRE
push offset ERR_1
push 0
call MessageBoxA

Message d'erreur (nom < 8 caractΦres)


Byebye_2 :


ret
endp


 

Voilα, c'est fini pour la partie calculant le s/n.

On va maintenant faire une zolie Dialog Box .....

 

2) CrΘation de la DialogBoxParamA

 

Pour crΘer une dialog box, il vous faut un Θditeur de ressources comme Borland Resource Workshop 4.5.

Il est assez facile d'emploi.... Commencez par crΘer un nouveau projet (un fichier *.RC), il vous demande le nom et mettez izyweb par exemple.

Maintenant, faites Resource/New et choisissez "Dialog", puis "Windows Dialog, buttons on right...".

Voilα, on peut maintenant Θditer la dialog box. La mienne ressemble α τa :

Elle contient 3 boutons, un "edit text", un "static text".

Enregistrez-votre dialog box et vous obtenez un fichier *.RC de ce style :

 

/****************************************************************************


test.rc

produced by Borland Resource Workshop


*****************************************************************************/

#define DIALOG_1 1
#define IDC_EDIT1 101
#define IDC_BUTTON_ABOUT 102

DIALOG_1 DIALOG 6, 15, 207, 111
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "IzyWeb 1.0 Keygen par Nody"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK", IDOK, 148, 6, 50, 14
PUSHBUTTON "Cancel", IDCANCEL, 148, 24, 50, 14
EDITTEXT IDC_EDIT1, 53, 86, 97, 13
LTEXT "Entrez votre nom ci-dessous : ", -1, 52, 69, 103, 9
PUSHBUTTON "A propos de", IDC_BUTTON_ABOUT, 148, 43, 50, 15
}

Il faut maintenant "compiler" votre fichier *.RC en un *.RES. Chez moi, Borland Workshop merde un peu pour le faire alors j'utilise brc32.exe de cette faτon :

brc32 izyweb.rc

╟a y est le RC est compilΘ....

Il faut aussi une procΘdure qu'on mettra dans le code asm pour la DialogBoxParamA. Je vous propose τa (merci Enkhyl :-) ) :

DialogProc Proc
ARG Hwnd:dword, Msg:dword, Wparam:dword, Lparam:dword


mov eax, Msg
cmp eax, WM_COMMAND
<= bouton pressΘ ??
je wmcommand
<= oui, tachons de savoir lequel ...
cmp eax, WM_CLOSE
<= croix pressΘe ?
je wmclose
<= oui, on se casse alors ...
jmp MsgNonTraite
<= il ne s'est rien passΘ

wmcommand:
mov eax, Wparam
cmp eax, IDOK
<= bouton OK ?
je boutton_ok
cmp eax, IDCANCEL
<= bouton CANCEL ?
je boutton_cancel
cmp eax, IDC_BUTTON_ABOUT
<= ou bouton ABOUT ?
je boutton_about
jmp MsgTraite


boutton_ok:
; il faut alors, lire l'edit_box, calculer le s/n


boutton_cancel:
; il faut alors quitter


boutton_about:
; on affiche une simple messageboxa


wmclose:
push 01
push Hwnd
call EndDialog

MsgTraite:
xor eax, eax
inc eax
ret

MsgNonTraite:
xor eax, eax
ret

endp

Voilα, il n'y a plus quα remplir et faire l'appel .....

 

Voilα maintenant la source complΦte de la Keygen :

(que vous pouvez compiler, mais pas me voler :-) )

 

; ************************************************************************
; IzyWeb 1.0
; Keygen par Nody 20/07/1999
; Tous droits rΘservΘs :-)
;
; α compiler comme τa (si le fichier asm est izyweb_k.asm et le fichier
; de ressource izyweb.res) :
;
; tasm32 -ml -m5 -q izyweb_k
; tlink32 -Tpe -aa -x -c izyweb_k ,,, import32 ,, izyweb
;
; ************************************************************************

.386p
.model flat, stdCALL

EXTRN ExitProcess:PROC
EXTRN MessageBoxA:PROC
EXTRN DialogBoxParamA:PROC
EXTRN GetModuleHandleA:PROC
EXTRN EndDialog:PROC
EXTRN GetDlgItemTextA:PROC
EXTRN lstrlen:PROC
EXTRN lstrcat:PROC
EXTRN lstrcpy:PROC


INCLUDE WINDOWS.INC


.DATA

NULL EQU 0

WM_COMMAND EQU 0111h
WM_CLOSE EQU 0010h

Handle DD ?

; ne pas oublier les constantes :

DIALOG_1 EQU 1
IDOK EQU 1
IDCANCEL EQU 2
IDC_EDIT1 EQU 101
IDC_BUTTON_ABOUT EQU 102

TITRE DB 'IzyWeb 1.0 Keygen',0
NOM DB 40 DUP (0)
MESS_CANCEL DB 'Tchaoo...',0
MESS_ABOUT DB 'IzyWeb 1.0 Keygen',13,10
DB '--------------------------------',13,10
DB 13,10
DB 'Par Nody - nodless@usa.net',13,10
DB 0


MESS DB 'Votre s/n est : ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MESS2 DB 'Votre s/n est : ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

ERR_1 DB 'Votre nom doit faire au moins 8 caractΦres !',0

SN DB 80h DUP (0)
VAR1 DD 0
VAR2 DD 0
SN2 DD 40 DUP (0)



.CODE


START:


push 0
call GetModuleHandleA
mov Handle, eax

push 0
push offset DialogProc
push 0
push DIALOG_1
push Handle
call DialogBoxParamA

PUSH NULL
CALL ExitProcess


; PremiΦre ProcΘdure

Calcul_SN Proc


push offset NOM
call lstrlen
cmp eax, 8
jl Byebye


mov bl, byte ptr [NOM]
movsx ebx, bl
mov dword ptr [SN], ebx

mov bl, byte ptr [NOM+1]
movsx ebx, bl
mov dword ptr [SN+4], ebx

mov bl, byte ptr [NOM+2]
movsx ebx, bl
mov dword ptr [SN+8], ebx

mov bl, byte ptr [NOM+3]
movsx ebx, bl
mov dword ptr [SN+12], ebx

mov bl, byte ptr [NOM+eax-1]
movsx ebx, bl
mov dword ptr [SN+16], ebx

mov bl, byte ptr [NOM+eax-2]
movsx ebx, bl
mov dword ptr [SN+20], ebx

mov bl, byte ptr [NOM+eax-3]
movsx ebx, bl
mov dword ptr [SN+24], ebx

mov bl, byte ptr [NOM+eax-4]
movsx ebx, bl
mov dword ptr [SN+28], ebx


mov edx, dword ptr [SN]
add edx, 00004CF2h
mov dword ptr [SN], edx
mov eax, dword ptr [SN]
imul eax, 00007D00h
mov ecx, dword ptr [SN+4]
sub ecx, eax
mov dword ptr [SN+4], ecx
mov edx, dword ptr [SN+20]
imul edx, dword ptr [SN+4]
mov eax, dword ptr [SN+8]
add eax, edx
mov dword ptr [SN+8], eax
mov ecx, dword ptr [SN+24]
imul ecx, 000087E2h
mov edx, dword ptr [SN+28]
add edx, ecx
mov eax, dword ptr [SN+12]
sub eax, edx
mov dword ptr [SN+12], eax
mov ecx, dword ptr [SN+8]
imul ecx, 000039A4h
mov edx, dword ptr [SN+12]
sub edx, ecx
mov eax, dword ptr [SN+16]
add eax, edx
mov dword ptr [SN+16], eax
mov ecx, dword ptr [SN+20]
imul ecx, 0000000Eh
mov edx, dword ptr [SN+20]
sub edx, ecx
mov dword ptr [SN+20], edx
mov eax, dword ptr [SN+28]
imul eax, 00003A98h
imul eax, dword ptr [SN+16]
mov ecx, dword ptr [SN+24]
add ecx, eax
mov dword ptr [SN+24], ecx
mov edx, dword ptr [SN+4]
imul edx, dword ptr [SN+20]
mov eax, dword ptr [SN]
add eax, edx
mov ecx, dword ptr [SN+28]
sub ecx, eax
mov dword ptr [SN+28], ecx

mov dword ptr [VAR1], 0
mov dword ptr [VAR2], 0
jmp adr_408731

adr_408728 :

mov eax, dword ptr [VAR2]
add eax, 00000001
mov dword ptr [VAR2], eax

adr_408731 :

cmp dword ptr [VAR2], 00000008
jge adr_40875B
mov ecx, dword ptr [VAR2]
add ecx, 00000001
imul ecx, 0000029Ah
mov edx, dword ptr [VAR2]
imul ecx, dword ptr [SN+4*edx]
mov edx, dword ptr [VAR1]
add edx, ecx
mov eax, dword ptr [ebp-30]
mov dword ptr [VAR1], edx
jmp adr_408728

adr_40875B :

mov eax, dword ptr [VAR1]
XOR ECX,ECX
XOR EBX,EBX
MOV ebx, 10
MOV ECX,0AH

BOUCLE:
XOR EDX,EDX
DIV ECX
ADD DL,30H
CMP DL,3AH
JL POST
ADD DL,7

POST:
DEC ebx
MOV byte ptr [SN2+ebx],DL
OR EAX,EAX
JNZ BOUCLE

mov eax, offset [SN2]
add eax, ebx

push offset eax
push offset MESS
call lstrcat

push MB_OK
push offset TITRE
push offset MESS
push 0
call MessageBoxA

xor eax, eax
xor edx, edx

Zeros :
mov byte ptr [NOM+eax], dh
mov byte ptr [SN2+eax], dh
inc al
cmp al, 40
jl Zeros

push offset MESS2
push offset MESS
call lstrcpy

jmp Byebye_2

Byebye :
push MB_OK
push offset TITRE
push offset ERR_1
push 0
call MessageBoxA

Byebye_2 :






ret
endp



; ProcΘdure de la DialogBoxParamA

DialogProc Proc
ARG Hwnd:dword, Msg:dword, Wparam:dword, Lparam:dword

mov eax, Msg
cmp eax, WM_COMMAND
je wmcommand
cmp eax, WM_CLOSE
je wmclose
jmp MsgNonTraite

wmcommand:
mov eax, Wparam
cmp eax, IDOK
je boutton_ok
cmp eax, IDCANCEL
je boutton_cancel
cmp eax, IDC_BUTTON_ABOUT
je boutton_about
jmp MsgTraite


boutton_ok:

push 40
push offset NOM
push IDC_EDIT1
push Hwnd
call GetDlgItemTextA
cmp eax, 0
je MsgNonTraite

call Calcul_SN

jmp MsgTraite

boutton_cancel:

push MB_OK
push offset TITRE
push offset MESS_CANCEL
push 0
call MessageBoxA
jmp wmclose

boutton_about:
push MB_OK
push offset TITRE
push offset MESS_ABOUT
push 0
call MessageBoxA
jmp MsgTraite


wmclose:
push 01
push Hwnd
call EndDialog

MsgTraite:
xor eax, eax
inc eax
ret
MsgNonTraite:
xor eax, eax
ret
endp


END START


; ************************************************************************
; ************************************************************************

 

 

Voilα, α partir d'aujourd'hui je veux voir uniquement des keygen en asm 32 bits (et τa prend pas trop de place : 8ko) !!!!!

 

Merci α :

Enkhyl
Mickey Mouse
Etmc

 

 

 

 

 

nodless@usa.net