> CraCk Me n.1:SoLuTiOn
< Realizzato da
NoRpiUs
ToOLz
uTiLiZzATi: - Debugger ( Olly Dbg ) -
No Hex Editor + Disassembler (Vero?? :) )
SpiEgaZiOnE: Beh.. il crack me e' molto molto semplice, l'
ho codato per far si che quelli che sono alle prime armi potessero scriversi un
bel keygenuzzolo :) Ma
partiamo con la spiegazione:
Come al solito, apriamo il nostro bel
programmino e mettiamo un breakpoint sull' API GetDlgItemTextA, andiamo su help
--> registra e mettiamo un nome e pass a caso: notiamo che il debugger poppa
sullo schermo. Subito dopo la seconda call che prende la pass notiamo
questo:
CALL JMP.&USER32.GetDlgItemInt ; questa e' la call per la
pass MOV
EBX,EAX ; prende il serial e lo mette in ebx XOR
EAX,EAX ; azzera
eax LEA ESI,DWORD PTR DS:[4030F8] ; carica
in esi il nome
INIZIO CICLO: MOV AL,BYTE PTR
DS:[ESI] ; mette in al
la prima lettera del nome TEST
AL,AL ; controlla se il nome e' finito JE
SHORT CrackMe.0040122D ; se lo
e', esce dal ciclo ADD
ECX,EAX ; aggiunge eax a ecx SUB
ECX,30 ; toglie a ecx 30h (48 decimale) INC
ESI ; passa alla seconda lettera del
nome JMP INIZIO CICLO ; e torna a inizio ciclo
Praticamente alla fine di questo ciclo abbiamo le
lettere del nostro nome sommate in ecx e poi a ecx verra' sottratto un valore
pari a 30h * le lettere del nome. Quindi per ora il nostro keygen dovrebbe
venire una roba del genere:
main() { char *nome; int i, lun,
serial = 0;
printf("Scrivi il nome: "); scanf("%s",nome);
lun = strlen(nome); for ( i = 0; i < lun; i++) { serial
+= nome[i]; serial -= 48; }
Cosi abbiamo il nostro bel registro ecx = somma.
Ora andiamo avanti con il programma: Subito
dopo il ciclo ci sono queste righe:
CALL CrackMe.0040127C ; richiama qualcosa di oscuro e misterioso CMP
EAX,EBX ;
confronta eax con ebx (ovvero il seriale inserito) JE
SerialeGiusto ;
se sono uguali vai a "Seriale giusto!" JMP
SerialeSbagliato ;
se no vai a "Seriale Sbagliato!"
Quindi il programma esegue la call ( in cui
probabilmente vi saranno degli altri calcoli, visto che dopo per dire se il
seriale e' giusto o no confronta eax con ebx e noi abbiamo il nostro seriale in
ecx ). Molti leim che non si prendono la briga di debuggare avranno cambiato
quello stupido JE in un JNE in modo che salti sempre a "Seriale giusto!" anche
quando il seriale e' sbagliato, ma a noi non ci interessa e andiamo imperterriti
avanti col nostro debugging :)). A questo punto non ci resta che andare a
spulciare quella call e vedere quali calvoli svolge, quindi andiamo sulla call e
premiamo F7:
MOV EAX,ECX ;
mette il seriale che si era calcolato prima in
eax ADD EAX,1B ; gli adda 1B ( 27 decimale) CALL Call2
; e chiama la seconda
call RETN
Call2: MOV ECX,4E ;
mette in ecx 4E ( 78 decimale ) MUL ECX ; moltiplica eax per ecx ( quindi per 78
) XOR EAX,4D2 ;
per ultimo xora il seriale per 4D2 ( 1234 decimale ) RETN
Quindi nella nostra call abbiamo una sottocall che richiama
un altro codice, ma non ci fa paura visto che e' semplice ed e' subito dopo. A
questo punto e' abbastanza semplice andare avanti con il keygen, visto che sono
dei semplicissimi calcoli da aggiungere. Alla fine il keygen risulta cosi:
#include <stdio.h> #include
<string.h>
main() { char *nome; int i, lun, serial =
0;
printf("Scrivi il nome: "); scanf("%s",nome);
lun =
strlen(nome); for ( i = 0; i < lun; i++) { serial +=
nome[i]; serial -= 48; }
serial += 27; serial *=
78; serial ^= 1234;
printf("Il seriale e': %d",serial); }
Perfetto, per oggi e' tutto. Spero che questo
tutorial sia stato di vostro gradimento. Alla prossima, gente! :)
|