Reversare il bleem1.0       

                                 -=> Yado <=-

                               15 Agosto 1999


--==[   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
dvove 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


--==[     EOF      ]==--------------------------------------------------------