UEFI编程基础
01 简介
UEFI启动流程
SEC PEI DXE BDS TSL RT AL
- Windows Boot Manager
安装完Windows系统后而出现的启动选项
(相关的信息存储在NVRAM, NVRAM是BIOS ROM中的一段区域,一般定义为 64k byte, 现在EFI把所有的变量都存在这里。),
可以删除和建立,和bcdboot.exe有关;
在BDS阶段,固件会默认引导Windows启动管理器。
默认情况下,UEFI固件加载的启动文是EFI\BOOT\bootx64.efi(bootia32.efi),
而Windows强制写入的启动项则会加载EFI\MICROSOFT\BOOT\bootmgfw.efi,这两个文件其实是一模一样的文件。
- Bootmgfw.efi
引导Windows的引导文件
- Bootx64.efi
UEFI的必需引导文件(windows下本质为bootmgfw)
UEFI开发环境搭建
02 UEFI开发环境搭建
1 、下载EDKII UEFI的跨平台固件开发环境
git clone –recursive https://github.com/tianocore/edk2.git
2 、安装nasm
下载nasm
https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/nasm-2.15.05-installer-x64.exe
配置环境变量
NASM_PREFIX=C:\nasm-2.15.05\
3 、安装ASL
ASL Compiler
https://acpica.org/sites/acpica/files/iasl-win-20210331.zip
将iasl.exe放到c:\ASL\ 目录下
4 、安装python 3
安装python3 ,并配置环境变量PYTHON_HOME
5 、安装Cygwin
安装Cygwin
http://www.cygwin.com/setup-x86_64.exe
修改edk2\BaseTools\Conf 目录下的target文件
edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)
配置处理器架构和编译工具链
配置环境变量CYGWIN_HOME
6 、配置编译参数
edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)
配置处理器架构和编译工具链
7 、编译
-
执行edksetup.bat,配置编译运行环境
-
执行build命令进行编译(编译时使用target文件内的配置,不指定其他参数时编译EmulatorPkg,uefi模拟器)
8 、编译参数
build -a X64 -p [ACTIVE_PLATFORM] -m [指定模块.inf]
9 、运行
一、Emulator模拟器
二、OVMF 运行方式
三、pe U盘
一、模拟器运行
使用build命令默认编译Emulator模拟器,路径:
edk2\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe
Tips:需要使用英文键盘,否则程序失去焦点
二、OVMF
OVMF(Open Virtual Machine Firmware,开放虚拟机固件)是用于虚拟机上的UEFI固件。
编译参数
build -a X64 -p OvmfPkg\OvmfPkgX64.dsc edk2\Build\OvmfX64\DEBUG_VS2019\FV\OVMF.fd
Qemu运行参数
qemu-system-x86_64.exe -bios "OVMF.fd" -M "pc" -m 256 -cpu "qemu64" -vga cirrus -serial vc -parallel vc -name "UEFI" -boot order=dc
Qemu Manager运行
03 UEFI hello world
UEFI 工程模块文件
包(Package)和模块(Module)
包(package) :包是一组模块和平台描述文件(.dsc文件)、包声明文件(.dec文件)组成的集合。在EDK 2 根目录下,有很多以*pkg命
名的文件夹,每一个这样的文件夹称为一个package。
模块(module) :由元数据文件(工程文件即.inf文件)和源文件(.c .asm .uni .vfr, 有些情况可包含.efi文件)组成。模块(可执行文件,即.efi文件)像插件一样可以动态的加载到UEFI内核中。
包相当于vs中的项目,.dsc文件相当于vs项目中的.sln文件
模块相当于vs中的工程,.inf文件相当于vs项目中的.vcxproj文件
开发UEFI 应用程序
模块.inf文件
包 .dsc文件
.inf用于编译一个模块,.dsc用于编译一个Package,
包含了[Defines] 、 [LibraryClasses] 、 [Components] 等几个必须部分
以及[PCD]、[BuildOptions]等可选部分。
[Defines]块:必须是.dsc文件的第一个部分,用于设置build相关的全局宏变量。
[LibraryClasses] 块:定义了库的名字以及库.inf文件的路径。这些库可被[Components]块内的模块引用。
[Components] 块:在该区域内定义的模块都会被build工具编译并生成.efi文件。
.dec文件定义了公开的数据和接口,供其他模块使用。
包含了必须区块:[Defines],
可选区块:[Includes]、[LibraryClasses]、[Guids]、[Protocols]、[Ppis]和[PCD]几个部分。
[Defines] :用于提供package的名称、GUID、版本号等信息。
[Includes] :列出了本package提供的头文件所在的目录。
[LibraryClasses] :Package可通过.dec文件对外提供库,每个库都必须有一个头文件,放在Include\Library目录下。本区块用于明确库和头文件的对应关系。
编译UEFI 应用程序
运行UEFI 应用程序
04 UEFI调试环境搭建
注册默认调试器
Visual Studio: "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld
软件断点
通过插入软件断点调试模拟器
OVMF固件调试
0 、编译OVMF.fd(启用调试)
一、安装windbg
二、安装Intel UDK Debugger Tool
https://software.intel.com/sites/default/files/managed/de/00/UDK_Debugger_Tool_v1_5_Win.zip
三、配置SoftDebugger.ini
(位于C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\)
四、配置qemu参数
-serial tcp:localhost:20716,server
OVMF调试资料
How to debug OVMF with QEMU using WinDbg · tianocore/tianocore.github.io Wiki
Ovmf source level debug - S!mon SAYS (damn99.com)
UEFI资料
2015 Hacking Team
hackedteam/vector-edk: EFI Development Kit
英特尔 ATR 培训:从攻击者和防御者的角度来看,BIOS/UEFI 系统固件的安全性
enascimento/firmware-security-training: Intel ATR Training: Security of BIOS/UEFI System Firmware from Attacker and Defender Perspectives
固件笔记 mytbk/firmware_notes: some notes aboutfirmware(BIOS,UEFI,coreboot,routers,embedded system,etc.)
Disable PatchGuard and DSE at boot time
Mattiwatti/EfiGuard: Disable PatchGuard and DSE at boot time
A tool for UEFI firmware reverse engineering
yeggor/uefi_retool: A tool for UEFI firmware reverse engineering
Hyper-V Hacking Framework For Windows 10 x64 (AMD & Intel)
_xeroxz / Voyager · GitLab (githacks.org)
唉,有半年没搞了,忘没了,0.0 不知道整天忙活了个啥子。