La mutazione
(unshareware version)

 

22/06/2000 

by "syscalo"

 

 

UIC's Home Page

Published by Quequero 

Reversing?

Menomale che c'è sys a portare avanti questa mitica sezione, bravissimo sys, ottimo tute, ti invito la prossima volta a fare un tute sull'uso di questi mitici tools per linux :)

...cracking for today!
UIC's form
Home page: http://syscalo.cjb.net 
E-mail: [email protected]
UIC's form

Difficoltà

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

 

Ho intitolato questo tutorial "La mutazione" perche', non essendo il programma registrabile in alcun modo, l'unica cosa da fare per poterlo usare come registrato e' modificarlo e per fare le cose bene lo modifichiamo anche nell'aspetto!!


La mutazione

(unshareware version)
Written by syscalo

Introduzione

In questo tutorial vedremo un po' di cosette interessanti, non troppo complicate ma interessanti! Inoltre alla fine il programma sara' veramente come se fosse la versione registrata, e questo e' bello ;-))

Tools usati

dasm (disassemblatore, lo potete trovare su freshmeat)
biew (editor esadecimale, lo potete trovare su freshmeat)
gdb (debugger, presente in ogni distribuzione di Linux)

URL o FTP del programma

Il programma lo potete cercare su freshmeat, o al sito http://www.coffeecup.com

Notizie sul programma

CoffeeCup HTML Editor e' appunto un editor html per Linux; non permette alcun metodo di registrazione, perche' i programmatori hanno deciso che dovete pagare e poi vi dicono dove andare a prendere il programma registrato (cosi' vi scaricate due volte 2Mega di archivio :-/ )
Quindi non resta che procedere con una bella pulizia di tutto cio' che ci da' fastidio ;-)

Essay

Per organizzare meglio il lavoro lo divido in diversi passi in modo da rendere tutto piu' chiaro.
Preliminari: disassemblate il file Coffee con il dasm.

Passo 1:
    Eliminare la limitazione del tempo massimo di 30 giorni e msgbox iniziale.
Se andate a sbirciare un po' tra la symbol table nel disassemblato del programma troverete una simpatica funzione che i programmatori hanno pensato bene di chiamare time_limit. Ora spero che questo nome sia abbastanza significativo per chiunque stia leggendo questo tutorial!
La prima cosa che si potrebbe fare e' andare a vedere cosa fa questa funzione; io l'ho fatto, ma con l'intento di prendere un po' di familiarita' con la sintassi AT&T. Pero' se ragionate un attimo, il programma, non essendo registrabile, non saltera' mai la chiamata a questa procedura e quindi basta noppare la chiamata; per nostra fortuna il programma funziona proprio cosi' e in realta' siamo ancora piu' fortunati perche' la visualizzazione della msgbox che mostra i giorni restanti viene effettuata dentro la procedura time_limit e quindi in un colpo solo eliminiamo due problemi.
Procediamo:
nel disassemblato cercate la funzione time_limit, e troverete queste scritte:
<time_limit>
 806d9e0 (  0) 55             pushl  %ebp               (CL 806dd3e <main+1d2>)  <-- questa scritta sta ad indicare che la funzione viene chiamata dalla call all'indirizzo 806dd3e nel main
 806d9e1 (  1) 89e5           movl   %esp,%ebp

quindi rechiamoci a questo indirizzo nel main:
 806dd3e (1d2) e89dfcffff     call                      (to 806d9e0 <time_limit>)

ora aprite il file Coffee con il biew, andate in visualizzazione esadecimale, portatevi all'indirizzo virtuale 806dd3e e sostituite l'opcode e89dfcffff con 9090909090 in modo da noppare la chiamata. Salvate le modifiche e provate ad eseguire il programma. Niente piu' giorni rimanenti, ne msg box ;-)

E fin qui la cosa e' banale, grazie soprattutto all'ingenuita' dei programmatori! Ma proseguiamo

Passo 2:
    Non mostrare la seconda msgbox di chiusura che invita a registrarsi e terminare correttamente il programma.
