UEFI层实现FAT分区写入
0x0 实验对象
- bios1.bin:未修改的原始OVMF镜像
- bios2.bin:修改UIAPP后,重新编译的OVMF镜像
- syshd.iso:使用qemu-img创建的虚拟硬盘
- 容量大小8G
- 三个分区 EFI(FAT)+ SWAP + EXT4,GPT分区表
- EXT4分区安装Alpine Linux,用户名root,密码123
0x1 实验思路
在UIAPP中插入相应代码,尝试在FAT分区中实现文件写入
代码功能实现:在磁盘的EFI分区下的/EFI/文件夹中创建一个TestWT.txt文件,并向其中写入指定字符串。
0x2 实验过程
0x20 bios1.bin | 正常启动
1 | qemu-system-x86_64 -hda syshd.img -bios bios1.bin -m 4096 |
使用原始bios1.bin作为bios,正常启动进入系统
观察原始/boot下挂载的EFI分区内情况:/EFI文件夹存在两个目录

0x21 bios2.bin | 正常启动
1 | qemu-system-x86_64 -hda syshd.img -bios bios2.bin -m 4096 |
使用修改后的镜像bios2.bin作为bios,直接进入系统
观察/boot下挂载EFI分区内情况,没有TestWT.txt文件,说明正常启动过程中不会运行UEFI应用程序UIAPP

0x22 bios2.bin | 从界面启动
1 | qemu-system-x86_64 -hda syshd.img -bios bios2.bin -m 4096 |
从BIOS UI进入系统,会运行UIAPP

选择从硬盘启动,经过grub后进入系统,观察/boot下挂载EFI分区内情况,发现插入的代码已经成功执行。

0x23 bios2.bin | UEFI Shell
删除/boot/EFI/testWT.txt后,从BIOS UI进入BIOS Shell,也能执行插入代码

0x3 实验记录与结论
- 在UEFI APP中插入代码,能够实现在UEFI中对FAT分区的读写,并且只有当 UEFI APP被执行时才会运行插入的代码
- 尝试在UEFI驱动中(LogoDxe)插入同样的代码,可以通过编译生成镜像,但镜像无法正常启动,可能是驱动执行时无法调用文件操作对应API
- UEFI APP 和UEFI DXE驱动在固件镜像中位于同一位置,并且能够被替换
0x4 附 插入代码
edk2/MdeModulePkg/Application/UiApp/FrontPage.c
函数入口:InitializeFrontPage
1 | ////////////////////////////////插入开始//////////////////////////////// |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zzHIHAnn's Blog!