Cracking Opera 3.60


10-02-2000

by "phobos"
(aka D4rKSP4rr0w)
 

 

UIC's Home Page

Published by Quequero


"...se adesso
vi fermate,
forse
vi salvate, 
questo io vi
dico da vero
amico..."
                       S. King, "IT"

 

Bravo phob, ha scritto un buon tute sul CRACKING di opera..a quando il suo REVERSING? :)

 
UIC's form
E-mail: [email protected]
On IRC:#crack-it,  #uic
Nick: ph0b0s
UIN 37507754 
UIC's form

Difficoltà

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

 

Eccoci di nuovo qui... state tutti bene? Spero di si...
Questo tute nasce dalla necessita' di utilizzare un browser affidabile per internet... in una fredda serata invernale, stanco dei continui crash del Netscape Navigator, prevenuto in partenza nell'utilizzo del Micro$oft Explorer... ho scoperto un browser di modeste dimensioni, potente, stabile, intuitivo...
Che altro dire...
Andiamo a vedere di che si tratta...


Come 'crackare' Opera ver. 3.60

Opera 3.60. A cracking approach.
  Written by phobos (aka D4rKSP4rr0W)

Introduzione


 

Proprio come detto prima, Opera sta diventando il browser piu' usato da chi su Internet oramai ci 'sguazza'.  Non ci credete? Chiedete a Quequero, a TiN_MaN o a chi reputate piu' all'altezza di voi o di me.... ;-)
Si tratta di un browser veloce, intuitivo, facilmente programmabile, stabile, e cosa piu' importante di piccole dimensioni...
vi chiederete a questo punto, 'che me ne sbatto se e' piccolo, ho un HD da 47 Giga, volendo ci posso caricare su anche phobos!!!'... piano... piano... innanzitutto, non so se vi conviene 'installarmi' sul vostro HD (sono piu' rompipalle di un virus :-)) e poi, per citare una frase fatta: "...  We'll never damage Xxxxxxxxx interests enough to compensate for this moronic situation... where you have to wait three minutes to get on screen a wordprocessor that older OS (and even old DOS) kick up in 5 seconds..." che vuol dire? Vuol dire che oggi con computers che hanno potenza di calcolo centinaia di volte superiore a quelli di qualche anno fa (i286, i386) si deve aspettare molto di piu' a fare cose che con quei computer molto meno potenti erano quasi 'immediate'...
Le memorie scendono di costo, i processori sono in saldo, gli HD hanno raggiunto dimensioni da fantascienza rispetto a quando interi programmi stavano su un floppy da 740 Kbyte... di conseguenza, i programmi sono diventati smisuratamente grandi, per 'sfruttare a pieno' queste risorse 'a buon mercato'...
Non franintendetemi, non sono un nostalgico rincoglionito dei vecchi 386 o del vecchio WP...e' solo che, perche' devo utililizzare un programma di 400 Megabyte, quando ce n'e' uno di 5 che fa le stesse cose, magari meglio? E soprattutto (vista la 'leggerezza' del programma) piu' velocemente?
E' il caso di Opera.
Non dico altro...

Tools usati

Numega SoftICE
Windasm 8.9
Editor Esadecimale di vostro gusto
Iczelion Virtual address to file offset utility ver. 1.0

Qualche minuto di tempo...
Se fumate...le vostre sigarette preferite :-)
 

URL o FTP del programma

http://www.operasoftware.com

Notizie sul programma

 
Il programma in esame e' un Internet browser (lo abbiamo gia' detto? ;-)). Il meccanismo di protezione e' di tipo 'cinderella', scade cioe' dopo trenta giorni, trascorsi i quali, se non si registra il programma, non e' possibile visitare altri siti all'infuori di quello di Opera, dove si deve andare a registrare il software.
Durante il primo avvio del programma, subito dopo l'installazione, ci appare una 'Nag screen' in cui si possono scegliere delle opzioni, tra cui registrare il programma o valutarlo. Ai successivi riavvii, la nag cambia, e oltre a darci la possibilita' di registrare il programma, ci informa anche di quanti giorni sono rimasti prima dello scadere del periodo shareware...
CHE STRESS 'STI CONTI ALLA ROVESCIA!!!!
Ora lo ammazziamo!!

Essay

Innanzitutto, spostiamo la data del sistema operativo qualche mese avanti nel tempo e vediamo come si comporta il programma...
Ok... scaduto...

- Digressione -

Quando per la prima volta effettuai questa procedura, tutti pulsanti ad icona del programma furono sostituiti da delle specie di reticoli a crocette, con il risultato che non erano piu' visibili le loro funzioni... cosa molto fastidiosa, risolsi egregiamente il problema, disinstallando e reinstallando il programma... che rimase sempre scaduto, ma le icone tornarono nuovamente visibili.
Se vi accingete a craccarlo prima dello scadere del tempo, questa procedura non e' necessaria... come dite? Dovevo dirvelo prima di settare la data avanti? Ooopss!! ;-p Ve l'ho detto che sono piu' rompipalle di un virus!!! :-)

