
Разбор структур, связанных с прошивками BIOS/Intel ME/UEFI: Volumes, FileSystems, Files и т.д.
.. image:: https://travis-ci.org/theopolis/uefi-firmware-parser.svg?branch=master :target: https://travis-ci.org/theopolis/uefi-firmware-parser
Парсер прошивок UEFI — это простой модуль и набор скриптов для разбора, извлечения и воссоздания томов прошивки UEFI. Сюда также входят модули для разбора BIOS, OptionROM, Intel ME и других форматов. Пожалуйста, используйте примеры скриптов для изучения процесса разбора.
Этот модуль доступен через PyPi как uefi_firmware <https://pypi.python.org/pypi/uefi_firmware>_
::
$ sudo pip install uefi_firmware
Для установки из Github склонируйте этот репозиторий и выполните:
::
$ sudo python ./setup.py install
Требования
python-dev.gcc.Самый простой способ использовать модуль для обнаружения или разбора прошивки — через класс 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()
В пакетах uefi, pfs, me и flash есть несколько классов, которые принимают содержимое файла в своем конструкторе. Во всех случаях реализованы абстрактные методы:
process() выполняет разбор и возвращает True или Falseshowinfo() выводит иерархию информации о структуреdump() обходит иерархию и записывает каждый элемент в файлУстанавливается скрипт 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.
Чтобы протестировать файл или каталог файлов:
::
$ 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
Если вам нужно разобрать и извлечь большое количество файлов прошивки, воспользуйтесь опцией -O для автоматического создания выходной папки для каждого файла. Если требуется разбор и поиск внутренних структур в оболочке, опция --echo выводит имя входного файла перед разбором.
Проверщик типа прошивки решает, как лучше разобрать файл. Если опция --test не определяет тип или выдает unknown, попробуйте использовать опцию -b или --superbrute. Последняя выполняет побайтовую проверку типа.
::
$ uefi-firmware-parser --test ~/firmware/970E32_1.40 ~/firmware/970E32_1.40: unknown $ uefi-firmware-parser --superbrute ~/firmware/970E32_1.40 [...]
Возможности
Разбор томов прошивки UEFI, капсул, файловых систем, файлов, секций
Дескрипторы флеш-памяти Intel PCH
Разбор модулей Intel ME (ME, TXE и т.д.)
Разбор обновлений Dell PFS (HDR)
[Распаковка] LZMA (7z) в стиле Tiano/EFI и нативная
Полное отображение иерархии объектов тома прошивки UEFI
[Повторная] генерация дескриптора прошивки на основе разобранных томов
Инъекция секций файлов прошивки
Инъекция GUID
Инъекция или замена GUID (добавление/удаление пока не поддерживаются) может выполняться для секций внутри файла прошивки UEFI или для файлов прошивки UEFI внутри файловой системы прошивки.
::
$ 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.
Примечание: при инъекции в файл прошивки пользователю будет предложено выбрать, какую секцию заменить. На данный момент это нельзя автоматизировать в скрипте.
Поддержка IDA Python
Включен скрипт для генерации дополнительных меток GUID для импорта в IDA Python
с помощью плагинов Snare. С опцией -g LABEL скрипт сгенерирует вывод в формате словаря Python. Этот проект будет стараться поддерживать актуальность популярных GUID вендоров автоматически.
::
$ 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.
Поддерживаемые вендоры
Этот модуль был протестирован на обновлениях BIOS/UEFI/прошивок от следующих вендоров. Не каждое обновление для каждого продукта будет разобрано; некоторым может потребоваться предварительная распаковка или извлечение из механизма распространения обновлений (обычно PE).