
Analisar estruturas relacionadas a firmware BIOS/Intel ME/UEFI: Volumes, Sistemas de Arquivos, Arquivos, etc.
==============================
.. image:: https://travis-ci.org/theopolis/uefi-firmware-parser.svg?branch=master :target: https://travis-ci.org/theopolis/uefi-firmware-parser
O analisador de firmware UEFI é um módulo simples e um conjunto de scripts para analisar, extrair e recriar volumes de firmware UEFI. Inclui módulos de análise para BIOS, OptionROM, Intel ME e outros formatos também. Por favor, use os scripts de exemplo para tutoriais de análise.
Este módulo está disponível via PyPi como uefi_firmware <https://pypi.python.org/pypi/uefi_firmware>_
::
$ sudo pip install uefi_firmware
Para instalar a partir do Github, faça checkout deste repositório e use:
::
$ sudo python ./setup.py install
Requisitos
python-dev.gcc.A forma mais simples de usar o módulo para detectar ou analisar firmware é através da classe AutoParser.
::
import uefi_firmware with open('/caminho/para/firmware.rom', 'r') as fh: conteudo_arquivo = fh.read() parser = uefi_firmware.AutoParser(conteudo_arquivo) if parser.type() != 'desconhecido': firmware = parser.parse() firmware.showinfo()
Existem várias classes nos pacotes uefi, pfs, me e flash que aceitam conteúdos de arquivo em seu construtor. Em todos os casos, existem métodos abstratos implementados:
process() realiza o trabalho de análise e retorna True ou Falseshowinfo() exibe uma hierarquia de informações sobre a estruturadump() percorre a hierarquia e escreve cada parte em um arquivoUm script Python é instalado: 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.
Para testar um arquivo ou diretório de arquivos:
::
$ 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 você precisa analisar e extrair um grande número de arquivos de firmware, confira a opção -O para gerar automaticamente uma pasta de saída por arquivo. Se estiver analisando e procurando por componentes internos em um shell, a opção --echo exibirá o nome do arquivo de entrada antes da análise.
O verificador de tipo de firmware decidirá a melhor forma de analisar o arquivo. Se a opção --test falhar ao identificar o tipo, ou chamá-lo de desconhecido, tente usar a opção -b ou --superbrute. A última realiza uma verificação byte a byte do tipo.
::
$ uefi-firmware-parser --test ~/firmware/970E32_1.40 ~/firmware/970E32_1.40: desconhecido $ uefi-firmware-parser --superbrute ~/firmware/970E32_1.40 [...]
Recursos
Análise de Volumes de Firmware UEFI, Cápsulas, Sistemas de Arquivos, Arquivos, Seções
Descritores de Flash Intel PCH
Análise de módulos Intel ME (ME, TXE, etc.)
Análise de atualizações Dell PFS (HDR)
[Des]compressão Tiano/EFI e LZMA nativa (7z)
Exibição completa da hierarquia de objetos do volume de firmware UEFI
[Re]geração do descritor de firmware usando os volumes de entrada analisados
Injeção de Seções de Arquivo de Firmware
Injeção GUID
A injeção ou substituição de GUID (ainda sem adição/subtração) pode ser realizada em seções dentro de um arquivo de firmware UEFI, ou em arquivos de firmware UEFI dentro de um sistema de arquivos 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: ao injetar em um arquivo de firmware, o usuário será perguntado qual seção substituir. No momento, isso ainda não é automatizável.
Suporte a IDA Python
Existe um script incluído para gerar rótulos GUID adicionais para importar no IDA Python
usando os plugins do Snare. Usando a opção -g LABEL, o script gerará uma saída no formato de dicionário Python. Este projeto tentará manter-se atualizado automaticamente com GUIDs de fornecedores populares.
::
$ 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.
Fornecedores Suportados
Este módulo foi testado em atualizações de BIOS/UEFI/firmware dos seguintes fornecedores. Nem toda atualização para todo produto será analisada; algumas podem exigir descompressão ou extração prévia do mecanismo de distribuição da atualização (tipicamente um PE).