- Fine Digressione -

Provando ad avviarlo comunque, cliccando sull'icona bianca a sinistra della barra di stato che ci avverte che il prog. e' scaduto, si entra nel programma.
Proviamo a visitare un sito, immettiamo un url qualunque...
Il programma ci avverte con una nag che e' scaduto ('This evaluation version has expired.') e che si puo' solo andare sul suo sito...
Le informazioni in nostro possesso sono sufficienti per il nostro 'attacco'...

Disassembliamo il programma con il wdasm, e cerchiamo (con il 'Find text') la parola: 'expired', arriviamo in questo punto del codice:

:00405E60             push esi
:00405E61             mov esi, ecx
:00405E63             mov ecx, dword ptr [0051171C]
:00405E69             call 00460F57
:00405E6E             test eax, eax
:00405E70             je 00405E84                  <--- Nota
:00405E72             mov eax, dword ptr [esi]
:00405E74             mov ecx, esi
:00405E76             call [eax+54]
:00405E79             test eax, eax
:00405E7B            jne 00405E84                <--- Nota

* Possible Reference to String Resource ID=32889: "This evaluation version has expired."
                                  |
:00405E7D            mov eax, 00008079  <--- Viene 'pushata' la stringa qui sopra
:00405E82             pop esi
:00405E83             ret

Se non vengono eseguiti i due salti evidenziati (cosa che accade allo scadere del periodo trial) vengono passati i parametri alla message box che ci avvisa del fatto che il prog e' scaduto e che ci impedisce di visitare altri siti. Il primo intervento consiste nel cabiare il secondo salto (e' sufficiente ai nostri fini intervenire solo su questo, e soprattutto e' anche piu' semplice da 'patchare') da JNE in JMP (condizionale in assoluto), a tale scopo, con l'hex editor, combiamo, all'offsett in cui ci troviamo '75 07' in 'EB 07' (nel caso di questo programma, e' sufficiente eliminare dall'indirizzo fornitoci in wdasm il quattro a sinistra: Address :0041FBAA -> Offset 1FBAA. Semplice no? ;-)).

A questo punto, la piu' grossa limitazione del programma e' stata eliminata, resta da rifinire il tutto, eliminando la nag iniziale.

Per far questo, andiamo nuovamente in Wdasm e cerchiamo la stringa 'Your timed evaluation has', che non e' altro che una delle stringhe contenute nella nag iniziale, dove ci viene comunicato quanto tempo ci e' rimasto per valutare il programma e bla, bla, bla!! Arriviamo in questo frammento di codice:
 

:00491590            push 00000100
:00491595            mov dword ptr [ebp+08], eax
:00491598            lea eax, dword ptr [ebp+FFFFFEF0]
:0049159E            push eax

* Possible Reference to Dialog: SERNO_NAG, CONTROL_ID:2B92, "<B>Your timed evaluation has %i days lef"
                                  |
:0049159F            mov ebx, 00002B92  <--- Arriviamo esattamente qui.
:004915A4           push ebx
:004915A5           push edi

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                  |
:004915A6          Call dword ptr [004F6510]
:004915AC          push [ebp+08]

Che bello!! Se proviamo a guardare immediatamente sopra e sotto al punto in cui ci troviamo nel wdasm, possiamo vedere tutte le reference ai pulsanti ed alle stringhe presenti nella nostra nag...
Io vi riporto la parte superiore, che e' quella che ci interessa:
 
 

* Possible Reference to Menu: MenuID_0004
                                  |
:00491559           push 00000004
:0049155B          lea eax, dword ptr [ebp-10]
:0049155E          push eax
:0049155F          push edi

* Possible Reference to Dialog: SERNO_NAG, CONTROL_ID:2B8E, "Help" <--- Nota
                                  |
:00491560          mov [ebp-10], 00002B8E

* Possible Reference to Dialog: SERNO_NAG, CONTROL_ID:2B8F, "Eval" <--- Nota
                                  |
:00491567          mov [ebp-0C], 00002B8F

* Possible Reference to Dialog: SERNO_NAG, CONTROL_ID:2B90, "Purchase" <--- Nota
                                  |
:0049156E          mov [ebp-08], 00002B90

* Possible Reference to Dialog: SERNO_NAG, CONTROL_ID:2B91, "Register" <--- Nota
                                  |
:00491575          mov [ebp-04], 00002B91
:0049157C         call 00491B92
:00491581          mov eax, dword ptr [0051171C]
:00491586          mov ecx, dword ptr [eax]
:00491588          add esp, 0000000C
:0049158B         call 004BD248