Quando vogliamo chiudere il programma viene visualizzata prima la msgbox con titolo Exit e con i pulsanti Exit, Save All e Cancel. Per uscire ovviamente dobbiamo premere il pulsante Exit, ma sorpresa.... una seconda msgbox compare e ci invita a registrarci. Se premete il tasto Ok il programma termina e basta, mentre se si preme il tasto Cool il programma lancia il browser preferito cercando di collegarsi al sito del programma.
Ora io ho pensato questo: se si collega al sito, deve per forza passare in qualche modo l'indirizzo del sito e allora via con la ricerca nel disassemblato della stringa www.coffeecup.com.
Ne troverete alcune prima di arrivare a quella giusta, ma e' facilmente intuibile quale e' quella giusta, con due semplici accorgimenti:


bene, questa e' quella giusta, ed ora possiamo lavorarci un po': anche il nome ispira molto "see_us" :-)
Ora io qui ho usato il gdb per vedere un po' il funzionamento del programma (e per imparare ad usare un po' il gdb ;) ma non e' necessario, si puo' risolvere tutto con l'approccio passivo lavorando sul disassemblato.
Ok, cerchiamo nel disassemblato la funzione CB_msgbox_s0:
<CB_msgbox_s0>
 806eb88 (   ) 55         pushl  %ebp
 806eb89 (  1) 89e5       movl   %esp,%ebp
 806eb8b (  3) e89c2d0100 call                      (to 808192c <see_us>) <--chiama la procedura see_us
 806eb90 (  8) 6a00       pushl  $0x0
 806eb92 (  a) e86986ffff call                      (to 8067200 <_init+0xe70>) <--chiama la procedura exit
 806eb97 (  f) 90         nop

Per sapere che _init+0xe70 e' la funzione exit cercate nel disassemblato la stringa 8067200 e troverete:
 8067200       F *UND*    c8              exit@@GLIBC_2.0

Appena terminata la procedura CB_msgbox_s0, trovate la procedura CB_msgbox_s1 e la procedura msgbox_s.
La procedura CB_msgbox_s1 e' quella che viene chiamata quando nella seconda msgbox premiamo Ok ed e' la seguente:
<CB_msgbox_s1>
 806eb98 (   ) 55           pushl  %ebp
 806eb99 (  1) 89e5         movl   %esp,%ebp        <--come vedete qui non chiama la procedura see_us
 806eb9b (  3) 6a00         pushl  $0x0
 806eb9d (  5) e85e86ffff   call                      (to 8067200 <_init+0xe70>) <--chiama la procedura exit
 806eba2 (  a) 89f6          movl   %esi,%esi

Come potete vedere dalle seguenti righe:
<msgbox_s>
 806eba4 (   ) 55           pushl  %ebp               (CL 807445b <CB_exit_ok+27>)

la funzione msgbox_s viene chiamata solo dalla procedura CB_exit_ok, che e' proprio quella che viene chiamata quando viene premuto il pulsante Exit nella prima msgbox d'uscita.
Andiamo a vedere cosa fa questa procedura oltre ad effettuare la chiamata alla visualizzazione della seconda msgbox; cercate la procedura CB_exit_ok nel disassemblato:
<CB_exit_ok>
 8074434 (   ) 55             pushl  %ebp
 8074435 (  1) 89e5           movl   %esp,%ebp
 8074437 (  3) ff35a41f2408   pushl  0x8241fa4
 807443d (  9) e80e4b0a00     call                (to 8118f50 <gtk_widget_destroy>) <--chiama la procedura che distrugge la finestra
 8074442 (  e) 68066d1508     pushl  $0x8156d06   (R 'Cleaning up...') <--passa la stringa che visualizza sulla console da cui e' stato avviato Coffee
 8074447 ( 13) e8642bffff     call                 (to 8066fb0 <_init+0xc20>) <--effettua la chiamata a printf
 807444c ( 18) 68206d1508     pushl  $0x8156d20         (R 'rm -f /tmp/.cup* >/dev/null 2>&1') <--passa il comando da eseguire
 8074451 ( 1d) e8ba24ffff     call                      (to 8066910 <_init+0x580>) <--chiama la procedura system (esegue il comando passato)
 8074456 ( 22) 68606d1508     pushl  $0x8156d60         (R 'Please register your shareware !') <--passa il testo per la msgbox
 807445b ( 27) e844a7ffff     call                      (to 806eba4 <msgbox_s>) <--chiama msgbox_s che visualizza la seconda msgbox
 8074460 ( 2c) c9             leave
 8074461 ( 2d) c3             ret
 8074462 ( 2e) 89f6           movl   %esi,%esi

Per sapere quali sono le funzioni, cercare sempre nel disassemblato gli indirizzi indicati:
8066fb0       F *UND*        29              printf@@GLIBC_2.0
8066910  w    F *UND*       25f           system@@GLIBC_2.0

La mia idea e' stata questa: invece di effettuare la chiamata a msgbox_s potremmo modificare le istruzioni per far chiamare la procedura CB_msgbox_s1 in modo da terminare correttamente il programma senza visualizzare la seconda msgbox che ci invita a registrarci; e visto che l'idea mi e' sembrata buona l'ho fatto ;-)
Dobbiamo quindi inserire l'istruzione "call CB_msgbox_s1" e noppare tutto cio' che non ci serve. Il problema e' come trovare l'opcode della call da inserire.
Ecco il metodo:
Iniziamo a noppare cio' che non ci serve, quindi le istruzioni ai seguenti indirizzi:
8074456 e da 8074460 a 8074462
in sostanza lasciamo la call e le istruzioni prima della push all'indirizzo 8074456.
Passiamo a generare l'opcode per la call:
innanzi tutto ragioniamo (ovviamente) sugli indirizzi e non sulla etichette: quindi la nostra istruzione sara' "call 806eb98"
noi siamo all'indirizzo 807445b, quindi effettuiamo la seguente operazione: indirizzo a cui dobbiamo saltare (806eb98)- indirizzo dell'istruzione successiva alla call (8074460)=ffffa738
Ora possiamo generare l'opcode:
e8: call
ffffa738: offset a cui saltare
i byte dell'offset vanno inseriti al contrario, e si ha l'opcode: e838a7ffff
Ecco fatto! Aprite il file Coffee con biew, andate all'indirizzo virtuale 807445b e sostituite l'opcode calcolato (e838a7ffff) a quello gia' presente (e844a7ffff) e poi noppate le istruzioni indicate prima sostituendo 90 ai loro opcode.
Salvate le modifiche, e chiudete biew; avviate Coffee, Control-x per terminare il programma: compare la prima msgbox Exit; premete il pulsante Exit e il programma termina correttamente senza visualizzare piu' la seconda msgbox che invita a registrarsi.

Passo 3:
    Eliminare l'immagine gialla SHAREWARE - PLEASE REGISTER.
Un metodo semplice e' cercare l'immagine nel file ed "eliminarla" azzerando il primo byte del'immagine stessa.
Grazie alla bonta' dei programmatori, sbirciate sempre un po' nella symbol table e troverete la label share_xpm:
 8234cb4  l     O .data       37c              share_xpm
Bene, aprite il file Coffee con biew, andate all'indirizzo virtuale 8234cb4 e sostituite il primo byte con 0; salvate le modifiche e avviate Coffee.
L'immagine non c'e' piu', ma ci sono due problemi:


Per ovviare al primo problema e' sufficiente analizzare la funzione see_us:
<see_us>
 808192c (   ) 55           pushl  %ebp               (CL 806eb6f <CB_register_ok+3>) (CL 806eb8b <CB_msgbox_s0+3>)
 808192d (  1) 89e5         movl   %esp,%ebp
 808192f (  3) 6800102608   pushl  $0x8261000
 8081934 (  8) e82fd8feff   call                      (to 806f168 <check_bin>)
 8081939 (  d) 83c404       addl   $0x4,%esp
 808193c ( 10) 83f8ff       cmpl   $-0x1,%eax
 808193f ( 13) 741e         je                        (to 808195f <see_us+0x33>) <-- non so per quale motivo, ma i programmatori hanno inserito questo salto condizionato che salta completamente la chiamata all'attivazione del browser! Quindi sfruttiamolo con piacere ;-)
 8081941 ( 15) 6800102608   pushl  $0x8261000
 8081946 ( 1a) 6860662008   pushl  $0x8206660         (R '%s "http://www.coffeecup.com" &')
 808194b ( 1f) 6820332408   pushl  $0x8243320
 8081950 ( 24) e8ab5afeff   call                      (to 8067400 <_init+0x1070>)
 8081955 ( 29) 6820332408   pushl  $0x8243320
 808195a ( 2e) e825feffff   call                      (to 8081784 <run_program>)
 808195f ( 33) c9           leave                     (JC 808193f <see_us+13>)
 8081960 ( 34) c3           ret

Modifichiamo il salto in un jmp cambiando l'opcode dell'istruzione da 741E in EB1E; apportate le modifiche con biew al file Coffee e siete a posto: ora il programma e' quasi perfetto, tutte le possibilita' per avviare il browser a tentare di collegarsi al sito sono disinibite, compresi i pulsanti register!!

Rimane la seccatura del pulsante Register che si vede all'avvio del programma, e la scritta **SHAREWARE VERSION! Please Register**.
Eliminiamo tutto lo splash screen che viene creato all'avvio e facciamo prima ;-)

Passo 4:
    Eliminare lo splash screen creato all'avvio.
Ancora un volta i programmatori ci vengono in aiuto! Guardate i messaggi che vengono scritti sulla console da cui avviate il programma; ecco l'output normale:
HTMLEDITOR: Starting version 4.1
Setting signals...
Setting locale...
Initializing GTK...
Initializing system colors...
Parsing configuration file...
Creating GUI...
Creating splash screen... <--ecco come i programmatori ci vogliono bene ;-)
Done...
Cleaning up...

Cercate la stringa "Creating splash screen..." nel disassemblato e troverete le seguenti istruzioni:
 806dcc6 (15a) 6815551508       pushl  $0x8155515         (R 'Creating splash screen...') <--le tre call seguenti sono tutte da noppare
 806dccb (15f) e8e092ffff          call                      (to 8066fb0 <_init+0xc20>) <--chiama la printf
 806dcd0 (164) e85f7f0000        call                      (to 8075c34 <init_texts>)
 806dcd5 (169) e8dab70000       call                      (to 80794b4 <init_page>)
 806dcda (16e) 68a0032608       pushl  $0x82603a0

Per risolvere velocemente il problema e' sufficiente noppare tutte 3 le call e il programma partira' senza creare lo splash screen e senza visualizzare la scritta su console.
Per una soluzione piu' "elegante" si potrebbe mettere all'indirizzo 806dcc6 una istruzione di jmp all'indirizzo 806dcda; e allora facciamolo :-)
Sostituiamo l'opcode dell'istruzione all'indirizzo 806dcc6 con l'opcode, che ora ci calcoliamo, della jmp:
jmp: EB
offset: 12
Opcode da sotituire EB12, che poi andremo a completare con 909090 per coprire lo stesso numero di byte della pushl.
Andate in biew ed effettuate le modifiche; ora non c'e' piu' nemmeno lo splash screen iniziale ;-)

Ok, credo che abbiamo finito!! Adesso il programma e' funzionante, privo di ogni schifezza che ci inviti a registrarlo... se i programmatori hanno scritto il programma bene come l'hanno protetto conviene cestinare il programma stesso.... ma fortunatamente spesso non e' cosi' ;-)

bye to all
syscalo

Note finali 

A lavorare su questo programma mi sono divertito e ho imparato anche alcune cose nuove.
I consigli che vi posso dare sono questi:
· provate ad usare il gdb e settare breakpoint sulle funzioni citate sopra e girare un po' live tra il codice.
· leggetevi le pagine di info delle procedure che incontrate (ad es. info gtk e poi andate nell'indice delle funzioni e cercate quella che vi interessa) perche' capirete meglio cio' che sta facendo il programma
· ed infine provate a fare qlc voi, e sperimentate! E nel caso trovaste un buon approccio alternativo al mio fatemelo sapere.

Per chi vuole esercitarsi suggerisco di provare a trovare la parte di programma che genera il panel contenente l'immagine gialla SHAREWARE - PLEASE REGISTER. Io l'ho fatto, ma non l'ho riportato qui per istigarvi a provare voi!

Un saluto a tutta la UIC, al chan #crack-it (anche se frequento pochissimo) e a tutti coloro che si danno da fare nel mondo informatico, sia chi programma, sia chi programma all'inverso ;-Þ
 
Per ultimo, ma solo per metterlo in risalto, un mega kiss a colei che rende stupenda ogni mia giornata ;-))

Disclaimer

Io non ho lavorato su questo programma per usarlo gratuitamente, altrimenti avrei tolto solo il time limit! L'ho fatto perche' per me e' stata una sfida a scoprire qlc di nuovo e spero lo sia anche per voi. Se il programma vi piace sganciate qualche soldo hai programmatori che cmq ci hanno dedicato un po' del loro tempo.


UIC's page of reverse engineering, scegli dove andare:
Home   Anonimato   Assembly    CrackMe   ContactMe   Forum   Iscrizione
Lezioni    Links   Linux   NewBies   News   Playstation
Tools   Tutorial   Search   UIC Faq
UIC