Pagina Principale di REC | Esempio d'uso di REC | English Version | CG's Home page | E-mail : caprino@netcom.com
| Sintassi delle opzioni della linea di comando |
|---|
REC usa molte tecniche e informazioni da varie sorgenti in aggiunta alle informazioni che REC stesso estrae dal file eseguibile.
REC e' anche altamente configurabile, cioe' ha molte opzioni per configurate l'uscita ed abilitare o disabilitare i suoi algoritmi per produrre diversi tipi di file di uscita.
REC puo' funzionare in modalita' interattiva o automatica. Puo' essere invocato con la seguente sintassi:
rec [{+|-}optionname ...] exec_file
Per attivare un'opzione, precederne il nome con un segno + (piu'). Per disabilitare un'opzione, precederne il nome da un segno - (meno). Per avere la lista di tutte le opzioni e il loro valore corrente, usare il seguente comando:
rec +help
Un'altra opzione molto importatne e' +interactive, che abilita una sessione interattiva.
Molte delle opzioni sono usate per debuggare il programma o per configurare i file di uscita. Una lista completa delle opzioni richiede una comprensione degli algoritmi e delle fasi che REC usa per trasformare un programma eseguibile in un file sorgente. Se non si conosce il significato di un'opzione, si possono fare esperimenti abilitando l'opzione e controllando se il file prodotto e' piu' chiaro. Si noti che alcune opzioni sono valide solo se un'altra opzione e' abilitata.
Lo stesso set di opzioni e' disponibile indipendentemente dalla combinazione di host/target.
| Il funzionamenti di REC |
|---|
Il seguente diagramma a blocchi mostra l'interazione di REC con i file letti e scritti:
L'input minimo a REC e' il binario del file eseguibile. Per esempio:
rec file.exe
Se file.exe e' in uno dei formati oggetti riconosciuti, esso verra' letto, e un file.rec verra' prodotto usando le opzioni di default, senza ulteriore intervento da parte dell'utente.
Malgrado cio', poiche' la decompilzazione e' un processo molto difficile, piu' informazioni aggiuntive possono essere fornite, migliore sara' l'uscita.
Per esempio, algoritmi alternativi possono essere selezionati, in base al compilatore usato per compilare il file eseguibile, o in base alla leggibilita' del file di uscita. Per cambiare una delle opzioni di default, REC legge il contenuto del file .recrc (rec.cfg su MSDOS e Windows). Ogni linea in questo file contiene un'opzione, come se quell'opzione fosse stata fornita sulla linea di comando. Per esempio, se si vuole che REC parta sempre in modalita' interattva, e che stampi sempre le costanti numeriche in formato esadecimale, si possono usare le seguenti linee nel file .recrc:
+interactive
+hexconstQueste opzioni possono essere anche specificate sulla linea di comando. Per esempio, per eseguire REC in modalita' automatica anche se il file .recrc ha un'opzione +interactive, si esegua REC con la seguente linea di comando:
rec -interactive file.exe
File comandi e gestione di formati sconosciuti
Il file eseguibile di ingresso puo' essere in un formato non ancora riconosciuto da REC. In tal caso, REC non ha idea di quali aree del file contengono codice, quali dati e quali contengono informazioni ausiliarie. In questi casi, queste informazioni possono essere fornite in un file testo, chiamato 'file comandi'. In questo file comandi possono anche essere fornite molte altre informazioni tra cui tipi predefiniti, indirizzi di funzioni e opzioni di configurazione. Per esempio, REC puo' essere eseguito con la seguente linea di comando:
rec file.cmd
dove file.cmd ha il seguente contenuto:
#!wrec
option: +hexconstfile: file.exe 0x50 0x53
region: 0x80100000 0x801009b4 0x800 data
region: 0x801009b4 0x8010c1e8 0x11b4 text
region: 0x8010c1e8 0x80120800 0xc888 datasymbol: 0x80107fe0, 0x80108077 T CrearImage()
symbol: 0x80108078, 0x801080d7 T LoadImage(char *, int, int)
symbol: 0x801080d8, 0x8010813b T StoreImage()
symbol: 0x8010813c, 0x801081ff T MoveImage(char *, int, int)patterns: libmips.pat
Il file inizia con l'identificatore #!wrec. Questa deve essere la prima linea. Ogni linea seguente contiene un comando seguito da un carattere di due punti (:) e da qualche argomento. Linee commento sono precedute dal carattere '#'. Il resto della linea dopo il '#' e' ignorato.
Ogni comando option: cambia una delle opzioni di REC. Queste opzioni modificano quelle eventualmente fornite sulla linea di comando.
Il comando file: specifica il file eseguibile da leggere. Ci puo' essere un solo comando file:. Dopo il nome del file, l'argomanto magic specifica un identificatore opzionale che deve essere presente all'inizio del file eseguibile (magic number).
Il comando region: specifica la mappa del file eseguibile. Gli argomenti sono l'indirizzo di inizio e di fine a cui e' presente una sezione codice o dati, oltre all'offset nel file dove la sezione inizia. Si noti che non viene eseguito nessun caricamento nella memoria del computer. Gli indirizzi sono solo usati per risolvere i riferimenti nelle istruzioni di salto e chiamata a funzione. L'ultimo argomento e' il tipo della regione, e influenza le operazioni eseguite sulla regione. Solo le regioni marcate text sono prese in cosiderazione per essere decompilate. Le regioni dati sono scandite per trovare le stringhe ASCII.
Nell'esempio:region: 0x80100000 0x801009b4 0x800 data start addr end addr file region offset typeIl comando symbol: specifica l'indirizzo di inizio e di fine delle funzioni oltre al nome della funzione ed eventualmente una lista di parametri passati alla funzione. L'indirizzo di fine e' opzionale, e puo' essere calcolato automaticamente da REC. Anche la lista dei parametri secondo il formato ANSI-C e' opzionale, ed in realta' se ne sconsiglia l'uso, poiche' tutti i tipi dovrebbero essere definiti in un file tipi (si veda il comando types: piu' avanti). E' meglio semplicemente specificare che il simbolo e' una funzione aggiungendo ( ).
Il comando patterns: specifica uno o piu' file contenenti una lista di stringhe esadecimali (pattern) e di nomi simbolici. REC cerchera' ogni pattern nel file eseguibile, e se trovato, assegnera' il nome simbolico all'indirizzo corrispondente all'inizio del pattern. Ecco un esempio di un file di pattern:
open() size: 16
A0 00 0A 24 08 00 40 01
00 00 09 24 00 00 00 00
;
lseek() size: 16
A0 00 0A 24 08 00 40 01 01 00 09 24 00 00 00 00
;
...Ogni pattern puo' essere lungo fino a 256 bytes. Questi pattern sono talvolta chiamati signatures nella letteratura. L'opzione size: indica a REC quanti byte sono occupati in totale dalla funzione nel file eseguibile. Per esempio, si puo' specificare un pattern di 16 bytes per una funzione di 3000 bytes.
Il comando types: specifica uno o piu' file ELF con informazioni simboliche STAB. Questo file viene letto per ottenere i tipi predefiniti e i prototipi delle funzioni. Per creare un file di tipi, si puo' usare il compilatore di sistema Linux (o il compilatore gcc su una workstation Solaris) con l'opzione -g. Per esempio, per indicare a REC i tipi delle funzioni definiti nel file di sistema string.h, si puo' compilare il seguente sorgente C con la linea di comando "gcc -g -c string.c":
/* string.c - types defined by string.h */
char *strcmp(const char *s1, const char *s2) { }
char *strncmp(const char *s1, const char *s2, int len) { }
char *strcpy(char *dst, const char *src) { }
char *strchr(const char *, int ch) { }
....REC aggiungera' i prototipi delle funzioni alle informazioni del simboli specificati dai comandi symbol: o a quelli trovati dai comandi patterns:. Il codice compilato per le funzioni e' ignorato, cosi' come i loro indirizzi. Si noti che il compilatore non genera informazioni simboliche per le funzioni che non sono definite nel file, da cui i caratteri { } alla fine di ogni funzione.
| I file prodotti da REC |
|---|
Quando REC raggiunge la fine del file comandi, e/o quando REC ha finito di analizzare il file eseguibile, esso entrera' in modalita' interattiva, o iniziera' a decompilare il file eseguibile. Al momento ci possono essere due tipi di file prodotti:
- Se e' stata specificata l'opzione +disasmonly, verra' prodotto un file con l'estensione .dis. In questo file verra' disassemblata ogni regione con l'attributo text, mentre verra' eseguito un dump esadecimale di ogni regione con l'attributo data;
- senza altre opzioni, verra' prodotto un file con l'estensione .rec con una rappresentazione C di ogni procedura nelle regioni text. La rappresentazione C non e' perfetta, e non puo' essere fornita a un compilatore per ricreare il binario originale. Il suo scopo e' fornire all'utente una comprensione migliore della struttura del programma. Il seguente e' un esempio del sorgente C prodotto:
fill_buff() { L8006be08: r7 = buf_2; r6 = r4; r8 = r6 + 0x30; L8006be18: do { r7->f0 = r6->f0; r7->f4 = r6->f4; r7->f8 = r6->f8; r7->f12 = r6->f12; _t = r6 + 0x10 - r8; r7 = r7 + 0x10; } while(_t != 0x0); L8006be44: return(0x0); } ... symbol: 0x8006BE08, 0x8006BE4B T fill_buff() symbol: 0x8006BE4C, 0x8006BE73 T L8006BE4C() symbol: 0x8006BE74, 0x8006BEB7 T L8006be74()Le linee symbols: alla fine del file possono essere modificate (per esempio fornendo un nome per la funzione L8006BE4C) e quindi copiate nel file .cmd per un'altro passo di decompilazione.
Altri file di uscita possono essere prodotti se una delle opzioni di debugging e' stata abilitata. Questi file sono usati per produrre la rappresentazione intermedia del file decompilato durante stadi diversi del processo di decompilazione.
| Lista delle Opzioni |
|---|
La seguente e' la lista delle opzioni supportate da REC. Le opzioni sono presentate in ordine gerarchica, cioe' alcune opzioni sono significative solo se un'opzione precedente e' stata abilitata.
- +/-help
questa opzione stampa semplicemente la lista di tutte le opzioni sul terminale, e quindi termina la sessione.- +/-interactive
Abilita/disabilita la modalita' interattiva. Quando in modalita' interattiva, non viene prodotto nessun file di uscita. Invece, e' possibile ispezionare informazioni usate internamente quali la lista delle label, dei salti, delle stringe ecc. Si puo' anche eseguire un visore esadecimale, e decompilare singole funzioni in ordine casuale.- +/-silent
questa opzione disabilita la produzione delle informazioni di stato durante il processo di decompilazione. Se l'opzione e' disabilitata, REC stampa sullo schermo l'attivita' corrente- +/-validatestr
questa opzione abilita l'analisi del file eseguibile per cercare le stringhe testo ASCII.- +/-dfoprocs
questa opzione e' usata per dire a REC di decompilare solo le procedure che sono raggiungibili dal punto di ingresso del programma. L'ordine usato da REC e' dal fondo alla cima (bottom-up) cioe' la funzione piu' lontana dal punto di ingresso viene decompilata per prima; la procedura di ingresso viene decompilata per ultima. Questo permette una piu' accurata acquisizione di informazioni come il numero di parametri e il tipo di ogni parametro.- +/-locals
questa opzione abilita/disabilita la conversione di registri e riferimenti allo stack in argomenti della funzione e variabili locali.- +/-rdonly
questa opzione cerca di sostituire riferimenti a registri che sono assegnati una sola volta con quella di un parametro formale.- +/-simplifyexprs
quando abilitata, sequenze speciali di istruzioni sono convertite in espressioni piu' regolari. Per esempio, un'istruzione come "EAX = EAX ^ EAX" e' convertita nell'espressione "EAX = 0". Queste conversioni aiutano l'analizzatore del flusso dei dati.- +/-doblocks
questa opzione costruisce il flusso di controllo per ogni procedura. Deve essere abilitata per poter utilizzare l'analizzatore del flusso dei dati (opzione +compsets).- +/-compsets
questa opzione abilita/disabilita l'analisi dell'uso dei registri. Questa analisi aiuta notevolmente nell'eliminazione delle variabili registro nel passo seguente. Se e' disabilitata, ci saranno moltissimi riferimenti ai registri nel file di uscita.- +/-compactexprs
questa opzione abilita l'eliminazione delle variabili temporanee contenute in registri. Il numero di linee prodotte in uscita e' notevolmente ridotto da questa opzione, ma la complessita' di ogni linea aumenta. Per esempio, le seguenti istruzioni:EAX = 1; EAX = EAX + *EBX; PUSH(EAX); CALL 0x1000possono essere compresse nella seguente espressione:
L1000(1 + *EBX);- +/-types
questa opzione abilita il riconoscimento dei tipi delle variabili. Il riconoscimento dei tipi e' solo parzialmente implementato.- +/-compactifs
Questa opzione converte le sequenze di istruzioni confronto+salto in statement if-goto-else-goto. Questo e' il primo stadio in cui viene prodotto codice C. Gli stadi seguenti cercano solamente di migliorare la struttura del programma prodotto in uscita con l'uso di statement C piu' complessi.- +/-displaylabels
Quando questa opzione e' abilitata, le label sono sempre stampate nel file di uscita, anche se non ci sono statement goto a quell'indirizzo. Questo e' utile per confrontare l'uscita C con l'uscita del disassemblatore.- +/-dostmts
Questa opzione abilita/disabilita la strutturazione dell'uscita in statement C piu' complessi. Ogni tipo di statement puo' essere individualmente abilitato o disabilitato.- +/-donullgotos
Questa opzione abilita REC a rimuovere gli statement goto che saltano allo statement (sequenzialmente) successivo.- +/-doifs
durante la decompilazione di uno statement, gli statement if( ) sono sempre rappresentati da sequenze if-goto-else-goto. Questa rappresentazione semplifica il movimento degli statement in posizioni diverse nell'output. Quando questa opzione e' abilitata, REC cerca di rimuovere gli statement goto nei blocchi vero e falso dell'if( ), sostituendo il codice preso dalla destinazione dello statement goto, o rimuovendo la parte else.- +/-doloops
quando questa opzione e' abilitata, l'analisi dei loop viene usata per sostituire statement if-goto in statement while o do-while.- +/-dowhile
abilita/disabilita il riconoscimento degli statement while( ).- +/-dofor
quando questa opzione e' abilitata, REC cerca di compattare gli statement while o do-while in un singolo statement for( ).- +/-dopackloops
questa opzione abilita la riscrittura di cicli while( ) infiniti in cicli do-while, quando uno statement alla fine del blocco while( ) causerebbe una continuazione o un'uscita dal ciclo- +/-dopackstmt
questa opzione abilita REC a compattare gli statement, principalmente statement if( ). Per esempio, gli operatori booleani && e || sono usati per fondere due statement if( ) consecutivi. Inoltre, l'operatore di assegnamento condizionale (? :) e' usato quando ci sono sequenze if(e1) v = e2; else v = e3.- +/-doswitch
abilita/disabilita il riconoscimento degli statement switch( )- +/-dosort
questa opzione cerca di ridurre la profondita' degli statement condizionali cercando di riorganizzare i blocchi di statement- +/-flag16
questa opzione forza il disassemblatore i386 a operare in modo reale (16-bit) invece del modo di default (protected, o 32-bit). Questa opzione e' solo valida quando si decompilano file eseguibili per i processori Intel.- +/-int16
questa opzione specifica che gli interi sono 16 bit invece di 32 bit. Questo e' utile per vecchi processori come l'8086 o il 68000 usato nei primi Macintosh.Potro' aggiungere altre opzioni man mano che nuove caratteristiche vengono implementate.
Cose che devo aggiungere (nel mio tempo libero):
Copyright (C) 1997 - 1998 Backer Street Software -- Tutti i diritti riservati.
Aggiornato il 10 maggio 1998
Pagina Principale di REC | Esempio d'uso di REC | English Version | CG's Home page | E-mail : caprino@netcom.com