I riferimenti evidenziati, si rifescono tutti ad una dialog chiamata 'SERNO_NAG', se andate a vedere con un programma che permette di disassemblare tutte le resource presenti in un eseguibile, tipo Exescope (lo trovate su http://ringzer0.cjb.net, o sul sito di Quequero tra i tools), potrete notare che la nostra serno_nag e' proprio la nag che appare all'inizio del programma.
Ora dobbiamo 'risalire' il codice, per vedere dove questa nag viene chimata:

* Referenced by a CALL at Address:
|:0049148F
|
:004914FE         push ebp <--- Questa e' la prima reference utile da andare ad analizzare
:004914FF         mov ebp, esp
:00491501         sub esp, 00000110
:00491507         push ebx
:00491508         push esi
:00491509         push edi
:0049150A        mov edi, dword ptr [ebp+08]
:0049150D        xor eax, eax
:0049150F         push eax
:00491510         push eax
:00491511         push eax
:00491512         push eax
:00491513         push edi
:00491514         call 00425E09
:00491519         push edi
:0049151A        call 00425A89

* Reference To: USER32.GetDlgItem, Ord:0102h
                                  |
:0049151F         mov esi, dword ptr [004F6540]
:00491525         add esp, 00000018
:00491528         push 00002B93
:0049152D        push edi
:0049152E        call esi

* Reference To: USER32.SetWindowLongA, Ord:0258h
                                  |
:00491530         mov ebx, dword ptr [004F64BC]
:00491536         push 00491C89
:0049153B        push FFFFFFFC
:0049153D        push eax
:0049153E        mov dword ptr [005114A4], eax
:00491543        call ebx
:00491545        mov dword ptr [005114B4], eax
:0049154A       call 00491CE8
:0049154F        push 00491609
:00491554        push FFFFFFFC
:00491556        push edi
:00491557        call ebx

Quindi, come potete vedere, l'indirizzo :004914FE, viene chiamato da una call situata in :0049148F, andiamo in quel punto del codice e vediamo che possiamo fare...

:00491486        push [ebp+14]
:00491489        push [ebp+10]
:0049148C       push [ebp+08]
:0049148F        call 004914FE       <--- Questa e' la CALL 'incriminata'
:00491494        add esp, 0000000C
:00491497        jmp 004914F9

Dobbiamo 'patchare' anche questa call, come? Ma la Nopizziamo!!! All'offsett del file in esame, inseriamo cinque bei Nop (codice di istruzione 90) cosi' patchiamo la call che non verra' piu' eseguita e non imputtaniamo troppo il codice (tanto non ha CRC check...e gia' e' qualcosa!).

Proviamo a riavviare il programma... CAKKIO!!! la nag e' scomparsa ma appare comunque quella che si vedeva al primo avvio!!! Infatti. Il programma, 'crede' di essere sempre al primo avvio, cosi' ci avvisa che  possiamo valutarlo o registrarlo.
Vogliamo togliere dai piedi questa ultima nag?? Of course!! ;-)
A questo punto ci occorre l'intervento del SoftICE.
Avviamo il debugger (mi sembra riduttivo chiamarlo cosi', visto che piu' che un debugger e' un tesoro...se avesse le tette me lo scoperei!!! ;-)) e inseriamo un bel breakpoint sulla funzione che dovrebbe generare questa nag, che non e' altro che una dialog box: bpx DialogBoxParamA...
Avviamo il programma, l'ice 'poppa' fuori piu' di una volta, ma a noi interessa che intervenga il momento prima della creazione della nostra nag, cosi' usciamo dall'ice (con F5) fino a che non vediamo che Sice poppa fuori immediatamente dopo l'apparizione dello 'scheletro' della nostra nag....Hi Hi Hi! :-]
Siamo nel codice che si occupa della creazione della finestra in esame... piazziamo un break su una istruzione immediatamente successiva a dove ci troviamo (non mi chiedete dove, l'importante e' piazzarlo prima della successiva call, altrimenti, la nag viene fuori, l'ice non poppa piu' e dovete ricominciare tutto da capo) usciamo dall'ice, ritorniamo sul punto dove avevamo inserito il break, riusciamo dall'ice... Siamo sulla nag... Clicchiamo su 'Evaluate' l'ice prontamente reinterviene... usciamo dalla subroutine in cui ci troviamo (F11), avendo avuto cura di disabilitare il secondo breakpoint che avevamo settato, e ci troviamo 'magicamente' nel punto esatto in cui viene creata la nostra nag... ;-) prendiamo nota dell'indrizzo in memoria in cui c'e' la Call alla funzione DialogBoxParam, disabilitiamo tutti i break point, usciamo dall'ice e convertiamo l'indirizzo relativo nel file offset. Se non siete in grado di farlo a mano, se siete in grado di farlo ma non avete voglia,  :-) potete sempre utilizzare il programma 'Virtual address to file offset utility' di Iczelions, otteniamo l'offset del file Opera.exe, andiamo a questo punto nel disassemblato del wdasm e cerchiamo questo offset (tenendo presente che ci appare scritto nella finestra del programma, in basso, quello relativo ad ogni linea di codice su cui ci troviamo), arriviamo in questo punto...

