UEFI镜像结构布局

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):调度器、服务表(如 gBSgRT)。
    • UEFI 驱动(如 PCI 驱动、USB 驱动)。
    • 协议(Protocol)和句柄(Handle)定义。
(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 的层次化执行流程。
  • 安全优先:从硬件初始化到操作系统加载全程支持安全验证。

如需进一步分析具体镜像,建议使用 UEFIToolBinwalk 进行逆向分析。

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):指向固件中的各种资源和表。

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)。
(2) 节表(Section Table)
  • 作用:定义固件卷内各文件(FFS 文件)的布局和类型。
  • 常见节类型
    • PEI 核心节:包含 Pre-EFI 初始化代码。
    • DXE 核心节:驱动执行环境的核心模块。
    • 用户界面节:启动时显示的图形资源(如 Logo、字体)。
(3) PE/COFF 格式
  • 作用:UEFI 可执行文件的标准格式(驱动、应用程序均为此格式)。

  • 结构

    • DOS 头 (兼容性保留,内容固定为 MZ)。
    • PE 头 :机器类型(如 EFI_IMAGE_MACHINE_X64)、入口点地址。
    • 节表 :定义代码(.text)、数据(.data)和资源(.rsrc)段的偏移与属性。
  • 示例

    plaintext 复制代码
    +---------------------+
    | DOS Header ("MZ")   |
    +---------------------+
    | PE Header           | → 包含入口点 _ModuleEntryPoint
    +---------------------+
    | .text Section       | → 可执行代码
    +---------------------+
    | .data Section       | → 全局变量
    +---------------------+
    | .reloc Section      | → 重定位信息
    +---------------------+

4. 驱动程序和应用程序(Drivers & Applications)

  • 作用:扩展 UEFI 功能或提供用户交互界面。
  • 典型内容
    • 硬件驱动:PCIe 控制器驱动、USB 主机控制器驱动。
    • 协议实现EFI_BLOCK_IO_PROTOCOLEFI_GRAPHICS_OUTPUT_PROTOCOL
    • 应用程序:UEFI Shell、启动管理器(Boot Manager)、诊断工具。
  • 存储形式 :以 FFS 文件形式嵌入固件卷,文件类型为 PE32PE32+

5. 配置数据库(Configuration Database)

  • 作用:存储 UEFI 变量和平台配置信息。
  • 内容
    • NVRAM 变量
      • BootOrder:定义启动设备优先级。
      • Boot####:单个启动项配置(如 Boot0001: "Windows Boot Manager")。
      • SecureBoot:启用/禁用安全启动。
    • ACPI 表:如 DSDT、FADT,描述硬件资源。
    • SMBIOS 数据:硬件资产信息(如序列号、主板型号)。

6. 签名和验证数据(Signatures & Verification Data)

  • 作用:支持 Secure Boot 和固件完整性验证。

  • 内容

    • 证书数据库
      • PK(Platform Key):平台所有者密钥。
      • KEK(Key Exchange Key):用于更新其他密钥。
      • DB/DBX:允许/禁止的签名证书或哈希列表。
    • 模块签名:每个 UEFI 驱动或应用程序的加密签名(如 RSA-2048 + SHA256)。
  • 验证流程

    plaintext 复制代码
    1. 固件启动时检查 PE/COFF 文件的签名。
    2. 使用 DB 中的证书验证签名有效性。
    3. 若验证失败(或 DBX 包含该哈希),则拒绝加载。

7. 备用区域(Fallback Region)

  • 作用:当主固件损坏时提供恢复能力。
  • 实现方式
    • 存储一个最小化的 UEFI 核心(仅包含基本驱动和恢复 Shell)。
    • 通过硬件触发(如主板跳线或特定按键组合)切换到备用区域启动。

8. 空闲区域(Free Space)

  • 作用:保留未使用的存储空间,用于未来固件更新或 OEM 定制。
  • 典型用途
    • 固件升级时写入新模块。
    • 厂商添加特定功能(如硬件诊断工具)。
    • 扩展 ACPI 表或 SMBIOS 数据。

总结:UEFI 镜像的层次化设计

  1. 硬件兼容层(引导扇区 + 保护分区)→ 支持传统 BIOS 和恢复机制。
  2. 核心功能层(UEFI 固件映像)→ 实现启动流程(SEC → PEI → DXE → BDS)。
  3. 扩展层(驱动/应用程序 + 配置数据库)→ 提供硬件支持和用户配置。
  4. 安全层(签名验证 + 备用区域)→ 确保固件完整性和可恢复性。

工具与调试建议

  • 查看分区结构

    bash 复制代码
    # 使用 gdisk 查看 GPT 分区
    gdisk -l /dev/sda
  • 提取 UEFI 变量

    bash 复制代码
    # 在 Linux 中通过 efivarfs 访问
    ls /sys/firmware/efi/efivars
  • 逆向分析固件

    • UEFITool:解析固件卷和 FFS 文件。
    • Hex Workshop:手动分析二进制结构。
    • QEMU + UEFI 调试:动态跟踪启动流程。
相关推荐
cg501716 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影16 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain16 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
非ban必选17 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
mingqian_chu17 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
GalaxyPokemon18 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++
自由鬼18 小时前
开源虚拟化管理平台Proxmox VE部署超融合
linux·运维·服务器·开源·虚拟化·pve
瞌睡不来18 小时前
(学习总结32)Linux 基础 IO
linux·学习·io