
Un plugin Ghidra per individuare i confini dei file oggetto.
Plugin Ghidra per l'interfaccia DeepCut / CodeCut
CodeCut consente a un utente di assegnare funzioni a file oggetto in Ghidra, e quindi di interagire con il binario a livello di file oggetto. Le funzioni vengono assegnate ai file oggetto impostando il campo Namespace nel database di Ghidra. DeepCut tenta di stabilire i confini iniziali dei file oggetto che l'utente può poi regolare utilizzando la finestra CodeCut Table.
La maggior parte dei binari proviene da più file di codice sorgente. Durante il reversing, gli analisti di RE spesso sviluppano un senso di quali funzioni sono correlate e quindi probabilmente appartenevano allo stesso file sorgente. CodeCut consente all'analista di sviluppare un'ipotesi come "Penso che questo blocco di funzioni siano funzioni del sistema operativo." Ora, se ci sono funzioni inesplorate in quella regione, appariranno nel disassembly e nella decompilazione come OS::FUN_XXXXXXXX invece di semplicemente FUN_XXXXXXXX. Questo porta a una comprensione più rapida di cosa potrebbero fare le funzioni quando vengono visualizzate nel contesto.
Seguire le normali procedure di installazione delle estensioni di Ghidra. Copiare gli zip delle estensioni CodeCut e DeepCut in $GHIDRA_INSTALL_DIR/Extensions, poi nella finestra principale di Ghidra selezionare File -> Install Extensions e selezionare le caselle CodeCut e DeepCut. Ghidra vi dirà che deve riavviarsi. Poiché Ghidra ora richiede che i plugin corrispondano solo alla versione major/minor della versione base e non alle patch version, prevediamo di rilasciare solo versioni major/minor pari.
NOTA: Dopo il riavvio e il caricamento di una finestra CodeBrowser, Ghidra vi dirà che ha trovato nuovi plugin e vi chiederà se desiderate configurarli. In questa finestra appare solo CodeCut. Questo perché DeepCut è un analizzatore "one-shot" (è comunque installato).
Sia CodeCut che DeepCut si basano sull'estensione nativa PyGhidra e non sono compatibili con Jython. CodeCut usa Python nativo per indovinare i nomi dei moduli. L'inferenza del modello di DeepCut viene eseguita in Python nativo.
CodeCut:
DeepCut:
Per installare le dipendenze, eseguire:
pip install nltk
pip install torch torch-geometric networkx scipy
usando l'installazione Python collegata al vostro PyGhidra.
DeepCut è preferibile eseguirlo come analizzatore one-shot dopo l'auto-analisi iniziale. Selezionare Analysis -> One Shot -> Deepcut. Dopo l'esecuzione di DeepCut, è possibile visualizzare i risultati guardando il campo Namespace nella vista Symbol Table.

Dopo l'esecuzione di DeepCut, è possibile interagire a livello di file oggetto con la vista CodeCut Table. Selezionare Window -> CodeCut Table per visualizzare la tabella. La tabella CodeCut è essenzialmente un insieme combinato di symbol table, una per ogni modulo.
È possibile far indovinare a CodeCut i nomi dei moduli (in base ai riferimenti alle stringhe) scegliendo Analysis -> Guess Module Names nella finestra CodeCut Table. Questo è utile se il vostro eseguibile di destinazione ha molti debug string. Lo script di indovinamento dei nomi tenta prima di trovare i nomi dei file sorgente, poi ripiega sulle stringhe (incluse bigrammi e trigrammi) che vengono ripetute più volte.
È possibile dividere/combinare i file oggetto facendo clic con il tasto destro su un oggetto e scegliendo Split Namespace Here / Combine Namespaces. È possibile spostare le funzioni tra i file oggetto (modificando i confini dei file oggetto) trascinandole e rilasciandole.
CodeCut contiene due opzioni per esportare un intero modulo o un sottointervallo di un modulo come C ricompilabile sotto il menu Export quando si fa clic con il tasto destro su un modulo nella tabella CodeCut. Questa funzionalità è contrassegnata come SPERIMENTALE e non è ben testata.

CodeCut ora ha un'opzione grafica per visualizzare le interazioni / la gerarchia dei moduli all'interno di un binario. Aggiungete namespace alla vista grafica facendo clic con il tasto destro su una funzione nella CodeCut Table e scegliendo Add Namespace to Graph. È possibile rimuovere moduli dal grafico facendo clic con il tasto destro e scegliendo Show Namespaces in Graph Filter.
Sebbene sembri possibile fare clic con il tasto destro sui nomi dei moduli sul lato destro, CodeCut in realtà presta attenzione a quale funzione è evidenziata nella tabella. Quindi, ad esempio, se avete una funzione in object3 evidenziata e fate clic con il tasto destro sulla casella grigia di object2 a sinistra e fate clic su Combine/Split o Rename Namespaces, CodeCut eseguirà l'operazione a partire dalla funzione che avete evidenziato in object3.
CodeCut tenta di ordinare i namespace in base al loro indirizzo di partenza. CodeCut potrebbe sembrare elencare i moduli fuori ordine, ma ciò è solitamente dovuto a irregolarità del disassembly di Ghidra. Ad esempio, supponiamo di avere una mappa di memoria come questa:
object2: 0x00010000 - 0x00018000
object3: 0x00018004 - 0x00020000
...
object50: 0x00480000 - 0x00480a00
Supponiamo che la funzione a 0x00480000 faccia un branch o un salto a un indirizzo 0x00016008. Questo dovrebbe essere un nuovo punto di ingresso di funzione, ma se solo una funzione lo usa, Ghidra potrebbe non etichettarlo come punto di ingresso di funzione e considerarlo semplicemente parte di FUN_00480000. Ciò significa che l'intervallo effettivo di object50 è 0x00016008 - 0x00480a00. E così object50 apparirà tra object2 e object3 nella tabella. CodeCut scrive gli intervalli dei moduli nel log dell'applicazione di Ghidra per aiutare a eseguire il debug di questo problema. In questo caso, definire 0x00016008 come funzione farà sì che i limiti di object50 abbiano i valori corretti e object50 apparirà nel posto giusto nella tabella.
Le funzioni che vengono definite dopo l'esecuzione dell'analisi DeepCut vengono per impostazione predefinita aggiunte al namespace Global. In futuro prevediamo di aggiungere una funzionalità che le aggiunga automaticamente al namespace più vicino, o di fornire un meccanismo per assegnare più facilmente singole funzioni direttamente a un namespace specifico.
Istruzioni di compilazione specifiche sono fornite nelle sottocartelle DeepCut e CodeCut.