UEFI 启动顺序
UEFI 镜像(通常称为固件镜像)是 UEFI 固件的核心载体,其结构遵循 UEFI 规范 和 PI(Platform Initialization)规范。其布局由多个逻辑模块组成,按功能分阶段加载和执行。以下是典型 UEFI 镜像的结构及其关键组件:
1. 基础结构单元:固件卷(Firmware Volume, FV)
UEFI 镜像由多个 固件卷(FV) 构成,每个固件卷是一个独立的存储区域,包含代码、数据或配置信息。固件卷的结构如下:
组成部分 | 描述 |
---|---|
FV Header | 固件卷的元数据,包含 GUID、大小、属性和校验信息。 |
文件系统(FFS) | 基于 FFS(Firmware File System)的文件存储结构,用于组织 UEFI 模块和文件。 |
文件条目(File) | FFS 中的独立文件,可以是代码模块(PE32/PE32+)、数据文件或用户自定义内容。 |
填充区域(Pad) | 对齐填充数据,确保文件按固定块对齐(如 8KB 对齐)。 |
2. 核心固件卷类型
典型的 UEFI 镜像包含以下关键固件卷:
(1) SEC(Security Phase)固件卷
- 作用:系统启动的第一个阶段,负责初始化 CPU 和内存,验证后续固件的完整性。
- 内容 :
- 复位向量代码(Reset Vector)。
- 硬件初始化代码(如缓存、栈设置)。
- 可信验证逻辑(如 TPM 度量、签名验证)。
(2) PEI(Pre-EFI Initialization)固件卷
- 作用:初始化关键硬件(如内存控制器),为 DXE 阶段准备环境。
- 内容 :
- PEI 模块(PEIM):如内存初始化模块(MemoryInit)、硬件配置模块。
- 临时内存分配器(PEI Temporary RAM)。
- 硬件抽象接口(HOB List)。
(3) DXE(Driver Execution Environment)固件卷
- 作用:加载 UEFI 驱动和服务,构建系统运行时环境。
- 内容 :
- DXE 核心(DXE Core):调度器、服务表(如
gBS
、gRT
)。 - UEFI 驱动(如 PCI 驱动、USB 驱动)。
- 协议(Protocol)和句柄(Handle)定义。
- DXE 核心(DXE Core):调度器、服务表(如
(4) BDS(Boot Device Selection)固件卷
- 作用:选择启动设备并加载操作系统引导程序(如 GRUB、Windows Boot Manager)。
- 内容 :
- 启动策略配置(BootOrder、Boot#### 变量)。
- 文件系统驱动(FAT32、NTFS)。
- UEFI 应用程序(如 Shell.efi)。
(5) SMM(System Management Mode)固件卷
- 作用:实现系统管理模式代码,处理高权限安全事件(如硬件错误、安全漏洞)。
- 内容 :
- SMI 处理程序(SMI Handler)。
- SMM 驱动和协议(如
EFI_SMM_ACCESS2_PROTOCOL
)。 - 安全隔离代码(如 SMRAM 配置)。
3. 文件系统与模块类型
每个固件卷内的文件通过 FFS 组织,常见的文件类型包括:
文件类型 | 描述 |
---|---|
PE32/PE32+ | UEFI 可执行模块(驱动或应用程序),遵循 PE/COFF 格式。 |
RAW | 原始数据文件(如配置表、ACPI 表)。 |
FREEFORM | 自定义格式数据(如 Logo 图片、字体文件)。 |
VOLUME_IMAGE | 嵌套的固件卷(用于模块化设计)。 |
4. 典型布局示例
以下是一个简化版 UEFI 镜像的十六进制视图(通过 hexdump
或 UEFITool 解析):
plaintext
+-----------------------+
| FV Header (GUID: xxxx)|
+-----------------------+
| FFS File 1 (SEC Core) | → PE32 模块
+-----------------------+
| FFS File 2 (PEI Core) | → PEIM 模块
+-----------------------+
| FFS File 3 (DXE Core) | → DXE 驱动
+-----------------------+
| FFS File 4 (BDS App) | → Boot Manager
+-----------------------+
| Pad (对齐填充) |
+-----------------------+
5. 关键工具与操作
-
查看镜像结构:
bash# 使用 UEFITool(图形化工具) uefitool firmware.bin # 使用 dd 和 hexdump(命令行) dd if=firmware.bin bs=1k count=512 | hexdump -C
-
提取固件卷:
bash# 从镜像中提取第一个 FV dd if=firmware.bin of=fv_main.bin bs=1 skip=$((0x1000)) count=$((0x100000))
-
解析 FFS 文件:
bash# 使用 UEFI-Firmware-Parser uefi-firmware-parser -b -e fv_main.bin
6. 安全验证机制
UEFI 镜像的安全性依赖于以下设计:
- 签名验证:通过 Secure Boot 验证模块的数字签名(如 PK、KEK、DB 变量)。
- 完整性保护:固件卷头部包含 CRC32 校验和,防止数据篡改。
- SMM 隔离:关键代码在 SMRAM 中运行,阻止非特权访问。
7. 厂商实现差异
不同厂商的 UEFI 镜像可能包含定制化组件:
- Intel:EDK II 代码库为基础,包含 FSP(Firmware Support Package)。
- AMI:Aptio 固件,扩展了 OEM 配置模块。
- Phoenix:SecureCore 架构,集成专用恢复工具。
执行流程总结
- 模块化设计:UEFI 镜像通过固件卷和 FFS 文件系统实现模块化。
- 分阶段加载:SEC → PEI → DXE → BDS 的层次化执行流程。
- 安全优先:从硬件初始化到操作系统加载全程支持安全验证。
如需进一步分析具体镜像,建议使用 UEFITool 或 Binwalk 进行逆向分析。
UEFI镜像结构
UEFI(统一可扩展固件接口)镜像的结构布局是根据 UEFI 规范设计的,用于确保固件在启动过程中能够正确加载和执行。UEFI 镜像通常包含多个组件,每个组件都有其特定的功能和布局。以下是一个典型的 UEFI 镜像结构布局的概述:
1. 引导扇区(Boot Sector)
- 位置:通常位于存储介质的起始位置(如硬盘的第 0 扇区)。
- 功能:包含引导代码,负责加载和启动 UEFI 固件。
- 大小:通常为 512 字节。
2. 保护分区(Protected Area)
- 位置:紧随引导扇区之后。
- 功能:用于存储固件的引导信息和配置数据。
- 内容 :
- 引导程序(Bootloader):负责加载 UEFI 固件到内存。
- 配置数据(Config Data):存储固件的配置参数。
3. UEFI 固件映像(UEFI Firmware Image)
- 位置:通常位于保护分区之后。
- 功能:包含 UEFI 固件的主体部分。
- 结构 :
- 头部(Header) :
- 签名(Signature):用于标识固件的合法性。
- 版本(Version):固件的版本信息。
- 大小(Size):固件的总大小。
- 入口点(Entry Point):固件的入口地址。
- 节表(Section Table) :
- 节头(Section Header):描述每个节的类型、偏移和大小。
- 节数据(Section Data):实际的代码、数据或资源。
- PE/COFF 格式(Portable Executable / Common Object File Format) :
- 可选头部(Optional Header):包含固件的加载和执行信息。
- 数据目录(Data Directory):指向固件中的各种资源和表。
- 头部(Header) :
4. 驱动程序和应用程序(Drivers and Applications)
- 位置:通常位于 UEFI 固件映像之后。
- 功能:包含各种驱动程序和应用程序,用于扩展固件的功能。
- 结构 :
- 驱动程序(Drivers):负责硬件设备的初始化和管理。
- 应用程序(Applications):如启动管理器、诊断工具等。
5. 配置数据库(Configuration Database)
- 位置:通常位于驱动程序和应用程序之后。
- 功能:存储固件的配置信息,如启动选项、硬件配置等。
- 结构 :
- 变量存储(Variable Storage):存储用户设置的变量。
- 默认配置(Default Configuration):预设的配置信息。
6. 签名和验证数据(Signature and Verification Data)
- 位置:通常位于配置数据库之后。
- 功能:用于验证固件的完整性和合法性。
- 内容 :
- 签名(Signature):固件的数字签名。
- 证书(Certificate):用于验证签名的证书。
7. 备用区域(Backup Area)
- 位置:通常位于签名和验证数据之后。
- 功能:用于存储固件的备份副本,以防主副本损坏。
- 内容 :
- 备份固件映像(Backup Firmware Image):固件的完整副本。
- 备份配置数据库(Backup Configuration Database):配置信息的备份。
8. 空闲区域(Free Space)
- 位置:通常位于备用区域之后。
- 功能:未使用的空间,可用于未来的扩展或更新。
典型的 UEFI 镜像布局示意图
+-------------------+
| 引导扇区 |
+-------------------+
| 保护分区 |
+-------------------+
| UEFI 固件映像 |
| - 头部 |
| - 节表 |
| - PE/COFF 格式 |
+-------------------+
| 驱动程序和应用程序|
+-------------------+
| 配置数据库 |
+-------------------+
| 签名和验证数据 |
+-------------------+
| 备用区域 |
+-------------------+
| 空闲区域 |
+-------------------+
关键点总结
- 引导扇区:负责启动加载过程。
- UEFI 固件映像:包含固件的主体代码和数据。
- 配置数据库:存储固件的配置信息。
- 签名和验证数据:确保固件的完整性和合法性。
- 备用区域:提供固件的备份副本,以防主副本损坏。
详细描述
结构图描述了一个典型的 UEFI 镜像在物理存储设备(如 SPI 闪存或硬盘)中的分层布局。以下是各部分的详细说明及其在 UEFI 启动流程中的作用:
1. 引导扇区(Boot Sector)
-
作用:兼容传统 BIOS 启动模式,或作为 UEFI 启动的补充入口(例如从 MBR 磁盘启动)。
-
内容 :
- 主引导记录(MBR):包含磁盘分区表和启动代码(兼容 BIOS)。
- 保护引导代码(可选):用于验证后续分区的合法性。
-
示例 :
plaintext偏移 0x0000: MBR(启动代码 + 分区表) 偏移 0x01BE: 分区表(4 个条目) 偏移 0x01FE: 结束标志(0x55AA)
2. 保护分区(Protected Partition)
- 作用:存储固件恢复或安全启动所需的受保护数据(如备份固件、硬件密钥)。
- 特点 :
- 通常标记为隐藏分区,避免操作系统误操作。
- 可能包含以下内容:
- 备份的 UEFI 固件镜像(用于故障恢复)。
- 硬件加密密钥(如 Intel PTT 或 TPM 相关数据)。
- 安全启动数据库(DB/DBX)的备份。
3. UEFI 固件映像(UEFI Firmware Image)
这是 UEFI 固件的核心部分,通常以 固件卷(Firmware Volume, FV) 形式组织,包含以下子结构:
(1) 头部(Header)
- 作用:描述固件卷的元数据。
- 关键字段 :
- GUID :唯一标识符(如
8C8CE578-8A3D-4F1C-9935-896185C32DD3
)。 - 大小:固件卷的总字节数。
- 属性:读写权限、对齐要求(如 8KB 对齐)。
- 校验和:CRC32 或更复杂的哈希值(如 SHA256)。
- GUID :唯一标识符(如
(2) 节表(Section Table)
- 作用:定义固件卷内各文件(FFS 文件)的布局和类型。
- 常见节类型 :
- PEI 核心节:包含 Pre-EFI 初始化代码。
- DXE 核心节:驱动执行环境的核心模块。
- 用户界面节:启动时显示的图形资源(如 Logo、字体)。
(3) PE/COFF 格式
-
作用:UEFI 可执行文件的标准格式(驱动、应用程序均为此格式)。
-
结构 :
- DOS 头 (兼容性保留,内容固定为
MZ
)。 - PE 头 :机器类型(如
EFI_IMAGE_MACHINE_X64
)、入口点地址。 - 节表 :定义代码(
.text
)、数据(.data
)和资源(.rsrc
)段的偏移与属性。
- DOS 头 (兼容性保留,内容固定为
-
示例 :
plaintext+---------------------+ | DOS Header ("MZ") | +---------------------+ | PE Header | → 包含入口点 _ModuleEntryPoint +---------------------+ | .text Section | → 可执行代码 +---------------------+ | .data Section | → 全局变量 +---------------------+ | .reloc Section | → 重定位信息 +---------------------+
4. 驱动程序和应用程序(Drivers & Applications)
- 作用:扩展 UEFI 功能或提供用户交互界面。
- 典型内容 :
- 硬件驱动:PCIe 控制器驱动、USB 主机控制器驱动。
- 协议实现 :
EFI_BLOCK_IO_PROTOCOL
、EFI_GRAPHICS_OUTPUT_PROTOCOL
。 - 应用程序:UEFI Shell、启动管理器(Boot Manager)、诊断工具。
- 存储形式 :以 FFS 文件形式嵌入固件卷,文件类型为
PE32
或PE32+
。
5. 配置数据库(Configuration Database)
- 作用:存储 UEFI 变量和平台配置信息。
- 内容 :
- NVRAM 变量 :
BootOrder
:定义启动设备优先级。Boot####
:单个启动项配置(如Boot0001: "Windows Boot Manager"
)。SecureBoot
:启用/禁用安全启动。
- ACPI 表:如 DSDT、FADT,描述硬件资源。
- SMBIOS 数据:硬件资产信息(如序列号、主板型号)。
- NVRAM 变量 :
6. 签名和验证数据(Signatures & Verification Data)
-
作用:支持 Secure Boot 和固件完整性验证。
-
内容 :
- 证书数据库 :
- PK(Platform Key):平台所有者密钥。
- KEK(Key Exchange Key):用于更新其他密钥。
- DB/DBX:允许/禁止的签名证书或哈希列表。
- 模块签名:每个 UEFI 驱动或应用程序的加密签名(如 RSA-2048 + SHA256)。
- 证书数据库 :
-
验证流程 :
plaintext1. 固件启动时检查 PE/COFF 文件的签名。 2. 使用 DB 中的证书验证签名有效性。 3. 若验证失败(或 DBX 包含该哈希),则拒绝加载。
7. 备用区域(Fallback Region)
- 作用:当主固件损坏时提供恢复能力。
- 实现方式 :
- 存储一个最小化的 UEFI 核心(仅包含基本驱动和恢复 Shell)。
- 通过硬件触发(如主板跳线或特定按键组合)切换到备用区域启动。
8. 空闲区域(Free Space)
- 作用:保留未使用的存储空间,用于未来固件更新或 OEM 定制。
- 典型用途 :
- 固件升级时写入新模块。
- 厂商添加特定功能(如硬件诊断工具)。
- 扩展 ACPI 表或 SMBIOS 数据。
总结:UEFI 镜像的层次化设计
- 硬件兼容层(引导扇区 + 保护分区)→ 支持传统 BIOS 和恢复机制。
- 核心功能层(UEFI 固件映像)→ 实现启动流程(SEC → PEI → DXE → BDS)。
- 扩展层(驱动/应用程序 + 配置数据库)→ 提供硬件支持和用户配置。
- 安全层(签名验证 + 备用区域)→ 确保固件完整性和可恢复性。
工具与调试建议
-
查看分区结构 :
bash# 使用 gdisk 查看 GPT 分区 gdisk -l /dev/sda
-
提取 UEFI 变量 :
bash# 在 Linux 中通过 efivarfs 访问 ls /sys/firmware/efi/efivars
-
逆向分析固件 :
- UEFITool:解析固件卷和 FFS 文件。
- Hex Workshop:手动分析二进制结构。
- QEMU + UEFI 调试:动态跟踪启动流程。