|
Soluzione corso 11 per newbies |
||
|
Data |
by Artemis |
|
|
2 Marzo 2003 (o 1997??? :) |
Published by Quequero |
|
|
|
:) |
Se l'amore è amore... |
|
«~{Å}~» |
|
«~{Å}~» |
|
Difficoltà |
(x)NewBies ( )Intermedio ( )Avanzato ( )Master |
|
E' un semplicissimo (forse troppo) crack me e non ci vuole molto per risolverlo, credetemi.
|
Introduzione |
|
Tools usati |
|
URL o FTP del programma |
|
Notizie sul programma |
|
Essay |
Appena lo apriamo, nella winmain notiamo qualcosa di sospetto:
push ebx
push esi
push edi
push offset unk_407568 <- Ove pone i dati
call GetSystemTime
chiama GetSystemTime, cioè prende la data, l'orario e i millisecondi, e li posiziona, qui all'indirizzo 407568 (guardate l'indicazione).
Dopo di ché, proseguendo troviamo un primo trick:
push 0
push 4000000h
push 0
push 0
push 0
push 0
push offset a_Siwvid ; "\\\\.\\siwvid"
call CreateFileA
cmp eax, 0FFFFFFFFh
jnz short loc_401070
or   byte_407580, 10h
questo per chi non lo sapesse, si chiama Meltice, cioè chiama l'API CreateFileA e gli passa il nome di un vxd del SoftIce (siwvid) e anche il parametro:
FILE_FLAG_DELETE_ON_CLOSE
quindi se SoftIce è caricato, la flag FILE_FLAG_DELETE_ON_CLOSE specifica che il VxD viene scaricato quando l'handle ritornato dalla CreateFile viene chiuso. Questo trick equivale a scrivere:
cmp eax, -1
jnz sice_loaded
cioè se il driver non è caricato (quindi winice non è caricato) il programma sa che non stiamo usando SoftIce, ed esegue un OR 10h del byte che sta a 00407580. Essendo di default a 0 la locazione quando il proggy esegue or 10h, diventa 10h :)
Da ora in poi quella locazione la chiameremo Key, perché in effetti sarà la nostra chiave. Proseguiamo...
A questo punto inizia la solita parte di decodifica dei messaggi che non porta a nessuna parte... ma abbiamo tralasciato una cosa... la nostra applicazione è stata creata con CreateDialogParamA, come vedrete sicuramente prima del MeltIce:
push 0
push offset unk_4010C0
push 0
push 65h
push esi
mov dword_40757C, eax
call CreateDialogParamA
e la sua bella winmain sta a 4010C0... andiamoci!
loc_4010C0:
mov eax, [esp+8]
sub esp, 10h
cmp eax, 110h <- Nota che 110h = WM_INITDIALOG
push ebx
push ebp
push esi
push edi
ja loc_40117F <- WM_COMMAND o WM_SYSCOMMAND?
jz short loc_40111B <- Is WM_INITDIALOG?
sub eax, 0Fh <- WM_COMMAND diventa WM_CHAR (se nn erro)
jz loc_40119E
dec eax
jz loc_40128E
Qui troviamo il vero riconoscimento dei messaggi, quindi proseguiamo con l'ispezione indirizzo per indirizzo. Vediamo a quel ja cosa succede:
add eax, 0FFFFFEEFh
cmp eax, 0F1h
ja loc_4010E8
xor ecx, ecx
mov cl, byte ptr ds:unk_401334[eax]
jmp ds:off_401320[ecx*4]
succede qualcosa di interessante! Viene sommato quel numerone ad eax, e viene confrontato eax con 0F1h. Ovviamente 0F1h è più piccolo, quindi il ja (salta se il primo è maggiore del secondo) salta qui:
lea ecx, [esp+2Ch]
loc_40110F:
push ecx
push 0F003Fh
push 0
push offset aUic ; "UIC"
push 80000001h
call ds:RegOpenKeyExA
test eax, eax
jnz short loc_40110F
or byte_407580, 2
xor eax, eax
pop edi
pop esi
pop ebp
pop ebx
add esp, 10h
retn 10h
Beh... si capisce da solo il codice. Verifica se nel registro di windows, sotto la voce HKEY_CURRENT_USER (rappresentata dal parametro 80000001h) ci sia la chiave UIC. Se c'è allora esegue un Or 2 della nostra key, sennò esce saltando a 40110Fh. Noi creiamo questa chiave, ed ecco accontentato ancora il programma. Ora eravamo rimasti che la key era 10h.
10h or 2 = 12h
Analizziamo il jump seguente della winmain di prima, cioè quando il programma viene avviato, e quindi viene inviato il comando WM_INITDIALOG.
loc_40111B:
cmp word_407568, 7CDh
jnz short loc_40112D
or byte_407580, 1
Ecco un altro passo importante. Vi ricordate dove all'inizio aveva salvato la data, l'orario e i millisecondi il proggy all'inizio? Bene, ora controlla nella locazione 407568, se c'è il valore 7DCh, che in decimale è 1997.
Se non sono uguali se ne va, altrimenti fa un'altra operazione sulla nostra key. Che aspettate??? Spostate sta data al 1997!
12h or 1 = 13h
e poi il programma continua a scendere e troviamo una call:
sub_401440 proc near
push 0
locret_401469:
sub_401440 endp
push 80h
push 3
push 0
push 0
push 80000000h
push offset aCGeddon_uic ; "c:\\geddon.uic"
call ds:CreateFileA
cmp eax, 0FFFFFFFFh
jz short locret_401469
or byte ptr word_407580, 8
retn
qui è semplice verifica se su C:\ c'è il file geddon.uic, se non c'è esce, altrimenti cambia la nostra key:
13h or 8 = 1Bh
Altro jmp e arriviamo a scorrere una lista di API, tipo InvalidateRect, che riguardano la finestra... scendendo sotto troviamo:
push esi
call ds:IsZoomed
test eax, eax
jz loc_40110F
or byte_407580, 4
xor eax, eax
ve lo devo spiegare??? Si? E che caspita... vabbè verifica se la finestra è ingrandita. Se non lo è esce, se lo è esegue l'or della nostra key. Quindi ingrandite la finestra e la key diventa:
1Bh or 4 = 1Fh
usciamo e analizziamo l'ultimo jmp... ah no... l'ultimo jump porta solo al PostQuitMessage. Cosa rimane? Beh... a questo punto il proggy funonzia alla grande :)
|
Note finali |
Un enorme ringraziamento va a DIO, Gesù, la Madonna, tutti i santi e il cielo in generale (non è una bestemmia idioti! Sono molto religioso!) perché mi accompagnano da quando sono nato e il saluto va anche a tutti i dardi della UIC, a Et4Dr4c0n e ai sostenitori dei miei progetti :))
|
Disclaimer |
Andiaaaamo... anche per i crackme il disclaimer??? :PPP