
Extensión de Ghidra para ingeniería inversa de firmware de PC, que proporciona cargadores para ROMs de opción PCI, Intel Flash Descriptor, coreboot CBFS y volúmenes de firmware UEFI, además de scripts auxiliares UEFI para recuperación de tipos e identificación de GUID.
Varios módulos para Ghidra que ayudan en la ingeniería inversa de firmware de PC. Esto fue aceptado como un proyecto de coreboot para GSoC 2019.
Se requieren JDK 21 (o más reciente) y Ghidra 12.0 (o más reciente).
Se utiliza el sistema de compilación estándar de Ghidra con Gradle. Establezca la
variable de entorno GHIDRA_INSTALL_DIR antes de compilar, o configúrela como una
propiedad de Gradle (útil para compilar en un IDE):
$ export GHIDRA_INSTALL_DIR="/ruta/a/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/ruta/a/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIRdebe apuntar al directorio que contienesupport/buildExtension.gradle. Por ejemplo, los usuarios del paquete Flathub deben usar/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra.
El ZIP del módulo se generará en dist/. Use File > Install Extensions y
seleccione el signo más verde para buscar la extensión. Reinicie Ghidra cuando se le solicite.
Para un funcionamiento correcto, el plugin debe compilarse con el mismo JRE utilizado
por su instalación de Ghidra. Si tiene varios entornos de ejecución de Java
instalados, seleccione el JRE correcto estableciendo la variable de entorno JAVA_HOME
antes de compilar.
Agregue una ROM de opción PCI a un proyecto de Ghidra. Las ROM de opción x86 heredadas se pueden cargar directamente para su análisis. Asegúrese de que el formato binario esté configurado como x86 PCI Option ROM e importe el binario.
Las ROM de opción UEFI o las ROM de opción que contengan más de una imagen deben importarse usando el cargador de sistemas de archivos. Cuando se le solicite seleccionar un modo de importación, seleccione File system. Las imágenes contenidas dentro de la ROM de opción se mostrarán y se pueden importar para su análisis. Las imágenes x86 heredadas serán manejadas por el cargador de ROM de opción x86 PCI, y las imágenes UEFI serán manejadas por el cargador PE32 (se admite compresión). La información de cada imagen se puede mostrar seleccionando Get Info en el menú contextual.
Agregue una imagen de firmware compatible a un proyecto de Ghidra. El cargador de imágenes de firmware admite imágenes Intel con un Flash Descriptor, imágenes coreboot con un diseño FMAP/CBFS y volúmenes de firmware UEFI. El modo de importación File system se puede usar para ver los archivos incrustados dentro de la imagen de firmware especificada.
Tenga en cuenta que algunas imágenes de firmware UEFI pueden almacenar volúmenes de firmware anidados dentro de
archivos freeform/raw (o secciones FFS freeform/raw). Dichos archivos se pueden importar
como volúmenes de firmware seleccionando Open File System en el menú contextual
del archivo freeform/raw especificado. Si no se encuentra ningún volumen de firmware anidado, se
mostrará un mensaje de error (No file system provider for...).
El script auxiliar está incluido en el directorio ghidra_scripts del plugin, que debería agregarse automáticamente a la lista de directorios de scripts en Ghidra.
Ejecute el script auxiliar UEFI seleccionando UEFIHelper.java en la ventana Script Manager (acceda desde Window -> Script Manager).
Para modificar la biblioteca de tipos de datos UEFI, modifique la plantilla PRF en
data/gen_prf.sh según sea necesario y genere nuevos archivos PRF. Abra el archivo PRF
generado en File -> Parse C Source. Compile la biblioteca de tipos de datos actualizada
seleccionando Parse to File.... Sobrescriba las bibliotecas de tipos de datos originales
en data y recompile el plugin.
Estos son algunos proyectos interesantes relacionados con la ingeniería inversa de UEFI:
Apache 2.0, con algunas excepciones:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c es una versión ligeramente modificada de
Decompress.c de uefi-firmware-parser (que a su vez deriva de
el original en EDK2 BaseTools).
El cargador FS IFD en src/main/java/firmware/ifd usó el analizador de
UEFITool como referencia.
La base de datos de GUID en data/guids.csv está tomada de UEFITool.
Las bibliotecas de tipos de datos UEFI en data/uefi_*.gdt se generaron con
data/gen_prf.sh, que se basa parcialmente en la definición del analizador UEFI
de una solicitud de extracción de Ghidra de wrffrz. Estas bibliotecas de tipos de datos usan
encabezados de EDK2 MdePkg.
GhidraVitaLoader de xerpi se usó como referencia para algunas partes del script auxiliar UEFI.