Cracking della lezione #1 |
|
|
28/8/1999 |
by "BlackDruiD" |
|
|
Published by Quequero |
|
Don't try this at home...it's dangerous |
Credo che sia il miglior tutorial, nessun errore, spiegazione dei check buona, bravo blackdruid solo che il quesito alla fine (quello di add al, 44) era meglio se lo spiegavi :) |
The road to hell is full of good intentions... |
UIC's form |
|
UIC's form |
Difficolt� |
(X )NewBies ()Intermedio ( )Avanzato ( )Master |
Il prog che sto per crakkare � la lezione #1 del corso istituito da quequero e soci
Introduzione |
Inizier� tra breve a descrivere il metodo usato per patchare il programma scritto da Quequero per la lezione # 1 del corso. Il prog deve essere modificato usando solamente SoftIce
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Essay |
Di seguito vi spiegher� il metodo che ho utilizzato per crackare la lezione numero 1.
Lanciate il programma, inserite un nome nella prima text box e un codice nella seconda.
Entrate in softice premendo ctrl-d e settate un breakpoint sull'istruzione getwindowtexta
(bpx getwindowtexta); premete ancora ctrl-d per uscire da softice e clikkate sul pulsante
'register'.
Ora dovreste ritrovarvi in softice nell'istruzione GetWindowTextA; premete F11 per uscure
dalla funzione e scorrete verso l'alto la finestra del codice per vedere i parametri
passati a tale funzione
push 8 ----> massimo numero di
caratteri prelevati dalla textbox
push 402165 ----> buffer nel quale viene
copiato il nome
push xxxxxxxx ----> handle
del controllo
call getwindowtexta
ora sappiamo che il nome viene salvato all'indirizzo 402165.
Se usiamo lo stesso procedimento per la seconda chiamata di getwindowtexta troveremo anche
l'indirizzo in cui viene salvato il codice inserito: 402169
Notate una cosa: l'indirizzo del buffer del codice � 4 byte pi� avanti dell'indirizzo
del nome;
ci� significa che i caratteri salvati nel buffer saranno al massimo 4.
es:
nome: BlackDruiD
codice: 666333666
buffer-> Blac6663336
notate che il codice viene troncato alla 7ma cifra, ci� dipende dal parametro passato a
getwindowtext che abbiamo visto sopra. Ora dovreste essere nella parte di codice che segue
'getwindowtexta', proviamo ad analizzarla:
............
............
............
xor ecx, ecx
mov al, [ecx+402165] ----------->
sposta in al un char del nome
add al,12
xor al,cl
add al,15
add al,02
mov ebx, 402169
mov ah,[ecx+ebx] ----------->copia in ah un carattere del codice
cmp al, ah ----------->confronta
il carattere del codice con quello calcolato
jnz messaggio_di_errore ----------->richiama un messaggio di errore se i due caratteri non
coincidono
inc ecx
inc eax
cmp ecx,3
jnz ripeti ----------->ripete il ciclo per tre volte
questa parte di codice fa un controllo sui primi 3 byte del codice e, se uno non coincide
termina il prog con una messagebox di errore. dopo l'istruzione jnz ripeti, potete notare
una serie interminabile di funzioni dello stesso tipo che ovviamente non produrranno mai
alcun salto.Probabilmente Quequero le ha inserite per fare impazzire i + inesperti che
erroneamente volessero nopparle tutte..... Hehe peccato che
non c'� cascato nessuno :) NdQue
segue il controllo della seconda parte di codice: (ricordatevi che ecx in questo punto
vale 3)
mov al, [ecx+402165]
----------> sposta in al un char del nome
xor al,16
add al,45
add al,cl --------->esegue dei calcoli sul carattere
prelevato
xor al,cl
mov bl, [ecx+402169] ----------->copia
in bl un carattere del codice
cmp al, bl
----------->confronta il carattere del codice con quello calcolato
jnz messaggio_di_errore ----------->richiama un messaggio di errore se i due caratteri non
coincidono
inc ecx
cmp ecx,8
jnz ripeti ----------->ripete
il ciclo per 5 volte
anche qui segue una serie di jmp inutile. Arriviamo dunque ad una call seguita dal
confronto tra il registro eax e 1; se eax � uguale a 1 appare la messagebox 'Codice
corretto' altrimenti 'codice sbagliato'; entriamo nella call e vediamo cosa fa:
la call ripete il controllo sui primi tre byte (esattamente come descritto sopra) e poi
ripete il controllo della 2da parte del codice:
mov al, [ecx+402165] ----------> sposta in al un char del nome
xor al,16
add al,44 ************
add al,cl --------->esegue dei calcoli sul carattere prelevato
xor al,cl mov ah, [ecx+402169] ----------->copia in bl un carattere del codice
cmp al, ah ----------->confronta il carattere del codice con quello calcolato
jnz azzera_al ---------->se i caratteri non coincidono azzera al (codice errato)ed
esce dalla funzione
inc ecx
cmp ecx,8
jnz ripeti ----------->ripete
il ciclo per 5 volte
mov al,01 ------>il codice �
giusto
jmp fine_call
azzera_al:
mov al,00 ------>il codice �
sbagliato
jmp fine_call
fine_call:
ret
non notate niente di strano? il controllo � esattamente come quello gi� descritto sopra
tranne che per un istruzione(quella con gli asterischi).
all'uscita dalla call avremo al = 0 se il codice � sbagliato e = 1 se � giusto dopo un
controllo sul registro ax, a seconda del suo valore il prog visualizzar� un messaggio di
errore o di congratulazioni veniamo ora al cracking del programma:
ci sono vari modi per crakkare questo programma:
1. si possono modificare tutte le jump di controllo di errore (5 o 6 istruzioni da
modificare)
2. si pu� far saltare il prog direttamente alla messagebox corretta
io ho usato il secondo metodo perch� � pi� semplice e comporta la modifica di una sola
istruzione ora vi spiego come fare:
andate a vedere la funzione di controllo sui primi 3 byte (la prima parte di codice che ho
spiegato) e annotatevi l'indirizzo del jump jnz messaggio_di_errore (nel mio caso �
401242)
ora scorrete verso il basso la finestra di codice fino a trovare il punto in cui viene
richiamata la 2� messagebox(la messagebox di congratulazioni)(nel mio caso l'indirizzo �
401038) n.b. la funzione di visualizzazione della msgbox inizia con un push 20, ed �
questo l'indirizzo da annotare. ora non ci resta che modificate l'istruzione all'indirizzo
401242 da jnz xxxxxxxx a jmp 401038 in modo che dopo aver controllato il primo carattere
salti direttamente alla msgbox, saltando tutti i controlli sul codice.
per modificare il jump fate cos�:
premete il pulsante di register per entrare in softice, uscite dalle chiamate di
getwindowtexta e poi scrivete:
a cs:401242 (ricordate questo indirizzo?)
premete invio
jmp 401038
invio 2 volte
fatto!!!
n.b. se attivate il codice (code on) notate che all'indirizzo in cui andate a modificare
il jump c'� scritto questo: 0F85C9000000 (6 byte) che � il codice in linguaggio macchina
di jnz xxxxxxxx se poi modificate la jump come vi ho detto, i valori diventano:
E9F1000000(5 byte)
cos� facendo, un byte non viene modificato e questo cambia l'istruzione successiva a
quella modificata. In questo caso non ha importanza dato che l'istruzione dopo la jmp
modificata non viene mai eseguita, ma sarebbe meglio noppare anche l'ultimo byte. Quindi
quando andiamo a modificare la jnz xxxxxxxxx scriviamo questo:
a cs:401242
e premete invio
jmp 401038
invio
nop
invio
fatto!!!
seriale e keygenerator:
da quello che ho capito � impossibile trovare entrambi poich� se osservate la 2nda
funzione di verifica del codice nella call sopra descritta, dove ci sono gli asterischi,
quella istruzione rende impossibile trovare il serial.... provate a capire il perch�
spero abbiate capito...
BlackDruiD
|
Allora... siamo finalmente giunti alla fine di questo tutorial...
Come avete potuto notare la protezione � molto semplice (dopo tutto � la prima
lezione...); comunque se non avete capito i casi sono 2:
1-Il mio tutorial fa cagare....
2- Non sapete un cazzo di reversing e siete delle capre fottute.
spero per voi che il vostro caso sial il primo....altrimenti...b�, auguri....
Un saluto a tutti imembri di #crack-it
xerhod,xOA,WhiteFly,Yado,[alt255],
neural_noise,^courier,Ritz,Tin_Man,Furb3t,^Inx,NCG,Tb3nr, Quequero ecc...
spero di non aver dimenticato nessuno altrimenti.... ditemi pure che sono un bastardo :)))
Disclaimer |
Home
Anonimato Assembly
ContactMe CrackMe Links
NewBies News Forum Lezioni
Tools Tutorial