Fant0m Crackmes
Reversiamoli tutti e cinque+Autokeygen

Data

by "Evilcry"

 

28/07/2002

UIC's Home Page

Published by Quequero


Grazie tante evil, questo e' il tuo primo tute se non sbaglio :)

 

....

Home page se presente: www.evilcry.cjb.net
E-mail: [email protected]
Nick, UIN, canale IRC/EFnet frequentato   irc.azzurra.it   #crack-it
 

....

Difficoltà

(x)NewBies ()Intermedio ( )Avanzato ( )Master

 

Ciao a tutti,questo è il mio primo tute per la UIC, quindi perdonate tutti gli errori che ci potrebbero essere. :-)

 


Fant0m crackmes
reversiamoli tutti e cinque!
Written by Evilcry.

Introduzione

Non avendo niente da fare, ho iniziato a reversare questi cinque crackmes, che potrebbero essere interessanti per i Newbies che si avvicinano al mondo del reversing

Tools usati

-SoftIce
-Win32dsasm
-Un HexEditor

URL o FTP del programma

www.evilcry.da.ru

www.fant0m.cjb.net

Notizie sul programma

Si tratta di cinque semplici crackmes più uno riassuntivo.

Essay

Crackme1 (trovare il serial)

Bene!, partiamo con il primo (ihih e da che sennò:P). Per risolverlo ci serivà soltanto il Win32Dasm. Adesso andate a vedere le "String References" e guardate un pò....Non notate anche voi quella stringa particolare??, mi riferisco a m0tNaF-EmKCARc mmh a me puzza. Proviamo a metterla nell' edit box del nostro crackme (Rispettate le maiuscole e le minuscole!), e come per magia ci apparirà la "congratulation box". Che lamerata non trovate??? :-)

 

Crackme2(rimozione di 2 nag-screen)

 

Dopo aver avviato il secondo crackme si presentano 2 noiose nag screen, eliminiamole!. Per prima cosa disassembliamo il programma ed andiamo a vedere le string references, nelle quali troveremo la stringa NAG NAG NAG mmh interessante, andiamo a vedere la parte di codice relativa a questa reference:

 

004010D0 push 00000030 ------ Primo parametro per la MessageBox

 

*Possible StringData Ref from Data Obj ->"Remove me!"

 

004010D2 push 00403033 -----Altro parametro relativo a MessageBox

 

*Possible StringData Ref from Data Obj ->"Nag Nag Nag..."

 

004010D7 push 0040303E ------Ultimo argomento passato alla nostra call

 

004010DC push 00000000 * Reference To: USER32.MessageBoxA

 

004010DE E8C5010000 Call 004012A8 -------Questa è la call da noppare

 

Tutto quello che dobbiamo fare è noppare i bytes relativi alla Call che ci interressa, cioè E8C501000. Segnamoci l' OFFSET (4DEh) ed aprimamo l' exe con un hex editor . Sovrascrivete i bytes relativi

alla call (solo quelli relativi alla Call!!) con dei nop (OPCODE 90). Faccte ripartire il programma e.....

niente Nag!. Ci sarebbe un altra nag da eliminare ma questa volta non vi dirò niente, il procedimento lo sapete già :-).

Crackme3(Cd-Check)

 

