
Extension Ghidra pour la rétro-ingénierie du firmware PC, fournissant des chargeurs pour les ROM d'option PCI, le Flash Descriptor Intel, le CBFS de coreboot et les volumes de firmware UEFI, ainsi que des scripts d'assistance UEFI pour la récupération de types et l'identification des GUID.
Divers modules pour Ghidra afin d'assister la rétro-ingénierie de firmware PC. Ce projet a été accepté comme projet coreboot pour le GSoC 2019.
JDK 21 (ou plus récent) et Ghidra 12.0 (ou plus récent) sont requis.
Le système de compilation standard Gradle de Ghidra est utilisé. Définissez la variable
d'environnement GHIDRA_INSTALL_DIR avant la compilation, ou définissez-la comme propriété
Gradle (utile pour compiler dans un IDE) :
$ export GHIDRA_INSTALL_DIR="/chemin/vers/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/chemin/vers/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIRdoit pointer vers le répertoire qui contientsupport/buildExtension.gradle. Par exemple, les utilisateurs du paquet Flathub doivent utiliser/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra.
Le ZIP du module sera généré dans dist/. Utilisez File > Install Extensions et
sélectionnez le plus vert pour parcourir jusqu'à l'extension. Redémarrez Ghidra lorsque vous y êtes invité.
Pour un fonctionnement correct, le plugin doit être compilé avec le même JRE utilisé
par votre installation Ghidra. Si vous avez plusieurs environnements d'exécution Java
installés, sélectionnez le JRE correct en définissant la variable d'environnement
JAVA_HOME avant la compilation.
Ajoutez une option ROM PCI à un projet Ghidra. Les options ROM x86 legacy peuvent être directement chargées pour analyse. Assurez-vous que le format binaire est défini sur x86 PCI Option ROM, puis importez le binaire.
Les options ROM UEFI ou les options ROM contenant plus d'une image doivent être importées à l'aide du chargeur de système de fichiers. Lorsque vous êtes invité à sélectionner un mode d'importation, sélectionnez File system. Les images contenues dans l'option ROM seront affichées et peuvent être importées pour analyse. Les images x86 legacy seront traitées par le chargeur x86 PCI Option ROM, et les images UEFI seront traitées par le chargeur PE32 (la compression est prise en charge). Les informations de chaque image peuvent être affichées en sélectionnant Get Info dans le menu contextuel.
Ajoutez une image firmware prise en charge à un projet Ghidra. Le chargeur d'image firmware prend en charge les images Intel avec un Flash Descriptor, les images coreboot avec une disposition FMAP/CBFS, et les volumes firmware UEFI. Le mode d'importation File system peut être utilisé pour afficher les fichiers intégrés dans l'image firmware spécifiée.
Notez que certaines images firmware UEFI peuvent stocker des volumes firmware imbriqués
dans des fichiers freeform/raw (ou des sections FFS freeform/raw). Ces fichiers peuvent
être importés comme volumes firmware en sélectionnant Open File System dans le menu
contextuel du fichier freeform/raw spécifié. Si aucun volume firmware imbriqué n'est
trouvé, un message d'erreur s'affichera (No file system provider for...).
Le script d'assistance est inclus dans le répertoire ghidra_scripts du plugin, qui devrait être automatiquement ajouté à la liste des répertoires de scripts dans Ghidra.
Exécutez le script d'assistance UEFI en sélectionnant UEFIHelper.java dans la fenêtre Script Manager (accessible via Window -> Script Manager).
Pour modifier la bibliothèque de types de données UEFI, modifiez le modèle PRF dans
data/gen_prf.sh si nécessaire et générez de nouveaux fichiers PRF. Ouvrez le fichier
PRF généré dans File -> Parse C Source. Construisez la bibliothèque de types de
données mise à jour en sélectionnant Parse to File.... Écrasez les bibliothèques de
types de données d'origine dans data et recompilez le plugin.
Voici quelques projets intéressants liés à la rétro-ingénierie UEFI :
Apache 2.0, avec quelques exceptions :
src/efidecompress/c/efidecompress.c : BSDsrc/efidecompress/c/efidecompress.c est une version légèrement modifiée de
Decompress.c de uefi-firmware-parser (lui-même dérivé de
l'original dans EDK2 BaseTools).
Le chargeur FS IFD dans src/main/java/firmware/ifd a utilisé l'analyseur de
UEFITool comme référence.
La base de données GUID dans data/guids.csv est tirée de UEFITool.
Les bibliothèques de types de données UEFI dans data/uefi_*.gdt ont été générées avec
data/gen_prf.sh, qui est partiellement basé sur la définition de l'analyseur UEFI
de une demande d'extraction Ghidra par wrffrz. Ces bibliothèques de types de
données utilisent les en-têtes de EDK2 MdePkg.
GhidraVitaLoader par xerpi a été utilisé comme référence pour certaines parties du script d'assistance UEFI.