
Ghidra-Erweiterung für das Reverse Engineering von PC-Firmware, die Loader für PCI-Option-ROMs, Intel Flash Descriptor, coreboot CBFS und UEFI-Firmware-Volumes bereitstellt, sowie UEFI-Hilfsskripte für die Typwiederherstellung und GUID-Identifizierung.
Verschiedene Module für Ghidra zur Unterstützung der Reverse Engineering von PC-Firmware. Dies wurde als coreboot-Projekt für GSoC 2019 angenommen.
JDK 21 (oder neuer) und Ghidra 12.0 (oder neuer) sind erforderlich.
Ghidras standardmäßiges Gradle-Build-System wird verwendet. Setzen Sie die Umgebungsvariable
GHIDRA_INSTALL_DIR vor dem Build, oder legen Sie sie als Gradle-Eigenschaft fest (nützlich
für das Erstellen in einer IDE):
$ export GHIDRA_INSTALL_DIR="/path/to/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/path/to/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIRsollte auf das Verzeichnis zeigen, dassupport/buildExtension.gradleenthält. Beispielsweise sollten Benutzer des Flathub-Pakets Folgendes verwenden:/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra.
Das Modul-ZIP wird in dist/ ausgegeben. Verwenden Sie Datei > Erweiterungen installieren und
wählen Sie das grüne Plus, um zur Erweiterung zu navigieren. Starten Sie Ghidra bei Aufforderung neu.
Für eine ordnungsgemäße Funktionalität sollte das Plugin mit derselben JRE erstellt werden, die
von Ihrer Ghidra-Installation verwendet wird. Wenn mehrere Java-Laufzeitumgebungen
installiert sind, wählen Sie die richtige JRE aus, indem Sie die Umgebungsvariable JAVA_HOME
vor dem Build setzen.
Fügen Sie ein PCI-Option-ROM zu einem Ghidra-Projekt hinzu. Legacy-x86-Option-ROMs können direkt zur Analyse geladen werden. Stellen Sie sicher, dass das Binärformat auf x86 PCI Option ROM gesetzt ist, und importieren Sie die Binärdatei.
UEFI-Option-ROMs oder Option-ROMs, die mehr als ein Image enthalten, sollten mit dem Dateisystem-Loader importiert werden. Wenn Sie aufgefordert werden, einen Importmodus auszuwählen, wählen Sie Dateisystem. Die im Option-ROM enthaltenen Images werden angezeigt und können zur Analyse importiert werden. Legacy-x86-Images werden vom x86-PCI-Option-ROM-Loader verarbeitet, und UEFI-Images werden vom PE32- Loader verarbeitet (Komprimierung wird unterstützt). Informationen zu jedem Image können durch Auswahl von Get Info im Rechtsklick-Menü angezeigt werden.
Fügen Sie ein unterstütztes Firmware-Image zu einem Ghidra-Projekt hinzu. Der Firmware-Image-Loader unterstützt Intel-Images mit einem Flash-Descriptor, coreboot-Images mit einem FMAP/CBFS- Layout und UEFI-Firmware-Volumes. Der Importmodus Dateisystem kann verwendet werden, um eingebettete Dateien innerhalb des angegebenen Firmware-Images anzuzeigen.
Beachten Sie, dass einige UEFI-Firmware-Images verschachtelte Firmware-Volumes innerhalb von
Freeform/Raw-Dateien (oder Freeform/Raw-FFS-Abschnitten) speichern können. Solche Dateien können
als Firmware-Volumes importiert werden, indem Sie Dateisystem öffnen im Rechtsklick-Menü
für die angegebene Freeform/Raw-Datei auswählen. Wenn kein verschachteltes Firmware-Volume gefunden
wird, wird eine Fehlermeldung angezeigt (No file system provider for...).
Das Hilfsskript ist im ghidra_scripts-Verzeichnis des Plugins enthalten, das automatisch zur Liste der Skriptverzeichnisse in Ghidra hinzugefügt werden sollte.
Führen Sie das UEFI-Hilfsskript aus, indem Sie UEFIHelper.java im Skript-Manager-Fenster auswählen (zugänglich über Fenster -> Skript-Manager).
Um die UEFI-Datentyp-Bibliothek zu ändern, ändern Sie die PRF-Vorlage in
data/gen_prf.sh nach Bedarf und generieren Sie neue PRF-Dateien. Öffnen Sie die generierte
PRF-Datei in Datei -> C-Quelle parsen. Erstellen Sie die aktualisierte Datentyp-Bibliothek,
indem Sie In Datei parsen... auswählen. Überschreiben Sie die ursprünglichen Datentyp-Bibliotheken
in data und erstellen Sie das Plugin neu.
Dies sind einige interessante Projekte im Zusammenhang mit UEFI-Reverse Engineering:
Apache 2.0, mit einigen Ausnahmen:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c ist eine leicht modifizierte Version von
Decompress.c aus uefi-firmware-parser (das selbst von
dem Original in EDK2 BaseTools abgeleitet ist).
Der IFD-FS-Loader in src/main/java/firmware/ifd verwendete den Parser von
UEFITool als Referenz.
Die GUID-Datenbank in data/guids.csv stammt aus UEFITool.
Die UEFI-Datentyp-Bibliotheken in data/uefi_*.gdt wurden mit
data/gen_prf.sh generiert, das teilweise auf der UEFI-Parser-Definition
aus einem Ghidra-Pull-Request von wrffrz basiert. Diese Datentyp-Bibliotheken verwenden
Header aus EDK2 MdePkg.
GhidraVitaLoader von xerpi wurde als Referenz für einige Teile des UEFI-Hilfsskripts verwendet.