Eccoci arrivati al terzo crackme, questa volta dovremo fargli credere che ci sia il Cd originale. Ah dimenticavo, questo tipo di protezione è rarissima da trovare in un programma commerciale data la sua semplicità :-(. Per prima cosa disassembliamolo ed andiamo a vedere cosa troviamo nella IT (Import Table) in pratica qui vediamo tutte le API che importa il programma.Tra le quali c'è ne una interessante GetDriveType, di seguito vi riporto le sue references.

 

GetDriveType(lpRootPathName );

 

Parametro: lpRootPathName

punta ad una stringa NULL terminated che specifica la root directory del disco, per poi ritornare delle informazioni su di esso.Se lpRootPathName è NULL la funzione ci torna delle informazioni riguardanti la directory corrente.

 

Valori di ritorno:

0 ---->Non può essere determinato il tipo di drive.

1 ---->La root directory non esiste.

2 ---->Il disco può essere rimosso dal drive.

3 ---->Il disco non può essere rimosso dal drive.

4 ---->Il drive si trova su una macchina remota.

5 ---->Il tipo di drive è un Cd-Rom drive. (Quello che ci interessa a noi ihihih)

6 ----->Il tipo di drive è una RAM.

 

Adesso analizziamo il codice relativo a quasta API:

 

* Referenced by a CALL at Address:

0040115E

 

004011F7 push ebp

 

004011F8 mov ebp, esp

 

004011FA push 00000000 -----Qui viene passato il parametro relativo alla nostra API

 

* Reference To: KERNEL32.GetDriveTypeA, Ord:00F0h

 

004011FC Call 0040129A -----Chiamata a GetDriveType

 

00401201 cmp eax, 00000005 Quello rilevato è un CD???

 

00401204 je 0040121D ----Se sono uguali salta alla Congratulation Box

 

00401206 6A30 push 00000030

 

Avete capito tutto? ora ci resta che trasformare quel JE (OFFSET 0604h) in JNE (OPCODE 75). Che dirvi! più semplice di cosi :-)))).

 

Crackme4(Name+Serial)

 

Personalmente rintengo che questo crackme sia un utilissimo esercizio per l' aspirante cracker/reverser, quindi attenzione!. Apriamo il programmillo ed inseriamo un nome ed un serial a caso,

io ho inserito: Nome:evilcry Serial:123456. Bien! ora settiamo i canonici BPX GetDlgItemTextA e BPX

GetWindowTextA, quindi F5 e clicchiamo su Check .......come per magia :P siamo dentro Sice, scorriamo di processo con F12 fino ad arrivare a quello del crackme. Vi assicuro che la routine è semplicissima NON NE TROVERETE DI PIU' Facili :-). Analizziamo il codice insieme:

 

00401205 push 00000100

 

0040120A push 00403084 -------Buffer che punta alla edit box del Name

 

Possible Reference to Dialog: MAINDIALOG

 

0040120F push 000003E8

 

00401214 push [ebp+08]

 

Reference To: USER32.GetDlgItemTextA

 

00401217 Call 0040137E --------Qui viene preso il nome

 

0040121C push 00000100

 

00401221 push 00403184 -------Buffer che punta alla edit box del Serial

 

Possible Reference to Dialog: MAINDIALOG

 

00401226 push 000003E9

 

0040122B push [ebp+08]

 

Reference To: USER32.GetDlgItemTextA,

 

0040122E Call 0040137E ------Qui viene preso il serial

 

00401233 push [ebp+08]

 

Questo pezzo di codice non fa altro che prendere il Name ed il Serial che abbiamo inserito.Se fate

d 00403084 vedrete il nome che avete inserito e d 00403184 il vostro serial. Andiamo adesso a vedere

la call (00401236) che calcola il serial in base al nome inserito, quando ci arrivate di sopra premete F8, cosi entrerete nella routine vera e propria.

 

00401236 call 004012F9 Routine per il calcolo del serial

 

0040123B cmp eax, 00000000

 

0040123E je 00401255 Sono uguali? se NO salta al messagio di errore

 

Il codice che seguente è quello relativo alla Call che calcola il serial:

 

Referenced by a CALL at Address:

004012F9 push ebp ------- |Creazione di nuovo stack per questa Call

004012FA mov ebp, esp --- |Nuovo stack

004012FC push esi

004012FD push edi

004012FE lea esi, dword ptr [00403084] -----Viene caricato in ESI l' indirizzo relativo al Name

00401304 lea edi, dword ptr [00403284] ----Viene messo in EDI l' indirizzo del Serial messo da noi

0040130A xor eax, eax -------Si prepara alla routine :-)) in pratica viene azzerato EAX

0040130C xor ecx, ecx ------Idem!, azzeramento di ECX

0040130E mov bl,1A ------Viene messo in bl il numero 1A

00401310 cmp byte ptr [esi], 00 ------Verifica se il Name è finito

00401313 je 0040132A ---------Se è finito salta , altrimenti va alla prossima istruzione

00401315 mov al, byte ptr [esi] --------Sposta in al un char del Name

00401317 add al, cl ----------Somma il char a cl

00401319 xor al, cl --------Adesso lo xora per cl

