
Estensione Ghidra per il reverse engineering del firmware PC, che fornisce loader per option ROM PCI, Intel Flash Descriptor, coreboot CBFS e volumi firmware UEFI, oltre a script helper UEFI per il recupero dei tipi e l'identificazione dei GUID.
Vari moduli per Ghidra per assistere nel reverse engineering del firmware PC. Questo è stato accettato come progetto coreboot per GSoC 2019.
Sono richiesti JDK 21 (o successivo) e Ghidra 12.0 (o successivo).
Viene utilizzato il sistema di compilazione Gradle standard di Ghidra. Impostare la variabile
d'ambiente GHIDRA_INSTALL_DIR prima della compilazione, oppure impostarla come proprietà Gradle
(utile per la compilazione in un IDE):
$ export GHIDRA_INSTALL_DIR="/percorso/di/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/percorso/di/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIRdeve puntare alla directory che contienesupport/buildExtension.gradle. Ad esempio, gli utenti del pacchetto Flathub dovrebbero usare/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra.
Lo ZIP del modulo verrà generato in dist/. Usare File > Install Extensions e
selezionare il segno più verde per sfogliare fino all'estensione. Riavviare Ghidra quando richiesto.
Per un funzionamento corretto, il plugin dovrebbe essere compilato con lo stesso JRE usato
dalla propria installazione di Ghidra. Se sono installati più ambienti runtime Java,
selezionare il JRE corretto impostando la variabile d'ambiente JAVA_HOME
prima della compilazione.
Aggiungere una option ROM PCI a un progetto Ghidra. Le option ROM x86 legacy possono essere caricate direttamente per l'analisi. Assicurarsi che il formato binario sia impostato su x86 PCI Option ROM e importare il binario.
Le option ROM UEFI o le option ROM che contengono più di un'immagine dovrebbero essere importate usando il loader del filesystem. Quando viene richiesto di selezionare una modalità di importazione, selezionare File system. Le immagini contenute nella option ROM verranno visualizzate e possono essere importate per l'analisi. Le immagini x86 legacy verranno gestite dal loader x86 PCI Option ROM e le immagini UEFI dal loader PE32 (la compressione è supportata). Le informazioni per ciascuna immagine possono essere visualizzate selezionando Get Info nel menu contestuale.
Aggiungere un'immagine firmware supportata a un progetto Ghidra. Il loader per immagini firmware supporta immagini Intel con Flash Descriptor, immagini coreboot con layout FMAP/CBFS e volumi firmware UEFI. La modalità di importazione File system può essere usata per visualizzare i file incorporati nell'immagine firmware specificata.
Notare che alcune immagini firmware UEFI possono memorizzare volumi firmware annidati all'interno
di file freeform/raw (o sezioni FFS freeform/raw). Tali file possono essere importati
come volumi firmware selezionando Open File System nel menu contestuale
per il file freeform/raw specificato. Se non viene trovato alcun volume firmware annidato, verrà
visualizzato un messaggio di errore (No file system provider for...).
Lo script di supporto è incluso nella directory ghidra_scripts del plugin, che dovrebbe essere aggiunta automaticamente all'elenco delle directory degli script in Ghidra.
Eseguire lo script di supporto UEFI selezionando UEFIHelper.java nella finestra Script Manager (accessibile da Window -> Script Manager).
Per modificare la libreria di tipi di dati UEFI, modificare il template PRF in
data/gen_prf.sh come necessario e generare nuovi file PRF. Aprire il file PRF generato
in File -> Parse C Source. Compilare la libreria di tipi di dati aggiornata
selezionando Parse to File.... Sovrascrivere le librerie di tipi di dati originali
in data e ricompilare il plugin.
Questi sono alcuni progetti interessanti correlati al reverse engineering UEFI:
Apache 2.0, con alcune eccezioni:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c è una versione leggermente modificata di
Decompress.c di uefi-firmware-parser (che a sua volta deriva da
l'originale in EDK2 BaseTools).
Il loader FS IFD in src/main/java/firmware/ifd ha usato il parser di
UEFITool come riferimento.
Il database GUID in data/guids.csv è tratto da UEFITool.
Le librerie di tipi di dati UEFI in data/uefi_*.gdt sono state generate con
data/gen_prf.sh, che è parzialmente basato sulla definizione del parser UEFI
di una pull request Ghidra di wrffrz. Queste librerie di tipi di dati usano
header di EDK2 MdePkg.
GhidraVitaLoader di xerpi è stato usato come riferimento per alcune parti dello script di supporto UEFI.