Zoom Icon

Corso UIC Avanzato 01 BlackDruid

From UIC Archive

Corso UIC Avanzato 01 BlackDruid

Contents


Corso UIC Avanzato 01 BlackDruid
Author: BlackDruid
Email: [email protected]
Website: http://members.xoom.it/fontana
Date: 28/08/1999 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Flag Italian.gif
Comments: BlackDruiD, 41339898, #crack-it



Tools


Link e Riferimenti

Questo è il Corsi UIC Avanzati n°01 disponibile alla pagina Corsi per Studenti


Introduzione

Frase: Don't try this at home...it's dangerous | The road to hell is full of good intentions...
Inizierò tra breve a descrivere il metodo usato per patchare il programma scritto da Quequero per la lezione N°1 del corso. Il prog deve essere modificato usando solamente SoftIce

Commento: 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 :)


Notizie sul Programma

Cracking della lezione N°1

Questo programma è composto solamente da una form di registrazione nella quale inserire nome e serial

  • Tecnica usata: Cxxo sfacciato (scherzo hehehe)


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 // Chiamata all'API

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 correttò 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


Note Finali

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 caxxo di reversing e dovete studiare di più.

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

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.