给固件“拍个CT”:用UEFITool和010 Editor拆解一个真实的BIOS文件,看看FD/FV/FF到底长啥样
逆向实战用二进制工具拆解BIOS文件中的UEFI固件结构第一次打开一个BIOS镜像文件时满屏的十六进制数据可能会让人望而生畏。但就像医生通过CT扫描理解人体结构一样我们可以借助专业工具透视这些二进制数据。本文将带你用UEFITool和010 Editor从一个真实的BIOS更新文件(.CAP格式)入手逐步解析UEFI固件的层级结构。1. 准备工作与环境搭建在开始解剖BIOS文件前我们需要准备合适的手术工具。以下是推荐的工具组合UEFITool开源的UEFI固件解析工具支持可视化分析FD/FV/FF结构010 Editor带模板解析功能的专业十六进制编辑器BIOS样本从主板厂商官网下载的BIOS更新文件(如*.CAP/*.BIN)提示建议在虚拟机环境中操作避免对主机系统造成意外影响安装完成后先用UEFITool打开一个华硕主板的BIOS文件(例如Z790芯片组的.CAP文件)你会看到类似这样的界面[FD] Flash Device (Size: 16MB) ├── [FV] Firmware Volume (GUID: 8C8CE578...) │ ├── [FF] Firmware File (Type: 0x07, GUID: 1BA0062E...) │ └── [FF] Volume Top File (GUID: 04AD...) └── [FV] NVRAM Volume (GUID: FFF12B8D...)这个树状图已经初步揭示了固件的层级关系。接下来我们深入每个层级的具体结构。2. 解析Flash Device(FD)结构FD是整个固件的最外层容器相当于存储芯片的完整镜像。用010 Editor打开BIOS文件在起始位置可以看到典型的FD特征偏移量值说明0x00005AA5F00FFD签名标志0x000401000000版本号0x000800000001块数量0x001000010000单个块大小(64KB)在UEFITool中右键选择Search...输入模式5A A5 F0 0F可以快速定位所有FD区域。实际操作中你会发现现代UEFI固件通常包含多个逻辑FD主BIOS区域(通常8-16MB)ME(管理引擎)固件区域闪存描述符区域备用/恢复区域// 典型的FD头结构(EDK2定义) typedef struct { UINT32 Signature; // 0x5AA5F00F UINT32 Version; UINT32 BlockCount; UINT32 BlockSize; } EFI_FIRMWARE_DEVICE_HEADER;3. 剖析Firmware Volume(FV)格式FV是UEFI中的逻辑存储单元每个FV都有自己的文件系统。在UEFITool中展开一个FV节点查看其属性面板会显示关键信息GUID唯一标识该FV(如8C8CE578-...)FileSystemGuidFFS版本(2或3)SizeFV总大小Checksum头部校验值用010 Editor跳转到FV起始位置(例如0x1000)可以看到标准的FV头Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00001000 5F 46 56 48 5F 00 00 01 00 00 00 00 78 E5 8C 8C _FVH_.......x... 00001010 B5 44 9D 4D 91 7A 72 4F 8B 85 7E 5D 00 00 0F 00 .D.M.zrO..~]....对应结构体解析字段偏移值说明Signature0x000x5F465648 (_FVH)FV标识签名Attributes0x040x0100005FFV属性标志位HeaderLength0x080x0000005F头部长度(95字节)FileSystemGuid0x108C8CE578...文件系统GUID注意FFS2和FFS3的主要区别在于支持的最大文件大小(16MB vs 4GB)4. 解码Firmware File(FF)结构FF是FV中的基本存储单元每个FF包含一个头部和数据部分。在UEFITool中双击一个FF节点右侧会显示其详细属性Type文件类型(0x01-0x0F)GUID唯一标识符Size总大小(含头部)State文件状态标志以PEI核心模块(通常类型为0x07)为例其二进制结构如下Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00002000 F0 0F 84 7C 00 00 00 00 78 00 00 00 07 00 00 1B ...|....x....... 00002010 2E 06 A0 1B 33 22 77 44 8D 2B F1 FF 64 00 00 00 ....3wD...d...对应关键字段解析NameGuid0x1BA0062E...(偏移0x10)Type0x07(PEIM模块)Size0x00000078(120字节头部数据)Attributes0x1B(已认证、含校验)// FFS文件头结构(简化版) typedef struct { EFI_GUID Name; // 文件GUID EFI_FFS_INTEGRITY_CHECK IntegrityCheck; UINT8 Type; // 文件类型 UINT8 Attributes; // 属性标志 UINT8 Size[3]; // 24位大小值 UINT8 State; // 文件状态 } EFI_FFS_FILE_HEADER;5. 实战定位Volume Top File(VTF)VTF是每个FV的结束标记文件具有固定GUID。在UEFITool中可以通过以下步骤快速定位右键点击目标FV选择Search...输入GUID:04AD...(完整GUID见PI规范)定位到的文件就是VTF在二进制视图中VTF通常具有以下特征位于FV的末尾附近NameGuid固定为04AD...包含FFS文件头和少量数据(可能为空)最后一个字节与FV结束位置对齐实际操作案例在一个16MB的FV中VTF可能位于0xFFF000位置其结构如下Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0FFF000 04 4E 9B 7F 33 22 77 44 8D 2B F1 FF 20 00 00 AA .N..3wD... ... 0FFF010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................6. 高级技巧处理嵌套结构与异常情况实际分析中常会遇到一些复杂情况案例1嵌套FV某些FF内部可能包含完整FV结构。在UEFITool中表现为[FF] (Type: 0x0F) └── [FV] (GUID: ...)案例2对齐填充FF之间常有对齐填充(通常为0xFF)010 Editor中可用模式搜索FF FF FF FF定位。案例3损坏结构当校验失败时UEFITool会显示黄色警告图标。常见原因包括手动修改后校验和不匹配闪存擦除不完整厂商自定义结构处理这类问题时可以检查原始BIOS文件是否完整尝试不同版本UEFITool参考芯片组文档确认特殊结构7. 自动化分析脚本示例对于批量分析可以使用UEFITool的Python APIfrom UEFITool import * def analyze_bios(file_path): image UEFIImage(file_path) for fd in image.FDs: print(fFound FD at 0x{fd.Offset:X}, Size: 0x{fd.Size:X}) for fv in fd.FVs: print(f FV GUID: {fv.Guid}, Files: {len(fv.Files)}) for ff in fv.Files: if ff.Type 0x07: # PEIM print(f PEIM: {ff.Guid}) analyze_bios(Z790_BIOS.CAP)或者使用010 Editor的模板功能解析结构// 010 Editor模板示例 typedef struct { char Signature[4]; // _FVH uint Attributes; uint HeaderSize; ulong Length; char FileSystemGuid[16]; char FvNameGuid[16]; } FV_HEADER; FV_HEADER fv; Read(fv, 0x1000); // 假设FV从0x1000开始 Printf(FV Size: 0x%X\n, fv.Length);通过这次实战分析我们像做CT扫描一样逐层揭开了UEFI固件的内部结构。下次当你面对一个BIOS文件时不妨用这些工具亲自探索或许会发现更多有趣的细节。