* Possible StringData Ref from Data Obj ->"*"
                                  |
:00491347       push 00507C80
:0049134C      push eax
:0049134D      call 00424635
:00491352       cmp esi, ebx
:00491354       pop ecx
:00491355       pop ecx
:00491356       je 00491388
:00491358       push [ebp+10]
:0049135B      lea eax, dword ptr [ebp-40]
:0049135E       push esi
:0049135F       push [ebp+08]
:00491362       push eax
:00491363       push dword ptr [00510F18]

* Reference To: USER32.DialogBoxParamA, Ord:0093h
                                  |
:00491369       Call dword ptr [004F658C]   <--- Eccola qua!!
:0049136F       xor ecx, ecx
:00491371       cmp eax, FFFFFFFF
:00491374       setne cl
:00491377       push 00000040
:00491379       lea eax, dword ptr [ebp-40]
:0049137C       push ebx
:0049137D       push eax
:0049137E       mov edi, ecx
:00491380       call 004E73D0
:00491385       add esp, 0000000C

Quella evidenziata e' la chiamata alla nostra nag screen iniziale (per essere piu' precisi: alla nostra Dialog Box), per eliminarla, e' sufficiente 'Nopare' la call, avendo pero' l'accortezza di noppare anche le quattro istruzioni di Push che la precedono, poiche', riguardando queste ultime il Base Pointer, il Source Index  ed esendo i valori contenuti nei vari registri 'poppati' fuori solo alla fine della procedura chiamata da questa call (che, chiaramente, non essando piu' eseguita, non poppa fuori piu' un cz!!!) se non le nopate, vi si sputtanano gli indirizzi del programma che vi crashera' malamente...
Le istruzioni da inserire, partendo dall'offset del primo push in :0049135E sono diciassette Nop (sempre codice di istruzione 90)... poco elegante come patch, ma funzionale!!!
In ultima analisi vichiederete, perche' i push prima di questa call vanno nopati e quelli prima della call che abbiamo noppato sopra no? Domanda lecita ed appropriata. Semplicemente perche' i push relativi alla prima call passano i parametri selativi alla call in questione e non influenzano altre parti del programma, mentre nella seconda, viene influenzato il registro ESI, che non essendo piu' ripristinato fa saltare tutto. Spero di essere stato suffficientemente esauriente.

Finito. Il programma risulta funzionante...

Solo un'ultima cosa, ho notato, dopo aver patchato il tutto, che al primo avvio, selezionando nei menu' le voci 'Mail' o 'News' appare nuovamente la nag che avvisa che il periodo di valutazione del programma e' scaduto, ma cliccando su Ok, la nag scompare e non riappare piu' negli usi successivi...non ho indagato su questo 'Cracking Bug' visto che il programma funziona... se qualche volenteroso volesse indagare, gradirei sapere i risultati di questa indagine :-)

E' tutto... Alla prossima.

 
                                                                                                                                phobos (aka D4rKSP4rr0W)
Note finali 

THANX TO:

* +ORC Per i suoi tute
* Quequero per il suo continuo impegno
* Iczelion per i loro (suoi??) tools
* Kill3xx, Neural_Noise, malattia+, TiN_MaN per i loro continui consigli
* Tutti i membri o semplici partecipanti di RingZ3r0, della UIC, di #crack-it
* Tutti coloro che hanno la pazienza di ascoltare un pazzo scatenato come me!   :-)

A PRESTO!!

Disclaimer

Vorrei ricordare al lettore che cracking, revers engeenering, hacking, ecc...costituiscono dei reati. Nel momento in cui il materiale riguardante uno dei suddetti viene 'ridistribuito' si incorre in gravi sanzioni penali ed amministrative. Se crackate un programma, fatelo solo a fini didattici, e soprattutto, non andate a dire ai quattro venti 'io sono un cracker/hacker...' fatevi furbi ;-). Tutti i nomi citati, sono marchi registrati o copyright dei ripettivi propietari. 

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

Home   Anonimato   Assembly    CrackMe   ContactMe   Forum       
    Iscrizione   Lezioni    Links   NewBies   News   Playstation        
  Tools   Tutorial   Search   UIC Faq

UIC