
Analiza estructuras relacionadas con firmware BIOS/Intel ME/UEFI: Volumes, FileSystems, Files, etc.
.. image:: https://travis-ci.org/theopolis/uefi-firmware-parser.svg?branch=master :target: https://travis-ci.org/theopolis/uefi-firmware-parser
El analizador de firmware UEFI es un módulo simple y un conjunto de scripts para analizar, extraer y recrear volúmenes de firmware UEFI. Incluye módulos de análisis para BIOS, OptionROM, Intel ME y otros formatos también. Por favor, use los scripts de ejemplo para tutoriales de análisis.
Este módulo está disponible a través de PyPi como uefi_firmware <https://pypi.python.org/pypi/uefi_firmware>_
::
$ sudo pip install uefi_firmware
Para instalar desde Github, clone este repositorio y use:
::
$ sudo python ./setup.py install
Requisitos
python-dev.gcc.La forma más simple de usar el módulo para detectar o analizar firmware es a través de la clase AutoParser.
::
import uefi_firmware with open('/path/to/firmware.rom', 'r') as fh: file_content = fh.read() parser = uefi_firmware.AutoParser(file_content) if parser.type() != 'unknown': firmware = parser.parse() firmware.showinfo()
Hay varias clases dentro de los paquetes uefi, pfs, me y flash que aceptan contenidos de archivos en su constructor. En todos los casos hay métodos abstractos implementados:
process() realiza el trabajo de análisis y devuelve True o Falseshowinfo() imprime una jerarquía de información sobre la estructuradump() recorre la jerarquía y escribe cada elemento en un archivoSe instala un script de Python: uefi-firmware-parser
::
$ uefi-firmware-parser -h usage: uefi-firmware-parser [-h] [-b] [--superbrute] [-q] [-o OUTPUT] [-O] [-c] [-e] [-g GENERATE] [--test] file [file ...]
Parse, and optionally output, details and data on UEFI-related firmware.
positional arguments: file The file(s) to work on
optional arguments: -h, --help show this help message and exit -b, --brute The input is a blob and may contain FV headers. --superbrute The input is a blob and may contain any sort of firmware object -q, --quiet Do not show info. -o OUTPUT, --output OUTPUT Dump firmware objects to this folder. -O, --outputfolder Dump firmware objects to a folder based on filename ${FILENAME}_output/ -c, --echo Echo the filename before parsing or extracting. -e, --extract Extract all files/sections/volumes. -g GENERATE, --generate GENERATE Generate a FDF, implies extraction (volumes only) --test Test file parsing, output name/success.
To test a file or directory of files:
::
$ uefi-firmware-parser --test ~/firmware/* ~/firmware/970E32_1.40: UEFIFirmwareVolume ~/firmware/CO5975P.BIO: EFICapsule ~/firmware/me-03.obj: IntelME ~/firmware/O990-A03.exe: None ~/firmware/O990-A03.exe.hdr: DellPFS
Si necesita analizar y extraer una gran cantidad de archivos de firmware, pruebe la opción -O para generar automáticamente una carpeta de salida por archivo. Si analiza y busca internos en un shell, la opción --echo imprimirá el nombre del archivo de entrada antes de analizar.
El verificador de tipo de firmware decidirá la mejor forma de analizar el archivo. Si la opción --test no logra identificar el tipo, o lo llama unknown, intente usar la opción -b o --superbrute. La última realiza una verificación byte por byte del tipo.
::
$ uefi-firmware-parser --test ~/firmware/970E32_1.40 ~/firmware/970E32_1.40: unknown $ uefi-firmware-parser --superbrute ~/firmware/970E32_1.40 [...]
Características
Análisis de Volúmenes de Firmware UEFI, Cápsulas, Sistemas de Archivos, Archivos y Secciones
Descriptores de Flash Intel PCH
Análisis de módulos Intel ME (ME, TXE, etc.)
Análisis de actualizaciones Dell PFS (HDR)
[Des]compresión Tiano/EFI y LZMA nativo (7z)
Visualización completa de la jerarquía de objetos del volumen de firmware UEFI
[Re]generación de descriptores de firmware utilizando los volúmenes de entrada analizados
Inyección de secciones de archivos de firmware
Inyección de GUID
La inyección o reemplazo de GUID (aún no hay suma/resta) se puede realizar en secciones dentro de un archivo de firmware UEFI, o en archivos de firmware UEFI dentro de un sistema de archivos de firmware.
::
$ python ./scripts/fv_injector.py -h usage: fv_injector.py [-h] [-c] [-p] [-f] [--guid GUID] --injection INJECTION [-o OUTPUT] file
Search a file for UEFI firmware volumes, parse and output.
positional arguments: file The file to work on
optional arguments: -h, --help show this help message and exit -c, --capsule The input file is a firmware capsule. -p, --pfs The input file is a Dell PFS. -f, --ff Inject payload into firmware file. --guid GUID GUID to replace (inject). --injection INJECTION Pre-generated EFI file to inject. -o OUTPUT, --output OUTPUT Name of the output file.
Nota: al inyectar en un archivo de firmware, se le pedirá al usuario qué sección reemplazar. Por el momento esto no es aún automatizable.
Soporte para IDA Python
Hay un script incluido para generar etiquetas GUID adicionales para importar en IDA Python
usando los plugins de Snare. Usando la opción -g LABEL, el script generará una salida en formato de diccionario de Python. Este proyecto tratará de mantenerse actualizado con los GUID populares de los proveedores automáticamente.
::
$ python ./scripts/uefi_guids.py -h usage: uefi_guids.py [-h] [-c] [-b] [-d] [-g GENERATE] [-u] file
Output GUIDs for files, optionally write GUID structure file.
positional arguments: file The file to work on
optional arguments: -h, --help show this help message and exit -c, --capsule The input file is a firmware capsule, do not search. -b, --brute The input file is a blob, search for firmware volume headers. -d, --flash The input file is a flash descriptor. -g GENERATE, --generate GENERATE Generate a behemoth-style GUID output. -u, --unknowns When generating also print unknowns.
Proveedores compatibles
Este módulo se ha probado en actualizaciones de BIOS/UEFI/firmware de los siguientes proveedores. No todas las actualizaciones de todos los productos se analizarán; algunas pueden requerir descompresión o extracción previa del mecanismo de actualización de la distribución (normalmente un PE).