
Un Esploratore di Tracce per Reverse Engineers
Tenet è un plugin per IDA Pro per esplorare tracce di esecuzione. L'obiettivo di questo plugin è fornire controlli più naturali e umani per navigare tracce di esecuzione rispetto a un dato binario. Questo lavoro nasce dal desiderio di ricercare metodi nuovi o innovativi per esaminare e distillare pattern di esecuzione complessi nel software.
Per ulteriori informazioni su questo progetto, leggi il post sul blog relativo al suo rilascio iniziale.
Un ringraziamento speciale a QIRA / geohot et al. per l'ispirazione.
Tenet è un plugin Python 3 multipiattaforma (Windows, macOS, Linux). Non richiede dipendenze di terze parti, rendendo il codice sia portabile che facile da installare.
Dalla console Python del tuo disassemblatore, esegui il seguente comando per trovare la directory dei plugin:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")Copia il contenuto della cartella /plugins/ di questo repository nella directory indicata.
Riavvia il tuo disassemblatore.
Questo plugin è supportato solo per IDA 7.5 e versioni successive.
Una volta installato correttamente, apparirà una nuova voce di menu nel disassemblatore. Può essere utilizzata per caricare tracce di esecuzione raccolte esternamente in Tenet.
Poiché questo è il primo rilascio, Tenet accetta solo tracce di testo semplici e leggibili. Consulta il readme sul tracing in questo repository per ulteriori informazioni sul formato delle tracce, limitazioni e tracer di riferimento.
Durante l'uso di Tenet, il plugin "dipingerà" tracce per indicare il flusso di esecuzione in avanti (blu) e all'indietro (rosso) rispetto alla posizione corrente nella traccia attiva.
Per passare avanti o indietro nel tempo, è sufficiente scorrere mentre si passa sopra la timeline sul lato destro del disassemblatore. Per saltare le chiamate di funzione, tieni premuto SHIFT durante lo scorrimento.
La timeline della traccia sarà ancorata sul lato destro del disassemblatore. Questo widget viene utilizzato per visualizzare diversi tipi di eventi lungo la timeline e per eseguire la navigazione di base come descritto sopra.
Cliccando e trascinando sulla timeline, è possibile zoomare su una sezione specifica della traccia di esecuzione. Questa azione può essere ripetuta più volte per raggiungere la granularità desiderata.
Facendo doppio clic sul puntatore di istruzione nella finestra dei registri, questo verrà evidenziato in rosso, rivelando tutte le posizioni in cui l'istruzione è stata eseguita lungo la timeline della traccia.
Per saltare tra le esecuzioni, scorri verso l'alto o verso il basso mentre passi sopra il puntatore di istruzione evidenziato.
Inoltre, puoi cliccare con il tasto destro nel listing del disassemblatore e selezionare una delle voci di menu basate sulla navigazione per cercare rapidamente l'esecuzione di un'istruzione di interesse.
Il tasto rapido nativo F2 di IDA può anche essere utilizzato per impostare breakpoint su istruzioni arbitrarie.
Facendo doppio clic su un byte nelle viste stack o memoria, vedrai immediatamente tutte le letture/scritture su quell'indirizzo visualizzate lungo la timeline della traccia. Il giallo indica una lettura di memoria, il blu indica una scrittura di memoria.
I breakpoint di memoria possono essere navigati usando la stessa tecnica descritta per i breakpoint di esecuzione. Fai doppio clic su un byte e scorri mentre passi sopra il byte selezionato per portare la traccia a ciascuno dei suoi accessi.
Cliccando con il tasto destro su un byte di interesse avrai opzioni per cercare tra lettura/scrittura/accesso di memoria se hai in mente un'azione di navigazione specifica.
Per navigare la vista memoria verso un indirizzo arbitrario, clicca sulla vista memoria e premi G per inserire un indirizzo o un simbolo del database a cui portare la vista.
È possibile impostare un breakpoint di memoria su una regione di memoria evidenziando un blocco di memoria e facendovi doppio clic per impostare un breakpoint di accesso.
Come per i normali breakpoint di memoria, passare sopra la regione e scorrere può essere utilizzato per spostarsi tra gli accessi effettuati alla regione di memoria selezionata.
Nel reverse engineering, è piuttosto comune trovarsi in situazioni in cui ci si chiede "Quale istruzione ha impostato questo registro al suo valore corrente?"
Usando Tenet, puoi cercare all'indietro quell'istruzione con un solo clic.
Cercare all'indietro è di gran lunga la direzione più comune per navigare tra le modifiche ai registri... ma per destrezza puoi anche cercare avanti alla successiva assegnazione del registro usando la freccia blu sulla destra del registro.
Una semplice 'shell' è fornita per navigare a timestamp specifici nella traccia. Incollare (o digitare...) un timestamp nella shell con o senza virgole è sufficiente.
Usando un punto esclamativo, puoi anche cercare una 'percentuale' specifica nella traccia. Inserendo !100 si cercherà l'ultima istruzione nella traccia, mentre !50 cercherà circa al 50% del percorso della traccia. !last cercherà l'ultima istruzione navigabile visualizzabile nel disassemblatore.
Tenet è dotato di due temi predefiniti -- uno 'chiaro' e uno 'scuro'. A seconda dei colori attualmente utilizzati dal tuo disassemblatore, Tenet tenterà di selezionare il tema che sembra più appropriato.
I file dei temi sono memorizzati come semplici JSON su disco e sono altamente configurabili. Se non sei soddisfatto dei temi o dei colori predefiniti, puoi creare i tuoi temi e semplicemente inserirli nella directory dei temi utente.
Tenet ricorderà la tua preferenza di tema per i caricamenti futuri.
Tempo e motivazione fondi permettendo, i lavori futuri potrebbero includere:
Accolgo contributi esterni, issue e richieste di funzionalità. Per favore, invia qualsiasi pull request al branch develop di questo repository se desideri che vengano considerati per un rilascio futuro.