0040131B div bl ---------Ora lo divide per bl cioè 1A, Ricordate??

0040131D shr ax, 08 ---------Shift a destra di 8

00401321 add al, 41 --------Somma al nostro char la cifra 41

00401323 mov byte ptr [edi], al ----Sposta il char manipolato in EDI, tenetelo d' occhio dato che qui si verrà a formare il serial---> sarebbe meglio dire la locazione puntata da EDI :)

00401325 inc edi -----Incrementa EDI (il registro dove avremo il serial)

00401326 inc esi ------Incrementa ESI, cioè passa al prossimo char da manipolare

00401327 inc ecx Incrementa ECX che funge da contatore

00401328 jmp 00401310 ------Salta a 00401310 per poter manipolare il prossimo char

 

Bene! questa è la routine che calcola il seriale, avete visto che era semplice!, basta tenere d' occhio il registro EDI e vedrete formarsi il serial carattere dopo carattere :-))). Il serial che ho ricavato dal mio nick (evilcry) è XOBEVKR. Provate a fare anche un keygen.

Autokeygenerator

Qualcuno disse "Che il fa reverser/cracker se non si complica la vita??:P", io fedelmente seguirò questo postulato ihihi. Dato che il Crackme4 è tanto scemo :-), perchè non dargli un tocco di originalità(si fa per dire :P)???. Cercheremo di trasformarlo in un Autokeygenerator, cioè faremo comparire nella message box d' errore il serial esatto hihih. Innanzitutto dobbiamo cercare il registro o la locazione di memoria dove abbiamo il serial corretto, e noi già lo sappiamo :-) se vi ricordate la routine che abbiamo visto poch' anzi, EDI puntava alla locazione 00403284 in cui si trova il nostro bel seriale. Ora mettermo questa locazione in un punto preciso della msgbox d' errore.Per comodità vi riporto le referenze dell' API MessageBoxA:

 

int MessageBox(

HWND hWnd, // handle della owner window

LPCTSTR lpText, // indirizzo del testo della messagebox. Questa ci interessa!!!

LPCTSTR lpCaption, // indirizzo del titolo della messagebox

UINT uType // stile della messagebox )

 

Disassembliamo nuovamente il programma, ed andiamo a cercare la msgbox d' errore:

 

:00401255 push 00000030

* Possible StringData Ref from Data Obj ->"Check Serial"

:00401257 push 00403029

* Possible StringData Ref from Data Obj ->"Wrong Serial! Keep trying, you'll " ->"get it!"

:0040125C 6836304000 push 00403036 Eccolo!!! Questo è il parametro che passa il testo

:00401261 push 00000000

* Reference To: USER32.MessageBoxA

:00401263 Call 0040139C

 

Bene! segnatevi l' offset del penultimo Push, ed apritelo con un Editor esadecimale. Adesso andate all' offset che vi eravate segnati, come non ve lo ricordate??? mah... ve lo dico io 65Ch :-), e sostituite i bytes relativi al push con questi bytes: 6884324000. Fate ripartire.... mettete un Name/Serial ad muzzum.....

tadàà! il vs serial il bella vista:-).

 

Qualcuno adesso si potrebbe chiedere, come ha fatto a trovarsi quei bytes??? la risposta è semplice

sono andato in cerca di un push 00403284 e me li sono segnati :-). Siamo stati abbastanza fortunati, ma non pensate che sia tutto cosi semplice, spesso dovrete "dirottare" dei Jump in locazioni vuote (grazie valori di allineamento! hihihihihi) dove è possibile inserire del codice, e li dentro dovrete mettere il codice fatto da voi.

 

Spero di essere stato d' aiuto ai newbies, se avete qualche dubbio o non avete capito qualche cosa, non esitate a scrivermi. Il quinto crackme non è altro che un programma riassuntivo.Se non avete avuto problemi con i precedenti non ci saranno problemi neanche con questo :-))).

 

Note finali

In fine colgo l' occasione per salutare: Quequero, AndreaGeddon, [Evil], e4m, Slash, Quake2^AM, Albe,BIGAlex, Ntoskrnl, CityHunter, CyberPK.

Disclaimer

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly (Sisi!ci credo :P).

Capitoooooooo????? Bhè credo di si ;))))