UEFI编程基础

UEFI编程基础

01 简介

UEFI启动流程

image

SEC PEI DXE BDS TSL RT AL

image

  • 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

image

2 、安装nasm

下载nasm

https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/nasm-2.15.05-installer-x64.exe

image

配置环境变量

NASM_PREFIX=C:\nasm-2.15.05\

image

3 、安装ASL

ASL Compiler
https://acpica.org/sites/acpica/files/iasl-win-20210331.zip
将iasl.exe放到c:\ASL\ 目录下

image

4 、安装python 3

安装python3 ,并配置环境变量PYTHON_HOME

image

5 、安装Cygwin

安装Cygwin
http://www.cygwin.com/setup-x86_64.exe
修改edk2\BaseTools\Conf 目录下的target文件
edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)

配置处理器架构和编译工具链
image

配置环境变量CYGWIN_HOME

image

6 、配置编译参数

edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)
配置处理器架构和编译工具链

image

7 、编译

  1. 执行edksetup.bat,配置编译运行环境

  2. 执行build命令进行编译(编译时使用target文件内的配置,不指定其他参数时编译EmulatorPkg,uefi模拟器)
    image
    image
    image

8 、编译参数

build -a X64 -p [ACTIVE_PLATFORM] -m [指定模块.inf]

9 、运行

一、Emulator模拟器
二、OVMF 运行方式
三、pe U盘

一、模拟器运行

使用build命令默认编译Emulator模拟器,路径:
edk2\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe

image

Tips:需要使用英文键盘,否则程序失去焦点

image

二、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运行

image

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 应用程序

image

模块.inf文件

image

image

包 .dsc文件

.inf用于编译一个模块,.dsc用于编译一个Package,
包含了[Defines] 、 [LibraryClasses] 、 [Components] 等几个必须部分
以及[PCD]、[BuildOptions]等可选部分。
[Defines]块:必须是.dsc文件的第一个部分,用于设置build相关的全局宏变量。

image

[LibraryClasses] 块:定义了库的名字以及库.inf文件的路径。这些库可被[Components]块内的模块引用。
image

[Components] 块:在该区域内定义的模块都会被build工具编译并生成.efi文件。
image

.dec文件定义了公开的数据和接口,供其他模块使用。

包含了必须区块:[Defines],
可选区块:[Includes]、[LibraryClasses]、[Guids]、[Protocols]、[Ppis]和[PCD]几个部分。
[Defines] :用于提供package的名称、GUID、版本号等信息。
[Includes] :列出了本package提供的头文件所在的目录。
[LibraryClasses] :Package可通过.dec文件对外提供库,每个库都必须有一个头文件,放在Include\Library目录下。本区块用于明确库和头文件的对应关系。
image

编译UEFI 应用程序

image

运行UEFI 应用程序

image

04 UEFI调试环境搭建

注册默认调试器

Visual Studio:   "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

image

软件断点

通过插入软件断点调试模拟器

image

image

image
image

__debugbreak

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
image

image

OVMF调试资料

How to debug OVMF with QEMU using WinDbg · tianocore/tianocore.github.io Wiki

Ovmf source level debug - S!mon SAYS (damn99.com)

小華的部落格: Intel® UEFI Development Kit Debugger Tool (Intel UDK Debugger and OVMFPkg) (biosengineer.blogspot.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 不知道整天忙活了个啥子。

posted @ 2021-12-10 22:52  DirWangK  阅读(3984)  评论(0编辑  收藏  举报