Fant0m Crackmes |
||
Data |
by "Evilcry" |
|
28/07/2002 |
Published by Quequero |
|
|
Grazie tante evil, questo e' il tuo primo tute se non sbaglio :) |
|
.... |
|
.... |
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. :-)
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
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 ;))))