.. 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 选项自动为每个文件生成输出文件夹。如果在 shell 中解析和搜索内部内容,--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)更新解析
Tiano/EFI 和原生 LZMA(7z)[解]压缩
完整的 UEFI 固件卷对象层次结构显示
使用解析的输入卷重新生成固件描述符
固件文件节区注入
GUID 注入
可以对 UEFI 固件文件中的节区或固件文件系统中的 UEFI 固件文件执行注入或 GUID 替换(目前尚不支持增删操作)。
::
$ 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 标签并导入到使用 Snare 插件的 IDA Python 中。使用 -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 文件)中提取。