Reversare il bleem1.0
PREMESSA
LE INFORMAZIONI CHE TROVATE ALL'INTERNO DI QUESTO FILE SONO PER PURO SCOPO DIDATTICO. L'AUTORE NON INCORAGGIA CHI VOLESSE UTILIZZARLO PER SCOPI ILLEGALI.
DIFFICOLTA'
scala : *=Novizio, **=Apprendista, ***=Esperto, ****=Guru
target: **1/2
TOOLS USATI
* Sice 3.8x/4.x
* HIEW 6.10
* Adump
* UltraEdit32
* Cd-key del bleem o il crack di pedro che ne emula la funzione
INTRODUZIONE
Ciao a tutti questo e' il mio primo tutorial cosi non aspettatevi pure grandi cose :). Molti di voi riterranno probabilmente il Bleem e tutto quello che si e' detto sulla difficolata di fare il reverse di questo programma (avevo addiritura letto 'incraccabile' da qualche parte),ma noi non siamo tipi che si arrendono e piu' e' difficile il target e piu' la cosa si fa' interessante o no ? E allora iniziamo...
LET'S GO :p
La Versione che affronteremo e' la 1.0 (lo so che l'hanno gia craccata ,Hi xOANON,e che addirittura c'e gia' il patch per l'1.4 , ma a noi non importa vero?
Dunque scaricato il programma target nella versione 1.0 appunto lo lanciamo e ci accorgiamo subito di come simpaticamente ci avvisi di inserire il cd-key bene lo mettiamo (per questo tut potete usare anche il crack di pedro che emula il cd key se non lo avete.),e il bleem ammettendo che non avete in sice caricato parte allegramente. Se avete il sice invece una nuova finestra vi comunichera' come il bleem non sia nato per funzionare con un system debugger e vi chiede gentilemnte di disabilitarlo.
Bene ora visto cosi sembrerebbe che il nostro programma controlli se c'e il cd-key , se c'e prosegue e controlla che non ci siano debugger se anche questo e' ok avvia al programma. Deduzizione logica del reverser ... elimino il check del cd-key tolgo (se mi frega) il controllo del sice e voila' il crack e' fatto... beh' direi che il nostro target e' un po' piu' complesso,in effetti le due cose sono da fa' ma' prima c'e un po' di lavoro e ora vi spiego il perche'.
Dunque il bleem cerca il cd-key perche da li capisce non solo che e' ovviamente stato acquistato , ma ne ricava anche delle 'chiavi' per meglio spiegarsi sono dei 'valori' che gli serviranno per decriptare la zona di codice protetta che e' poi la zona in cui risiede il codice del programma vero e propio. Quindi quello che noi dovremo fare e' questo :
A : levare i controlli del Debugger
B : fare decriptare il codice criptato per poi dumparlo su disco
C : appendere il codice decriptato all'eseguibile del bleem
E : modificare il PE dell'eseguibile del bleem agg. la nuova sezione
F : modificare il codice perche continui anche se non trova il cd-key
G : modificare/eliminare la routine di decript
H : modificare il codice per fargli copiare la nostra nuova sezione nella zona in cui il bleem avrebbe messo appunto il codice decriptato
I : giocare con il bleem senza dover inserire il nioso cd-key ;)
Lanciamo il nostro fidato A-dump che rimarra' li' per tutto il periodo del nostro crack , leggiamo l'indirizzo della memoria shared che adump gentilmente ci ha riservato inserendo R , dovrebbe essere qualcosa del tipo :
STARTOFFS: 0x83D60000 - questa e' l'inizio della memoria shared.
ENDOFFS: 0x83E54240
LIMIT: 0xF4240 (1000000 )
CUROFFS: 0x83D60000
MAPFN: C:\WINDOWS\TEMP\ADump.log
MAPFSIZE: 0xF4240 - dimensione della memoria sufficiente per il nostro target.
ANFILTER: A..Z,a..z,0..9
Ok,apriamo quindi l'eseguibile con il Symbol loader di Sice e cominciamo a 'steppare' all'interno del codice con F10 (ah, mi raccomando o il cd-key o il crack di pedro devono esserci) dunque ci troveremo difronte a questo codice :
401000 jmp 401021
... omissis
40103f call 4010a0 - Routine di controllo del cd-key
401044 jnz 40104f - Non c'e il cd allora salta a 'Please insert cd-key'
401046 pushfd
401047 push cs
401048 call 401160 - Ruotine di inizio bleem
40104d jnz 40108b - se c'e qualcosa che non va' qui te lo segnala : ex : debugger found
...
...
Esce dal Bleem.
Con qualche prova veloce potete rendervi conto anche voi di come agisca il bleem ex: mettendo il cd-key e controllando i risultati dopo le call e poi togliendolo. Fatto cio' ci addentriamo nella seconda , essendo inutile ai nostri scopi (almeno per ora) cambiare il risultato della prima.
Bene tracciamo la seconda call F8 per vedere cosa succede al suo interno, quindi con il cd-key sempre inserito proseguiamo nel codice sino a :
4011d9 lea edx,[eax+00069360]
4011df add edx,00002a2a
4011e5 call edx - Salta alla nuova locazione dove ha copiato una parte di codice del bleem.-
Bene ora dobbiamo vedere cosa si prepara a fare nella nuova zona di memoria dove salta con call edx quindi nuovamente tracciamo la call con F8 e scendiamo nel codice nuovamente sino al punto chiamiamolo pure 'critico'.
83xxxxd8 call 83xxxx9c
83xxxxdd jnz 83xxxx3b - 1 richiamo all'indirizzo 83xxxx3b che
pero' non abbiene infacci sice ci dice NO JUMP
83xxxxdf call 83xxxx68 - Routine di check del sice
83xxxxe4 jz 83xxxx3b - 2 richiamo questa volta con esito positivo infatti sice
ci dice JUMP , ed essendo quella sopra la routine di
check del sice dopo questo salto ci apparira' il bel
messaggio del Dubugger Found.
83xxxxe6 call 83xxxx5c
83xxxxeb jnz 83xxxx3b - 3 richiamo pero' con esito negativo Sice : NO JUMP
83xxxxed call 83xxxxf2 - Altra Routine di check di Sice
83xxxxf2 jnz 83xxxx3b - 4 richiamo esito positivo Sice : JUMP
83xxxxf4 call 83xxxx64
83xxxxf9 jnz 83xxxx3b - 5 richiamo esito negativo Sice : NO JUMP
83xxxxfb call 83xxxxdc
83xxxx00 call 83xxxxfe
83xxxx05 call 83xxxxad
83xxxx0a call 83xxxxe6 - Altro Controllo sul Sice/cd-key
83xxxx0f jnz 83xxxx36 - Esito positivo Sice : JUMP messaggio insert Cd-key
83xxxx11 call 83xxxx51 - Qui il bleem nel caso in cui c'e il debugger non arriva
perche salta a 83xxxx36 ma se noi invertiamo il risultato
del jnz allora a 83xxxx51 il programma esegue una
routine che inchioda il pc.
83xxxx16 call 83xxxx08
83xxxx1b jz 83xxxx36 - Esito negativo Sice : NO JUMP
...
83xxxx2c call xxx tutto ok Il bleem parte.
...
83xxxx36
83xxxx3b
...
...
Allora esaminando cosa accade in questa parte di codice ci si rende conto come il bleem faccia piu' controlli sulla presenza di un debugger che devono essere evitati (anche se non indispensabile ma utile) quindi procediamo a 'noppare' i jnz che danno il risultato positivo (Sice : JUMP) compreso quello che al posto di saltare a 83xxxx3b salta a 83xxxx36 , ma attenzione se si esegui la call che c'e dopo questo jnz il pc si blocca a causa di una routine cattivella scritta da randy allora ad un'analisi della call ci si accorge come possa anche venire levata indi ragion percui (eheh..:D) noppiamo pure lei (ciapa li' ;D).
Bene bene, la prima parte della nostra fatica e' andata bene ora passiamo a capire dove il bleem decripta il codice che a noi occorre per fare il nostro crack. La parte di codice che ci interessa sta' propio al termine dei controlli del Sice nella parte di codice che segue :
83xxxxf4 call 83xxxx64 - Prepara la zona di memoria per il decript ind. zona
di mem in Edi
83xxxxf9 jnz 83xxxx3b - qualcosa e' andato storto? esito negativo
Sice : NO JUMP
83xxxxfb call 83xxxxdc
83xxxx00 call 83xxxxfe
83xxxx05 call 83xxxxad
83xxxx0a call 83xxxxe6 - Esegue il decript + controllo.In Edi ora si puo'
leggere la fine dei dati di decriptati.
83xxxx0f jnz 83xxxx36 - L'Esito del controllo e' positivo Sice : JUMP >
messaggio insert Cd-key
83xxxx11 call 83xxxx51 - Qui il bleem nel caso in cui trova qualcosa che non va'
non arriva perche salta a 83xxxx36 ma se noi invertiamo
il risultato del jnz allora a 83xxxx51 il programma
esegue una routine che inchioda il pc.
83xxxx16 call 83xxxx08
83xxxx1b jz 83xxxx36 - Esito negativo Sice : NO JUMP
...
83xxxx2c call xxx tutto ok Il bleem parte.
...
83xxxx36
83xxxx3b
...
...
Allora a 83xxxxf4 il bleem esegue una call 83xxxx64 dove prepara la zona di memoria dove decriptare il codice,quando ritorna dalla call se tutto e' andato bene non saltera' a 83xxxx3b e proseguira'.In Edi si puo' leggere infatti l'inizio della locazione di memoria in cui avverra' il decript nel mio caso EDI = 660000. Quindi a questo punto un bel D edi non ce lo leva nessuno,guardiamo quindi cosa c'e in questa locazione di memoria e proseguiamo attenti. Tracciando ancora ci accorgiamo come nella call seguenti nella zona di memoria 660000 non accada nulla sino a 83xxxx0a dove il programma scrive dei dati propio li' e al ritorno dalla call in Edi si potra' leggere la fine dei dati decriptati nel mio caso Edi = 6c0b00 se si prosegue il bleem parte felice. Dunque siamo arrivati a capire che dopo la call 83xxxxe6 il programma ha messo i dati decriptati a 660000 e se tutto va bene eseguira' il bleem,noi allora appeno dopo questa call precisamente sul jnz 83xxxx36 siamo al momento piu' opportuno per copiare questa zona di memoria nella memoria shared riservataci da a-dump ricordate?
Calcoliamo quanto dobbiamo copiare 6c0b00-660000=60b00 arrotondiamo e copiamo 61000.
Procediamo : M 016f:660000 L 610000 0x83D60000
Bene ora i dati decriptati sono al sicuro usciamo dal sice e andimo in a-dump dove provvederemo a scriverli su disco con
W yado.bin 61000
Abbiamo cosi i dati sull'HD con il nome yado.bin. Passimo ora alla seconda dobbiamo attaccare all'eseguibile il fine .bin per fare questo io ho usato UltraEdit32 ma potete usare anche un altro edir esadeciamle , quello insomma che conoscete meglio. Vedrete che il file verra' appeso all'offset 6c500 , salvate il nuovo file e addentriamoci nella modifica del PE. Io solitamente uso Hiew , ma anche qui' vale lo stesso discorso di prima,quindi possiamo a modificare la quantita' di sezioni che vediamo era inpostata a 5 ne aggiungiamo 1 quindi 6.
e ancora : la dimensione del file che ora e' cresciuto, un breve calcolo : vecchia image size = 11000 nuova sez 61000 = 72000.
Aggiungiamo alla fine delle sezioni presenti , precisamente dopo la .reloc la nostra nuova sezione nel mio caso .yado definiamone le varie parti V.Size 61000
V.Off 11100 RawSize 61000 RawOff 6c500
Char : C0000040.
Non sto' qui a dilungarmi su il perche e come si fa' propio perche questo non e' un tutorial sul PE,ma se avete dei problemi a capire questa parte , non contando il fatto che l'ho scritta male io, vi consiglio di leggere i tutorial di Kill3xx sull'argomento,dopo il tutto vi sara' piu' chiaro.
PE modificato,uff che faticaccia ci rimane ancora na' cosa poco felice , c'e da modificare il bleem in modo che usi il nostro codice decriptato non ci decripty sopra nulla e non faccia il check del cd-key.Dunque per facilitare la cosa da ora parlero' in offset del file aperto con hiew. La cosa da fare e' innanzi tutto e' impedire che il bleem ci dica di inserire il cd-key ricordate che all'inizio ne avevamo parlato :
40103f call 4010a0 - Routine di controllo del cd-key
401044 jnz 40104f - Non c'e il cd allora salta a 'Please insert cd-key'
bene un bel nop sul jnz fa' al caso nostro e anche se non c'e il cd-key ora tutto prosegue liscio,ora non ci importa piu' di leggere le chiavi di decript
dal cd o no?
Poi tracciando come si comporta il bleem vediamo che all'offset : 69919 / 69923 /6992d ci sono tre Jxx che a causa della mancanza del cd-key non escono piu' dal loop quindi non ci resta che noppare anche loro.
Dobbiamo cercare adesso un punto valido dove inserire la routine di copia in modo da far mettere al bleem i nostri dati al momento giusto nella zona 660000.
Ricordate :
83xxxxed call 83xxxxf2 - Altra Routine di check di Sice
83xxxxf2 jnz 83xxxx3b - 4 richiamo esito positivo Sice : JUMP
83xxxxf4 call 83xxxx64
83xxxxf9 jnz 83xxxx3b - 5 richiamo esito negativo Sice : NO JUMP
83xxxxfb call 83xxxxdc
83xxxx00 call 83xxxxfe
83xxxx05 call 83xxxxad
83xxxx0a call 83xxxxe6 - Altro Controllo sul Sice/cd-key
83xxxx0f jnz 83xxxx36 - Esito positivo Sice : JUMP messaggio insert Cd-key
83xxxx11 call 83xxxx51 - Qui il bleem nel caso in cui c'e il debugger non arriva
perche' salta a 83xxxx36 ma se noi invertiamo il risultato
del jnz allora a 83xxxx51 il programma esegue una routine
che inchioda il pc.
83xxxx16 call 83xxxx08
83xxxx1b jz 83xxxx36 - Esito negativo Sice : NO JUMP
...
83xxxx2c call xxx tutto ok Il bleem parte.
...
83xxxx36
83xxxx3b
...
...
dentro alla call che esegue il check del sice (che potrebbe anche essere saltata a pie' pari noppandola) troviamo posto per inserire la nostra routine cosi all' offset 694f2 che poi e' l' inizio della call
83xxxxed call 83xxxxf2 - Altra Routine di check di Sice
poniamo ul bel ret in modo che non venga nemmeno eseguita subito dopo all'offset 694f3 mettiamo la nostra routine di copia :
mov [esp][48],eax : salviamo cio' che serve
mov [esp][44],eax
mov esi,411100 : indirizzo da dove prendere i dati
mov ecx,60b00 : quantita' di byte da copiare , ricordare 6c0b00-
660000=60b00
rep movsb : EDI = Destinazione(660000) , ESI = Sorgente copia e ripeti
fino al termine dei byte ecx = counter
ret : :)
Ora ci occorre un punto in cui richiamare la routine di copia e dove farlo se non dopo che il bleem ha ci ha preparato la pagina valida quindi :
83xxxxf4 call 83xxxx64 - Prepara la zona di memoria per il decript ind. zona di mem in Edi
83xxxxf9 jnz 83xxxx3b - qualcosa e' andato storto? esito negativo Sice : NO JUMP
tracciando la call 83xxxx64 arriveremo all' offset 6c2b6 dove tutto e pronto per la nostra copia e allora modifichiamo il codice come segue :
pushad : salviamo cio' che serve
call 694f3 : saltiamo alla nostra routine di copia
popad : rimettiamo a posto
nop
occorre salvare i registri per evitare di creare problemi alle altre routine del bleem,e saltimao a 694f3 dove abbiamo precedentemente messo il nostro codice di copia,poi risistemiamo i registri.
Andiamo avanti e all'offset 6bae1 ci imbatteremo in
mov eax,[esi]
add esi,4
xor eax,ebx
rol eax,cl
stosd
che decripta il codice in [esi] ma noi non vogliamo questo e siccome abbiamo copiato gia' a 660000 il codice decriptato usiamo [edi] che in quel momento ha il valore 660000 ,ma seza xor e rol diventando
mov eax,[edi]
add esi,4
nop/nop
nop/nop
stosd
Bene abbiamo finito ora non ci resta che provare il bleem senza cd-key. Un'altra soluzione possibile sarebbe mettere la routine di copia appesa alla fine dei dati che abbiamo aggiunto all'eseguibile e richiamarla al momento oppurtuno (vero Krs ;D)ma era piu difficile da realizzare anche se ugualmente valida, infatti questo non e' l'unico sistema per modificare il codice in modo che parta usando i dati della nuova sezione,ma e' pratico per cui ho spiegato (piu'o meno) questo.
Se volete capire meglio vi consiglio di controllare cosa fanno per bene le call di cui abbiamo parlato , come funzionino le routine di decript e check del sice, perche' il pc si blocchi se si eseguono alcune call e cosi' via.Io ho cercato per quanto mi e' stato possibile di dare le basi ora a voi approfondire.
Comunque vi ricordo che dovete possedere il cd-key per usare il bleem! e che altrimenti e' illegale e inoltre immorale quindi... compratelo !!!
NOTE FINALI
ok.... allora ringrazio:
Krs : grazie per le nostre chiaccherate di ore sul reverse!
Kill3xx: perche' ha scritto i migliori tutorial sul PE e sul manual unpacking che io abbia mai trovato !
xOANINO: beh, e' stato il primo a fare il crack del bleem e se poi sono riuscito a fare il mio lo devo alle sue idee.
MoonShadow: Ti prego di avere pazienza se ti rompo sempre le scatole...:)
E infine saluto :)
Genius,T3x,BlackDruid,Xinner,MkSubZ,MM,Scratch,Paolino e tutti i frequentatori assidui di crack-it che la mia povera mente ora non ricorda.
Ciauz a tutti :P
p.s. se mi volete contattare per qualche strano arcano mi trovate su #crack-it oppure yado@hotmail.com