Babylon Translator
(da 90gg a eterno)


30/09/1999

by "syscalo"

 

 

UIC's Home Page

Published by Quequero

Management: the art of getting other people to do all the work

Ottimo tutorial di syscalo....impariamo a crackare i programmi cercando ed usando una delle tante backdoor

Management: l'arte di indurre le altre persone a fare tutto il lavoro (tradotto con Babylon ;-)
UIC's form
Home page: http://syscalo.cjb.net
E-mail: [email protected]
UIC's form

Difficoltà

( )NewBies (X)Intermedio ( )Avanzato ( )Master

 

Ora andremo a crackare un programma che presenta un time limit di 90gg. Inoltre ci preoccuperemo anche di modificarlo in modo da poter spostare la data di sistema come vogliamo (questo perchè se vogliamo fare qualche prova dell'efficacia del nostro crack spostando avanti la data, quando la ripristiniamo il programma si accorge e ci dice che il nostro tempo è scaduto....ma sarai te scaduto :) Infine aggiungerò una finezza: elimineremo il MessageBox che ci chiede se siamo sicuri di terminare il programma quando non ci serve più...ma cazzo se ho selezionato esci è perchè voglio uscire :-/


Babylon Translator
(da 90gg a eterno)
Written by syscalo

Introduzione

Bhe che dire...io considero questo programma molto interessante (non solo dal punto di vista del cracking :) e utile. Io lo uso perchè facilita molto la lettura di testi in inglese dando la traduzione immediata. Fino ad ora non ho trovato parola che non sapesse tradurre...se potrete contraddirmi rivolgetevi ai realizzatori ma non dite che vi mando io :-D

Tools usati

SoftIce: per chi non lo avesse (ma state scherzando? :) lo trovate un po' dappertutto.

URL o FTP del programma

Io l'ho trovato in un cd rom di PcWorld. Comunque il sito ufficiale è http://www.babylon.com. Nel caso non fosse più presente potete richiederlo a me.

Notizie sul programma 

Il programma non è molto facile da crackare con i tradizionali metodi; questo perchè i programmatori si sono preoccupati di inserire qualche controllo incrociato su certi valori in modo da rendere complicato agire tramite la sola modifica di jump ed inoltre la routine di controllo del tempo rimasto viene effettuata in una dll e non nel programma principale (bhe con softice non cambia molto...però) C'è anche un'altra complicazione, sia per il messaggio che il programma si sta attivando sia per quello che il tempo è scaduto, la chiamata alla funzione è sempre la stessa! Voi direte "ma come è possibile" e io dirò "facile, durante il programma ci sono istruzioni che modificano i parametri passati alla funzione in modo da visualizzare uno o l'altro messaggio". Allora si deve trovare un metodo alternativo che ci permetta di non sognarci jmp tutta la notte :) Io ho pensato: se il programma fa giri strani per la verifica dei giorni rimasti, forniamogli il numero di giorni  rimanenti che più ci aggrada e poi lui può farsi tutti i giri che vuole. Come fare? Adesso lo vediamo.

Essay

