Soluzione corso 11 per newbies
usando IDA (come richiesto dal geddon :)

Data

by Artemis

 

2 Marzo 2003 (o 1997??? :)

UIC's Home Page

Published by Quequero


Se l'amore è amore...

:)

Se l'amore è amore...

«~{Å}~»

Home page: http://artemislab.da.ru
E-mail: atlantys@freemail.it
Artemis23 su Ircnet nei canali #scorza, #hackeritaly, ICQ: 27580498

«~{Å}~»

Difficoltà

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

 

E' un semplicissimo (forse troppo) crack me e non ci vuole molto per risolverlo, credetemi.


Corso 11 per Newbies
Risolvere il crackme con IDA Pro 4.04
Written by Artemis

Introduzione

All'apertura presenta una schemata con un solo pulsante (Check...) è vietato patcharlo e usare Wdasm, ma solo IDA... beh devo dire che ho faticato tanto... si... a trovare una versione di IDA non DEMO, ma nisba, quindi mi ero già seccato di vedermi chiudere il programma 50 volte... comunque analizziamolo va :)

Tools usati

Ida Pro 4.04 che trovate nella sezione tools di questo sito oppure nella sezione download del mio sito (l'indirizzo è all'inizio della pagina sulla mascherina).

URL o FTP del programma

Lo potete trovare nella sezione lezioni di questo sito, è il crackme 11 della sezione newbies.

Notizie sul programma

E' un semplice e umile crackme :)

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]
       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

loc_40110F:
       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
       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

locret_401469:
       retn

sub_401440 endp

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

                                                                                                                 bye by Artemis

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