|
Keygenerator Sources Pincopall non dimentica mai =) | ||
|
Data |
by " Pincopall " |
|
|
05/07/2002 |
Published by Quequero | |
|
|
Facciamo cosi, te lo commento quando mi mandi la final release del keygen ok? :PPPP |
|
|
3. Se ne deduce che ... |
|
4. ...L'unione fà la forza solo se si è in più di tre, sennò fatevi le cose da soli =) |
|
Difficoltà |
Non ne avrete se conoscete l'assembler |
|
|
Introduzione |
tasm32 -ml -m5 -q c:\tasm\prog\demon tlink32 -Tpe -aa -x -c c:\tasm\bin\demon ,,, import32
|
Routine da Keygenerare |
|
The Keygerator Source Code |
.386
locals
jumps
.model flat,STDCALL
extrn GetModuleHandleA:Proc ; chiamiamo tutte le API necessarie e le
extrn MessageBoxA:Proc ; definiamo come procedure esterne
extrn ExitProcess:Proc
extrn CreateWindowExA:Proc
extrn RegisterClassA:Proc
extrn GetMessageA:Proc
extrn DispatchMessageA:Proc
extrn TranslateMessage:Proc
extrn PostQuitMessage:Proc
extrn DefWindowProcA:Proc
extrn CloseHandle:Proc
extrn GetWindowTextA:Proc
extrn GetProcAddress:Proc
extrn PostQuitMessage: Proc
CS_VREDRAW EQU 0001h ; definiamo i caratteri delle finestre
CS_HREDRAW EQU 0002h
CS_GLOBALCLASS EQU 4000h ; classe globale della finestra
COLOR_WINDOW EQU 019h ; colore di bakground cioè grigio
NULL EQU 0 ; questa è molto utile ;)
MB_OK EQU 00000000h ; vengono definite tutte le icone per
MB_OKCANCEL EQU 00000001h ; i messagebox
MB_ICONHAND EQU 00000010h
MB_ICONQUESTION EQU 00000020h
MB_ICONEXCLAMATION EQU 00000030h
MB_ICONASTERISK EQU 00000040h
CW_USEDEFAULT EQU 8000h ; posizione di default della finestra
WS_OVERLAPPED EQU 000000000h ; qui definiamo se la finestra deve
WS_THICKFRAME EQU 000040000h ; avere i bordi, un menu, se deve essere
WS_DLGFRAME EQU 000400000h ; visibile ecc...In pratica tutte le
WS_BORDER EQU 000800000h ; caratteristiche necessarie
WS_CAPTION EQU 000C00000h
WS_VISIBLE EQU 010000000h
WS_CHILD EQU 040000000h
WS_SYSMENU EQU 000080000h ; line 40
BS_DEFPUSHBUTTON EQU 0001h
WM_DESTROY EQU 0002h ; definiamo l'evento WM_DESTROY che viene
; chiamato da winzoz ogni volta che si chiude una finestra
WM_COMMAND EQU 0111h ; l'evento WM_COMMAND si verifica invece ogni volta che si preme un pulsante
; definiamo una struttura (copiato e pastato da windows.inc)
WNDCLASS struc
clsStyle dd ? ; class style
clsLpfnWndProc dd ?
clsCbClsExtra dd ?
clsCbWndExtra dd ?
clsHInstance dd ? ; instance handle
clsHIcon dd ? ; class icon handle
clsHCursor dd ? ; class cursor handle
clsHbrBackground dd ? ; class background brush
clsLpszMenuName dd ? ; menu name
clsLpszClassName dd ? ; far ptr to class name
WNDCLASS ends
POINT struc ; definiamo la struttura che ci permetterà
ptX dd ? ; di dire a winzoz le coordinate dei componenti
ptY dd ? ; della finestra
POINT ends
MSGSTRUCT struc ; altra struttura
msHWND dd ?
msMESSAGE dd ?
msWPARAM dd ?
msLPARAM dd ?
msTIME dd ?
msPT POINT >
MSGSTRUCT ends
.data
pass db 'uic',0 ;55h, 49h, 43h
wc WNDCLASS >
msg MSGSTRUCT >
AppHWnd dd 0 ; l'handle dell'applicazione
NewHWnd dd 0 ; l'handle della nostra finestra
ButtonHWnd dd 0 ; l'handle del bottone
EditHWnd dd 0 ; l'handle dell'edit box
; da qui in poi verranno definite tutte le caption, i testi dei messagebox
; ed i nomi di tutti i pulsanti
EditClass db "Edit",0
WindowCaption db "Multimedia Builder MP3 v4.6, 4.7 & 4.8 Keygenerator - - Coded by Pincopall/^LocklesS^",0
WndClassName db "Asm",0
ButtonCaption db "Generate",0
ButtonClass db "Button",0
classwindow db "Asm",0
Serial db 'This is Your Serial !! ;)',0
capt3 db 'Nooooooooooo!!!',0
error db 'Error!',0
noname db 'Scrivi un nome, deve contenere "@" e deve essere di almeno una lettera!',0
senzaat db 'Il nome deve contenere una "@"',0
kernel db 'kernel32.dll', 0
undoc db 'RegisterServiceProcess',0 ; funzione non documentata
serialprima db '1-',0
HIDE dd ?
NULL EQU 0
.code
Start:
push 0h
call GetModuleHandleA ; troviamo l'handle dell'applicazione
mov [AppHWnd],eax ; salviamolo in AppHWnd
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
mov [wc.clsLpfnWndProc], offset WndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [AppHWnd]
mov [wc.clsHInstance], eax ; l'handle dell'applicazione
mov [wc.clsHbrBackground], COLOR_WINDOW + 1
mov dword ptr [wc.clsLpszMenuName], 0 ; non vogliamo menu
mov dword ptr [wc.clsLpszClassName], offset WndClassName
push offset wc ; offset della classe appena riempita
call RegisterClassA ; registrala
; Creiamo la finestra
push 0 ; lpParam
push [AppHWnd] ; hInstance
push 0 ; menu
push 0 ; parent hwnd
push 160 ; altezza
push 600 ; larghezza
push CW_USEDEFAULT ; coordinata y
push CW_USEDEFAULT ; coordinata x
push WS_OVERLAPPED OR WS_DLGFRAME OR WS_SYSMENU OR WS_VISIBLE; Stili
push offset WindowCaption ; Titolo della finestra
push offset WndClassName ; Nome della classe
push 0 ; stili extra = no
call CreateWindowExA ; creiamo la finestra
mov [NewHWnd], eax
; Creiamo il pulsante "Generate"
push 0 ; lpParam
push [AppHWnd] ; hInstance
push 20h ; ID del bottone
push [NewHWnd] ; parent hwnd
push 30
push 170
push 20 ; y
push 215 ; x
push WS_BORDER OR WS_VISIBLE OR WS_CHILD
push offset ButtonCaption
push offset ButtonClass
push 0
call CreateWindowExA
mov [ButtonHWnd], eax
; Creiamo l'edit Box
push 0 ; lpParam
push [AppHWnd] ; hInstance
push 40h ; ID dell'edit
push [NewHWnd] ; parent hwnd
push 20
push 360
push 80 ; y
push 120 ; x
push WS_BORDER OR WS_VISIBLE OR WS_CHILD
push 0
push offset EditClass
push 0
call CreateWindowExA
mov [EditHWnd], eax
msg_loop: ; questo loop consente di far
push 0 ; "vivere" la nostra finestra
push 0 ; in pratica la "tiene su" e non
push 0 ; la fa sparire, nel modificare
push offset msg ; questo codice fate sempre tornare
call GetMessageA ; il controllo qui invece di far
cmp ax, 0 ; terminare una chiamata con
je end_loop ; call ExitProcess oki?
push offset msg
call TranslateMessage
push offset msg
call DispatchMessageA
jmp msg_loop
end_loop:
;push AppHWnd
;CALL CloseHandle
push NULL
call ExitProcess
;=================================================================================
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
cmp [wmsg], WM_DESTROY ; si è verificato l'evento WM_DESTROY?
je wmdestroy ; se si salta alla relativa routine
cmp [wmsg], WM_COMMAND ; si è verificato l'evento WM_COMMAND?
je wmcommand ; se si salta alla relativa routine
push [lparam] ; salviamo tutti i vari parametri
push [wparam]
push [wmsg]
push [hwnd]
call DefWindowProcA ; questa funzione assicura che sia processato
ret ; il messaggio
wmdestroy:
push 0
call PostQuitMessage ; la funzione PostQuitMessage indica a winzoz
mov eax, 0 ; che un processo ha chiesto di essere terminato
ret
wmcommand:
cmp [wparam],20h ; Il primo pulsante è stato premuto?
jne fine ; No? Continua il check con gli altri pulsanti, ma non ce ne sono=)
jmp CalcolaSeriale ; si? Salta all'apposita routine
fine:
xor eax,eax ; azzera eax
ret
WndProc endp
;=================================================================================
CalcolaSeriale proc
push 50 ; max caratteri
push ebx ; buffer d testo
push [EditHWnd] ; handle dell'edit
Call GetWindowTextA
cmp eax, 1 ; il nome ha almeno una lettera?
jl nonvabene ; no? allora non va bene
xor edi, edi ; azzera edi
mov edi, eax ; mettici dentro il numero di caratteri del nome, che dopo la chiamata a
; getwindowtexta stà sempre in eax
xor eax,eax ; azzera eax
xor ecx,ecx ; ed anche ecx che useremo come contatore
ciclo1: mov al, byte ptr[ebx+ecx] ; si parte con il primo ciclo in cui controlleremo se
; almeno uno dei caratteri è "@",ovvero ha valore
; decimale pari a 64.
; Cominciamo allora mettendo in al il 1° carattere
inc ecx ; incrementiamo il contatore
cmp al,64 ; il carattere è "@"?
je metteunsegno ; se si gli facciamo mettere una specie di segno
jmp senzasegno ; altrimenti non glielo facciamo mettere e lo facciamo saltare
metteunsegno:
mov ah,10 ; il nostro segnale se almeno uno dei char è @ sarò ah=10
senzasegno:
cmp ecx,edi ; quì controlla se i caratteri del nome sono finiti, se nn lo sono...
jle ciclo1 ; ricomincia il ciclo di controllo
cmp ah,10 ; quì controlla se ah=10, ovvero se abbiamo rovato,alla fine del nostro
; ciclo,almeno un carattere del nome che sia la @
jne civuolelachiocciola ; e se la chiocciolina non c'è, avvisiamo il nostro utente=)
; che la suddetta è necessaria =)
xor ecx,ecx ; riazzeriamo sia ecx che eax che edx
xor eax,eax
xor edx,edx
ciclo2: mov al, byte ptr[ebx+ecx] ; ed arriviamo al secondo ciclo dove, riusando ecx
; come contatore, sommeremo i valori decimali
add edx,eax ; di ogni carattere del nostro nome, facendo finire
inc ecx ; la somma in edx,
cmp ecx,edi ; ovviamente il ciclo cesserà quando ecx sarà uguale
jle ciclo2 ; al numero dei caratteri.
mov eax,276682 ; muoviamo ora in eax il numero hex 438CA
sub eax,edx ; da cui sottraiamo poi la somma precedentemente ottenuta.
call daEsaInDec ; questa differenza ottenuta va ora portata in base dieci, per chi avesse
; già letto il mio tutorial sul keygenerator di Engenius 4.0.1, vi avviso
; che questa routine sarà diversa da quella sviluppata in quel tutorial,
; perkè là il numero da portare in base dieci era di 2 cifre, quà il numero
; è ben più grande, ma vederte che non varierà un granchè =).
mov esi,offset serialprima ; muoviamo in esi la stringa "1-"
mov eax,[ebp] ; poi tramite eax mettiamo in esi+2
mov [esi+2],eax ; la 2a parte del serial,che sarà di 6 cifre, quindi
mov ax,[ebp+4] ; ci costerà due passaggi, una volta occupando un dword (eax)
mov [esi+6],ax ; ed un'altra una word (ax).
mov [esi+8],45 ; Il nono carattere deve essere "-".
call ultimaParte ; Con questa call ci calcoliamo ora la ultima parte del serial
call daEsaInDec ; e con questa la portiamo in base dieci.
mov eax,[ebp] ; Come prima, tramite eax portiamo la ultima parte
mov [esi+9],eax ; del serial in esi+9
mov byte ptr[esi+12],00 ; e disponiamo che il 13esimo carattere sia "null", ovvero diciamo al keygenerator di fermarsi ad esi+11 compreso nel
; prendere i caratteri che poi visualizzeremo nella msg box
; del serial.
push MB_OK OR MB_ICONEXCLAMATION ; Message Box che andremo subito a creare =)
push offset Serial
push offset esi
push NULL
Call MessageBoxA
jmp msg_loop
CalcolaSeriale endp
;===========================================================================
; Bhè abbiamo quì la creazione delle due message box di errore, che compaiono ovviamente a
; seconda dell'errore =).
nonvabene:
push MB_OK OR MB_ICONEXCLAMATION
push offset error
push offset noname
push NULL
Call MessageBoxA
jmp msg_loop
civuolelachiocciola:
push MB_OK OR MB_ICONEXCLAMATION
push offset error
push offset senzaat
push NULL
Call MessageBoxA
jmp msg_loop
daEsaInDec proc ; ecco la call che porta da esadecimale in decimale il nostro numero
push eax ; pushiamo i registri il cui attuale valore ci servirà anche dopo
push edx
push ecx
mov ecx, 10 ; e muoviamo in ecx 10 (0Ah)
mov [ebp],eax ; ed in ebp, il valore di eax, che è poi il numero da mettere in dec.
ciclo3:
xor edx, edx ; azzeriamo edx
div ecx ; e dividiamo eax per ecx, con il quoziente che và a finire in eax ed
; il resto che và a finire in edx
add dl, 48 ; resto a cui aggiungiamo 48 ( 30h ), e se avete a disposizione una
; tavola ascii capite il perchè =)
cmp dl, 58 ; e che poi confrontiamo con 58, ovvero con il valore decimale del primo
; carattere nn numerico nell'ordine delle tabelle ascii ovviamente.
jb decrementaEbp ; Se più piccolo si salta
add dl, 07 ; altrimenti se è più grande gli si aggiunge un 07.
decrementaEbp:
dec ebp ; Decrementiamo ebp
mov [ebp],dl ; ed in ebp decrementato si mette il numero ottenuto.
or eax, eax ; Se eax non è ancora zero
jne ciclo3 ; si ricomincia il ciclo.
pop ecx ; Alla fine si poppa tutto stando attenti alla regola del LIFO
pop edx ; (Last In First Out) per quanto riguarda lo stack...
pop eax
ret ; e si ritorna =)
daEsaInDec endp
ultimaParte proc ; Questa è la call con cui calcoliamo l'ultima parte del serial
push ebp ; Questi sono gli unici due registri di cui ci interessa conservare
push esi ; il valore attuale,
xor ecx, ecx ; gli altri azzeriamoli tranquillamente =)
xor eax, eax
xor ebx, ebx
ciclo4: ; evvia con l'ultimo ciclo
mov bl,[esi+ecx] ; usiamo ecx come contatore ( eggià è un vizio :P ), mettiamo in bl
; il valore hex della cifra nesima della parte iniziale e della
; parte centrale del serial.
inc ecx ; Incrementiamo ecx.
add eax,ebx ; E sommiamo di volta in volta i valori esadecimali.
cmp ecx,7 ; Finchè non arriviamo a sommare l'ottavo carattere, infatti poi
jle ciclo4 ; il ciclo finisce =)
pop esi
pop ebx
ret
ultimaParte endp ; cosiccome la chiamata
End Start ; ed il programma =))
;Saludos,
;Pincopall =)
|
|
|
Disclaimer |
Vorrei ricordare che questo software vaà
comprato e non rubato e o crakkato capito?
Non mi ritengo responsabile
per eventuali danni causati al vostro computer determinati dall'uso improprio
di questo tutorial. Questo documento è stato scritto per invogliare il
consumatore a registrare legalmente i propri programmi, e NON a fargli
fare uso dei tantissimi file crack presenti in rete, infatti tale documento
aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha
dovuto portare avanti per fornire ai rispettivi consumatori i migliori
prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.
Capitoooooooo????? Bhè credo di si ;))))