Il programma, per controllare quanti giorni ci lascia di vita, usa la chiave HKEY_LOCAL_MACHINE\Software\Babylon\Babylon Translator\b1 nel registro di windows (vi consiglio sempre un backup delle chiavi e dei file interessati prima di iniziare con i vostri esperimenti). Nel valore binario IndexByData vi è la data salvata a modo suo, ma a noi non interessa molto capire come decide di memorizzarla (ve la lascio come sfida personale :) visto che abbiamo deciso di dirgli noi quanti gg mancano!
Iniziamo a conoscere il programma (piacere syscalo...scusate la battutaccia, deve essere la scheggia di granata che mi sono beccato in testa nella prima guerra mondiale). Entriamo in softice (ctrl+D) impostiamo un breakpoint sulla scrittura nel registro (bpx RegSetValueExA; lo metto sulla scrittura e non sulla lettura perchè altrimenti dovremmo far passare tutte le chiamate di windows), usciamo da softice (F5) e avviamo Babylon.
Eccoci in softice; se ci fate caso nella linea che divide la parte del codice del programma e la riga di comando di softice viene segnalato che siamo nella dll captlib; premiamo 3 volte F12 per ritornare nel programma principale. Ora impostiamo un breakpoint prima della chiamata "call [0043B9BC]" (che è quella da cui siamo appena tornati) dando il comando "bpx 0040120D" (indirizzo dell'istruzione push 0043B9B8) e disabilitiamo quello sulla lettura dal registro con il comando "bd 0" (0 è il numero che si vede alla sinistra del bpx dando il comando "bl" che visualizza la lista dei breakpoint). Vediamo un po' di codice:
0040120D: push 0043B9B8
call [0043B9BC] | chiama la funzione nella dll captlib
mov ebx,eax |
0040121A: cmp ebx,[0043B9B8] | strano che legga da una locazione il cui indirizzo è stato passato prima della chiamata, no?
jz 00401229 | se il valore ritornato in eax (copiato in ebx) è uguale a quello in 0043B9B8 salta a 00401229
 
Ok sveliamo il segreto del funzionamento della funzione chiamata e poi addentriamoci in essa. Alla locazione di indirizzo 0043B9B8 viene salvato il numero di giorni mancanti alla morte del programma. Inoltre la funzione ritorna lo stesso valore anche in eax e confronta i due per verificare che non ci siano state manomissioni nella funzione chiamata. Il programma continua così:
xor eax,eax azzera eax
mov [0043B9B8],eax sovrascrive la locazione contenente il numero di gg mancanti con 0
00401229: cmp dword ptr [0043B9B8],00 |
setg dl | se il numero di gg è maggiore o uguale a 0 setta dl a 1 altrimenti lo setta a 0
and edx,01 serve a fare in modo di azzerare edx tranne l'ultimo bit (quello settato da setg) che resta invariato
 
Qui verrebbe da dire: visto che setta dl a 1 se i gg sono più di 0 basta che sostituisco un'istruzione in modo che dl venga sempre imposato a 1 (ad es "or dl,1" al posto di "setg dl") e funziona sempre. Purtroppo no, non funziona. Da qui in poi ci sono una serie di istruzioni e chiamate a funzioni che porteranno alla creazione del messaggio finale: benvenuto o arrivederci? per noi deve essere sempre benvenuto.
Addentriamoci nella funzione chiamata nella dll; diamo un "F5", chiudiamo Babylon e poi riavviamolo. Ok, softice si ferma proprio prima della chiamata; proseguiamo con "F8" e appena entrati nella procedura proseguiamo con "F10" fino all'indirizzo 00AC2184 dove troviamo il seguente codice:
00AC2184: test si,si
00AC2187: jge 00AC2193
arrivati a questo punto anticipiamo la modifica per poter spostare la data di sistema come vogliamo; il registro si è diverso da 0 quando la data che legge dal registro risulta essere maggiore della data corrente (cioè sarebbe stato avviato nel futuro :) quindi noi dobbiamo intervenire per fargli credere che è tutto ok. Come fare? Forziamo il jge successivo a saltare sempre sostituendolo con un jmp. Per fare questo dobbiamo annotarci l'opcode del jge (alcuni byte prima e alcuni dopo: 6685F6|7D0A|BB010000), dare il comando in softice "a 00AC2187" che permette di modificare l'istruzione all'indirizzo indicato, scrivere "jmp 00AC2193" e premere invio. Ora vedrete che l'istruzione è cambiata; annotate il nuovo opcode (EB0A)
Ok con un editor esadecimale ricercate l'opcode della jge e sostituite 7D con EB.
Procederemo allo stesso modo anche per la modifica successiva.
Proseguiamo nel codice con "F10" fino all'indirizzo 00AC21DC; dobbiamo analizzare un po' il codice:
00AC21DC: mov word ptr [ebp-0E],0000 azzera il contenuto della locazione 006AFDBA
push 00000001 |passa 1 alla successiva call
lea eax, [ebp-009C] |
push eax |altro dato per la call
lea eax, [ebp-0E] |
push eax |passa l'indirizzo 006AFDBA (locazione azzerata prima)
call 00AC53C8 esegue la chiamata
add esp,0000000C prepara il puntatore allo stack
00AC21F7: sub [ebp-0E],si sottrae al contenuto della locazione 006AFDBA il contenuto del registro si; casualmente ora la locazione 006AFDBA contiene proprio il numero di giorni che ci mancano (espresso in esadecimale) (A)
cmp word ptr [ebp-0E],0000 |
jge 00AC2208 |salta solo se i giorni sono maggiori o uguali a 0
Continuare con "F10" fino all'indirizzo 00AC22F1:
00AC22F1: movsx eax,word ptr [ebp-0E] carica in eax in numero di gg rimasti
mov edx,[ebp+08] carica in edx l'indirizzo 0043B9B8 (proprio quello passato prima della chiamata :)
mov [edx],eax carica il numero di gg nella locazione 0043B9B8
test ebx, ebx |
je 00AC2302 |salta a 00AC2302 se ebx è diverso da 0 (con la modifica che faremo non c'è bisogno di forzare questo salto)
Dopo il salto troviamo il seguente codice:
00AC2302: movsx eax, word ptr [ebp-0E] ricarica in eax il numero di gg rimasti
pop esi |ripristina i registri
pop ebx |
mov esp, ebp |
pop ebp |
ret 0004 ritorna dalla chiamata
Andiamo a modificare il programma per fare in modo che manchino sempre il numero di giorni che decidiamo noi (io ho scelto 45 esadecimale che in decimale rappresenta un simpatico numerino ;-). Per fare ciò modifichiamo l'istruzione "sub [ebp-0E],si" all'indirizzo 00AC21F7 (vedere A); si ma con che cosa? bhe io ho pensato di caricare qui il numero di gg, rendendolo così anche indipendente dal valore del registro si: che ne dite di una bella "mov [ebp-0E],45" che occupa anche gli stessi byte della "sub [ebp-0E],si" (cosa molto importante!!). Bene procedete come prima per trovare gli opcode che vi servono e andate dal vostro editor esadecimale di fiducia (io ho usato 83C40C|662975F2|66837D per la ricerca nel programma e C645F210 come opcode sostitutivo...in pratica vi ho già detto tutto :)
Ricordatevi che con l'editor esadecimale dovete aprire la dll captlib.dll, non il programma Babylon.exe!!
 
Ora il programma è eterno, però voglio aggiungere una piccola finezza motivata dal mio odio personale per questo tipo di messaggi: andiamo ad eliminare il MessageBox di uscita dal programma. Entrate in softice e cancellate tutti i breakpoint impostati con il comando "bc*" e poi impostatene uno nuovo sulla MessageBox con il comando "bpx MessageBoxA". Uscite da softice con "F5", avviate Babylon, selezionate chiudi e apparirà softice. Ora premete "F12" e vi comparirà il box per la verifica della vostra scelta; selezionate Si e ricomparirà il nostro assistente softice. Qui troviamo il seguente codice:
004047BF: push 24 |Vengono passati i 4 parametri necessari alla
lea edx,[ebp+FFFFF9F0] |chiamata della MeassageBoxA
push edx |
lea ecx,[ebp+FFFFFA30] |
push ecx |
push edi |
004047D0: call USER32!MessageBoxA visualizza il messaggio e ritorna un valore in base alla scelta fatta (6=SI, 7=NO)
cmp eax,06 |
jnz 004047E6 | se viene ritornato 6 esce dal programma
004047DA: push 00 saltando qui chiudiamo il programma senza vedere la MessageBox
Non possiamo agire solo sulla chiamata alla MessageBox e sul valore ritornato perché creeremmo casini con lo stack, quindi dobbiamo saltare tutte le istruzioni push che passano i parametri alla funzione chiamata; cosa c'è di meglio che farlo cambiando una sola istruzione in un salto? Andiamo allora a modificare l'istruzione "push 24" all'indirizzo 004047BF con una "jmp 004047DA". Annotatevi l'opcode della push per la ricerca (io ho scelto 83C408|6A24|8D95F0F9) cambiate l'istruzione in jump come spiegato prima e annotate il nuovo opcode (EB19) e come sempre avviate il vostro editor esadecimale e applicate la sostituzione. Vi ricordo che per questa modifica dovete aprire il file Babylon.exe e non più la dll.
 
Eccoci alla fine. Spero che questo tutorial sia utile a capire che quando le cose si fanno un po' complicate per risolvere tutto con i jump, è bene cercare una soluzione alternativa che, come in questo caso, renda le cose molto più semplici. Poi magari qualcuno di voi rovistando nel programma trova un jump che risolve tutto...ma non credo, cmq fatemi sapere ;)
 
««ciao a tutti»»
syscalo
Note finali

Ok è giunto il momento di abbandonare per qualche ora il cracking e il reverse per dedicarsi alla f××a; non divertitevi troppo ;-)

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.
Capitoooooooo????? Bhè credo di si ;)))) 

 
UIC's page of reverse engineering, scegli dove andare:

 

UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC