|
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
- 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
- SoftIce: per chi non lo avesse (ma state scherzando? :) lo trovate un po' dappertutto.
- 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.
- 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.
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
Ok è giunto il momento di abbandonare per qualche ora il cracking e il reverse per
dedicarsi alla f××a; non divertitevi troppo ;-)
- 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: