La mutazione - unshareware version
Pubblicato da syscalo il 22/06/2000
Livello intermedio

Introduzione

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!!

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 ;-))

Programmi usati

Iniziamo

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!
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:
guardate il nome della funzione in cui vi siete fermati, e vi accorgerete che sono tutte ricollegabili ai sottomenu del menu Help, o alla barra del titolo della finestra del programma o altre cose che inducono cmq a scartare quelle posizioni.
guardate da dove vengono chiamate le funzioni in cui siete; arriverete a una dove trovate queste info:


<see_us> 
808192c ( ) 55 pushl %ebp (CL 806eb6f <CB_register_ok+3>) (CL 806eb8b <CB_msgbox_s0+3>)
<--chiamate da una funzione "register" e da una "msgbox"
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:
e' ancora presente il bottone che conteneva l'immagine (pur essendo rimasta solo una striscia) e se ci clickate sopra apre il browser e tenta di connettersi al sito, inoltre le funzioni che lavorano sull'immagine generano un errore (ma possiamo trascurare questa cosa).
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' ;-)

Conclusioni

A lavorare su questo programma mi sono divertito e ho imparato anche alcune cose nuove.
I consigli che vi posso dare sono questi:

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 ;-P

Attenzione

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 ai programmatori che cmq ci hanno dedicato un po' del loro tempo.