
Analizza strutture correlate al firmware BIOS/Intel ME/UEFI: Volumi, File System, File, ecc.
.. image:: https://travis-ci.org/theopolis/uefi-firmware-parser.svg?branch=master :target: https://travis-ci.org/theopolis/uefi-firmware-parser
Il parser del firmware UEFI è un modulo semplice e un insieme di script per analizzare, estrarre e ricreare volumi di firmware UEFI. Include moduli di analisi per BIOS, OptionROM, Intel ME e altri formati. Si prega di utilizzare gli script di esempio per tutorial sull'analisi.
Questo modulo è disponibile su PyPi come uefi_firmware <https://pypi.python.org/pypi/uefi_firmware>_
::
$ sudo pip install uefi_firmware
Per installare da Github, esegui il checkout di questo repository e usa:
::
$ sudo python ./setup.py install
Requisiti
python-dev.gcc.Il modo più semplice per utilizzare il modulo per rilevare o analizzare il firmware è attraverso la classe 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()
Esistono diverse classi all'interno dei pacchetti uefi, pfs, me e flash che accettano i contenuti dei file nel loro costruttore. In tutti i casi sono implementati metodi astratti:
process() esegue il lavoro di analisi e restituisce True o Falseshowinfo() stampa una gerarchia di informazioni sulla strutturadump() percorre la gerarchia e scrive ogni elemento in un fileUno script Python viene installato 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.
Per testare un file o una directory di file:
::
$ 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
Se è necessario analizzare ed estrarre un gran numero di file di firmware, dai un'occhiata all'opzione -O per generare automaticamente una cartella di output per ogni file. Se si analizza e si cercano interni in una shell, l'opzione --echo stamperà il nome del file di input prima dell'analisi.
Il controllore del tipo di firmware deciderà come analizzare al meglio il file. Se l'opzione --test non riesce a identificare il tipo, o lo chiama unknown, prova a usare l'opzione -b o --superbrute. Quest'ultima esegue un controllo byte per byte del tipo.
::
$ uefi-firmware-parser --test ~/firmware/970E32_1.40 ~/firmware/970E32_1.40: unknown $ uefi-firmware-parser --superbrute ~/firmware/970E32_1.40 [...]
Caratteristiche
Iniezione GUID
L'iniezione o la sostituzione dei GUID (nessuna aggiunta/sottrazione ancora) può essere eseguita su sezioni all'interno di un file firmware UEFI, o su file firmware UEFI all'interno di un filesystem 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: quando si inietta in un file firmware, all'utente verrà chiesto quale sezione sostituire. Al momento questa operazione non è ancora scriptabile.
Supporto IDA Python
È incluso uno script per generare etichette GUID aggiuntive da importare in IDA Python utilizzando i plugin di Snare. Usando l'opzione -g LABEL lo script genererà un output formattato come dizionario Python. Questo progetto cercherà di mantenere aggiornati automaticamente i GUID dei vendor più popolari.
::
$ 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.
Vendor supportati
Questo modulo è stato testato su aggiornamenti BIOS/UEFI/firmware dei seguenti vendor. Non tutti gli aggiornamenti per tutti i prodotti verranno analizzati, alcuni potrebbero richiedere una decompressione o estrazione a priori dal meccanismo di aggiornamento della distribuzione (tipicamente un PE).