深入了解固件写马(UEFI.BIOS)
字数 2023 2025-08-22 12:23:24
深入理解与修改UEFI/BIOS固件技术指南
零、环境准备
硬件与软件需求
- 虚拟机环境(推荐VMware或VirtualBox)及Windows镜像
- 编译环境配置
- 必要工具下载:
- NASM汇编器:nasm-2.16.03-installer-x64.exe
- EDK2开发框架:GitHub链接
- LLVM编译器:llvmorg-18.1.8
- Cygwin环境:setup-x86_64.exe
- Python 3.9:python-3.9.13-amd64.exe
重要警告
- 固件修改可能导致系统无法启动或硬件损坏
- 必须在安全环境下进行实验
- 务必备份当前固件并准备恢复方案
- 本指南仅供学习研究使用,严禁用于非法用途
一、BIOS/UEFI基础概念
1. BIOS与UEFI对比
| 特性 | BIOS | UEFI |
|---|---|---|
| 启动方式 | 基于MBR分区 | 支持GPT分区和EFI系统分区 |
| 启动速度 | 较慢 | 更快 |
| 硬盘支持 | ≤2TB | 支持>2TB大容量硬盘 |
| 界面 | 文本模式 | 图形用户界面(GUI) |
| 代码支持 | 16/32位 | 64位 |
| 安全性 | 较弱 | 支持Secure Boot |
| 兼容性 | 老旧系统 | 现代操作系统 |
| 固件大小 | ≤1MB | 几十MB |
2. 启动过程差异
传统BIOS启动流程:
- 硬件初始化
- 读取MBR引导记录
- 加载操作系统引导程序
UEFI启动流程:
- 硬件初始化
- 从EFI系统分区加载引导程序
- 执行操作系统引导
二、识别当前固件类型
Windows系统检测方法
-
系统信息法:
- Win+R → 输入
msinfo32 - 查看"BIOS模式"项:显示"UEFI"或"传统"
- Win+R → 输入
-
磁盘分区法:
- 管理员命令提示符:
diskpart list disk - 查看GPT列标记
- 管理员命令提示符:
-
磁盘管理法:
- Win+X → 磁盘管理 → 右键硬盘 → 属性 → 卷标签页
- 查看"分区样式":GUID分区表(GPT)或主引导记录(MBR)
Linux系统检测方法
-
检查EFI目录:
ls /sys/firmware/efi -
使用dmesg:
dmesg | grep -i efi -
查看分区表:
sudo fdisk -l
三、UEFI工作原理深度解析
1. UEFI运行阶段
-
硬件初始化阶段:
- CPU、内存、存储设备初始化
- 支持64位代码和大内存访问
-
驱动加载阶段:
- 加载硬件专用驱动
- 解决硬件兼容性问题
-
EFI系统分区访问:
- 读取FAT32格式的ESP分区
- 定位引导程序(如bootmgfw.efi)
-
操作系统交接:
- 移交控制权给OS引导程序
- 完成启动过程
2. UEFI核心组件
-
UEFI固件:
- 硬件初始化和自检
- 提供可扩展的引导环境
-
EFI系统分区(ESP):
- FAT32格式专用分区
- 存储引导程序和驱动程序
-
Bootloader:
- Windows: bootmgfw.efi
- Linux: grubx64.efi
-
EFI驱动程序:
- 硬件控制接口
- 支持网络、存储等设备
-
Secure Boot:
- 安全启动机制
- 验证引导程序签名
四、UEFI文件格式详解
1. 关键文件类型
-
.efi文件:
- UEFI可执行文件标准格式
- 包含引导程序和驱动程序
- 存储路径示例:
- /EFI/BOOT/bootx64.efi
- /EFI/Microsoft/Boot/bootmgfw.efi
-
.bin/.rom文件:
- 完整固件映像
- 用于刷写主板闪存
-
EFI系统分区:
- 必须的FAT32分区
- 典型目录结构:
/EFI/ ├── BOOT/ │ └── bootx64.efi └── Microsoft/ └── Boot/ └── bootmgfw.efi
五、UEFI修改实战指南
1. 开发环境搭建
-
安装EDK2工具链:
git clone https://github.com/tianocore/edk2 cd edk2 git submodule update --init -
环境变量配置:
- 添加NASM到PATH:
C:\Program Files\NASM - 设置NASM_PREFIX环境变量
- 添加NASM到PATH:
-
Python依赖安装:
pip install -r requirements.txt
2. UEFI程序开发
-
创建项目结构:
edk2/ └── MyShellcodeApp/ ├── MyShellcodeApp.c └── MyShellcodeApp.inf -
示例C代码模板:
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> // Shellcode示例 unsigned char shellcode[] = {0x90, 0x90, 0xCC}; // NOP, NOP, INT3 INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) { // 执行Shellcode void (*func)() = (void(*)())shellcode; func(); return 0; } -
INF文件配置:
[Defines] INF_VERSION = 0x00010005 BASE_NAME = MyShellcodeApp FILE_GUID = 12345678-1234-1234-1234-123456789ABC MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 ENTRY_POINT = ShellCEntryLib [Sources] MyShellcodeApp.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiApplicationEntryPoint UefiLib
3. 编译与部署
-
编译命令:
build -a X64 -p EmulatorPkg/EmulatorPkg.dsc -m MyShellcodeApp/MyShellcodeApp.inf -
部署到ESP分区:
- 将生成的.efi文件复制到:
/EFI/BOOT/bootx64.efi - 或自定义路径并通过UEFI引导菜单添加
- 将生成的.efi文件复制到:
-
设置默认启动项:
- 通过UEFI设置界面调整启动顺序
- 或使用UEFI Shell命令:
bcfg boot add 0 fs0:\EFI\BOOT\MyApp.efi "My Custom Loader"
4. 自动化思路
-
完整流程:
- 编译C代码为.efi格式
- 实现远程下载或本地存储机制
- 静默安装UEFI修改工具
- 刷写修改后的固件
- 清理操作痕迹
-
注意事项:
- 确保每一步都有错误处理和回滚机制
- 考虑不同硬件平台的兼容性
- 实现安全验证机制
六、安全与最佳实践
-
操作守则:
- 始终在虚拟机或专用测试设备上实验
- 保留完整的原始固件备份
- 使用版本控制管理修改记录
-
风险规避:
- 避免在生产环境直接测试
- 准备硬件编程器用于紧急恢复
- 测试前断开非必要外设
-
合法合规:
- 严格遵守当地法律法规
- 仅用于授权范围内的系统
- 禁止用于破坏性测试
本技术文档提供了从基础理论到实践操作的完整指南,涵盖了UEFI/BIOS固件修改的核心知识与关键技术要点。实际应用中请务必谨慎操作,并充分评估风险。