REC - Guida Utente per il Compilatore per Reverse Engineering (versione italiana)

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
+hexconst

Queste 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: +hexconst

file: file.exe 0x50 0x53
region: 0x80100000 0x801009b4 0x800 data
region: 0x801009b4 0x8010c1e8 0x11b4 text
region: 0x8010c1e8 0x80120800 0xc888 data

symbol: 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

types: string.o
types:
stdio.o

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    type

Il 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:

  1. 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;
  2. 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.

Potro' aggiungere altre opzioni man mano che nuove caratteristiche vengono implementate.


Ulteriori sviluppi:

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