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 不知道整天忙活了個啥子。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM