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 ;-)
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.
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.
<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!!
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. Conclusioni
A lavorare su questo programma mi sono divertito e ho imparato anche alcune cose nuove.
I consigli che vi posso dare sono questi:
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.