EfiGuard 是一款便携式 x64 UEFI 启动工具包(bootkit),可在启动时修补 Windows 启动管理器、启动加载器和内核,以禁用 PatchGuard 和驱动程序签名强制(DSE)。
如果你只是想尝试 EfiGuard,请跳到使用。
目前支持自 Vista SP1 至 Windows 11 所有已发布的与 EFI 兼容的 Windows x64 版本。
易于使用:可通过 U 盘或 Windows EFI 分区启动,加载器会自动查找并启动 Windows。驱动程序也可通过 UEFI Shell 或加载器手动加载和配置。
大量使用 Zydis 反汇编库进行快速运行时指令解码,以支持比签名匹配更健壮的分析——签名匹配通常需要随新系统更新而更改。
被动工作:驱动程序不会加载或启动 Windows 启动管理器,而是通过固件启动管理器(通过启动选择菜单或 EFI 应用程序,如加载器)对 bootmgfw.efi 的加载做出反应。如果启动非 Windows 操作系统,驱动程序将自动卸载自身。
支持四阶段修补,适用于 bootmgfw.efi 启动 bootmgr.efi 而非 winload.efi 的情况,例如加载 WIM 文件以启动 WinPE、Windows 安装程序或 Windows 恢复模式时。
优雅恢复:如果修补失败,驱动程序将显示错误信息并提示按 ESC 继续启动或重启。即便在内核修补的最后阶段也是如此,因为最后的修补阶段发生在调用 ExitBootServices 之前。许多 UEFI Windows 启动工具包会挂钩 OslArchTransferToKernel——该函数虽易于通过模式匹配找到,却是在 ExitBootServices 之后以保护模式执行的。这意味着没有可用的引导服务来告知用户出现问题。

模拟的修补失败及其错误信息
可调试:在内核修补阶段可将消息输出到内核调试器和屏幕(尽管是缓冲输出),在启动管理器和启动加载器修补阶段可将消息输出到串行端口或屏幕(无缓冲)。如果驱动程序以 PDB 调试信息编译,可在 HAL 初始化后的任意时刻加载调试符号,只需指定虚拟 DXE 驱动程序基址,并像调试普通 NT 驱动程序一样调试它。
DSE 绕过:提供两种方式:一种是在启动时直接禁用 DSE(类似 UPGDSED 风格),另一种是挂钩 EFI 运行时服务 SetVariable()。后者作为任意内核模式读/写后门,可通过 Windows 的 NtSetSystemEnvironmentValueEx 从用户态调用,并允许将 g_CiEnabled/g_CiOptions 设置为所需值。此外还提供了一个名为 EfiDSEFix.exe 的小型 DSEFix 风格应用程序。也可以保持 DSE 启用而仅禁用 PatchGuard。默认情况下,加载器将使用 SetVariable 挂钩方法,因为某些反作弊和防病毒程序无法区分作弊/恶意软件与自签名驱动程序的差异,并会针对 UPGDSED 修复。
支持已修改的内核和启动加载器(磁盘上的),通过在每一阶段修补 ImgpValidateImageHash 以及 ImgpFilterValidationFailure(后者可能静默地将某些违规行为报告给 TPM 或 SI 日志文件)来实现。
允许 Windows 7 在启用安全启动(Secure Boot)的情况下工作(这不是玩笑!)。Windows 7 本身不支持安全启动,甚至(根据官方资料)在不启用 CSM 的情况下无法启动。这对那些希望在需要 WHQL 安全启动的锁定设备上使用 Windows 7 的用户很有用。关于如何实现此功能的 Wiki 条目请参见此处。

已启用安全启动的 Windows 7 上的 WinObjEx64
SetVariable 挂钩如果用于写入 g_CiOptions,将导致 SECURE_KERNEL_ERROR 蓝屏。使用 EfiGuard 有两种方式:启动加载器应用程序,它将加载驱动程序并自动启动 Windows;或者将驱动程序安装为 UEFI 驱动程序条目,以便由固件自动加载。在某些高级配置(如多启动)中,安装驱动程序可能更优,但加载器最容易使用,且应在所有配置中正常工作。参见下表了解两种方法的主要区别。如果不确定,请选择加载器应用程序。
| 位置 | 安装方式 | 可跳过? | 启动哪个 OS? | |
|---|---|---|---|---|
| UEFI 驱动程序条目 | 必须在 ESP 上 | 通过 UEFI Shell | ❌ | 与之前相同 |
| 加载器 | 任意位置 | 无需安装 | ✔️ |
加载器与 UEFI 驱动程序条目对比
EFI/Boot/Loader.efi 重命名为 bootx64.efi。X:,两个文件的路径现在应为 X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable 挂钩(默认)启动,启动后请以管理员身份运行命令提示符并执行 EfiDSEFix.exe -d 以禁用 DSE,或运行 EfiDSEFix.exe 查看完整选项列表。请注意,加载器不需要使用单独的驱动器。如果方便,你可以将 EfiGuard 安装在 Windows 已安装的 ESP 上。不过这会更复杂,因为你需要为加载器添加一个 UEFI 启动项。
具体做法:使用 mountvol X: /S 将 ESP 挂载到 X:,然后按照上述步骤操作,但不要重命名加载器,直接将两个文件复制到 X:/EFI/Boot。之后,你需要从 UEFI Shell 手动添加 UEFI 启动项:使用 bcfg boot addp 0 Loader.efi "EfiGuard",或者使用 efibootmgr(Linux)、EasyUEFI(Windows)等工具。
mountvol X: /S 将 ESP 挂载到 X:。EfiGuardDxe.efi 复制到 X:/EFI/Boot/EfiGuardDxe.efi。bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe"。SetVariable 挂钩(默认)启动,启动后请以管理员身份运行命令提示符并执行 EfiDSEFix.exe -d 以禁用 DSE,或运行 EfiDSEFix.exe 查看完整选项列表。注意:取决于你的固件,步骤 3 中可能需要使用 "addp" 而不是 "add"。已知 VirtualBox 需要这样操作,某些主板固件也可能如此。
注意:某些非常老旧或不符合规范的固件可能完全不支持这种安装方式。在这些系统上,你只能使用加载器。
EfiGuard 需要 EDK2 来构建。如果你没有安装 EDK2,请先按照 EDK2 入门 的步骤操作,因为 EDK2 构建系统设置起来相当复杂。本节假设你的 WORKSPACE 环境变量指向一个 workspace 目录,且其中已检出 EDK2 副本(位于 workspace/edk2)。支持的编译器包括 MSVC、Clang、GCC 和 ICC。
workspace/edk2/EfiGuardPkg。build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE,将 VS2019 替换为你的工具链。这将生成 EfiGuardDxe.efi 和 Loader.efi,位于 workspace/Build/EfiGuard/RELEASE_VS2019/X64。
EfiDSEFix 需要 Visual Studio 来构建。
EfiGuard.sln 并生成解决方案。输出二进制文件 EfiDSEFix.exe 将位于 Application/EfiDSEFix/bin。
Visual Studio 解决方案中还包含 EfiGuardDxe.efi 和 Loader.efi 的项目,可使用 VisualUefi 进行构建,但默认不会构建这些项目,因为它们在缺少额外代码的情况下无法链接,且构建输出会比 EDK2 生成的更大(文件更大)。Loader.efi 甚至完全无法链接,因为 VisualUefi 缺少 UefiBootManagerLib。因此这些项目文件仅用作开发辅助,EFI 文件仍应使用 EDK2 编译。为此目的设置 VisualUefi 时,请将仓库克隆到 workspace/VisualUefi,然后打开 EfiGuard.sln。
尽管 EfiGuard 是一个 UEFI 启动工具包,但它最初并非如此。EfiGuard 最初是一个运行在 NT 上的磁盘修补器(类似于 UPGDSED),旨在测试基于反汇编器的方法的可行性,以替代使用 PDB 符号和版本特定签名的方式。PatchNtoskrnl.c 仍然非常像这种原始设计。仅当这种方法被证明成功——在一年多的 Windows 更新中无需对代码进行任何修改——之后,UEFI 才被考虑进来,以进一步提升能力和易用性。
启动工具包方法带来的一些好处包括:
bcdedit 修改启动配置存储。ImgpValidateImageHash(尽管仍可选择性地进行)。db 存储中。EfiGuard 作为启动工具包的初始形态是尝试让 dude719 的 UEFI-Bootkit 能够在较新的 Windows 10 版本上工作,因为它已经过时,不再适用于最新版本(像 UPGDSED 一样,通常是由版本敏感的模式扫描导致的)。虽然我最终让它工作了,但我对结果并不满意,主要是因为选择了挂钩 OslArchTransferToKernel——如前所述,该函数在保护模式下执行,且 ExitBootServices 已被调用。除此之外,我并不满足于仅能修补某些版本的 Windows 10;我希望启动工具包能够适用于所有至今发布的与 EFI 兼容的 Windows x64 版本。因此,我完全重写了启动工具包,目标如下:
上方的图表提供了最终 EfiGuard 启动流程的宏观概览。有关各个组件特定的挂钩和修补,请参阅源文件中的 EfiGuardDxe/PatchXxx.c。关于驱动程序初始化/卸载以及 EFI 启动和运行时服务挂钩,请参阅 EfiGuardDxe.c。
EfiGuard 根据 GPLv3 许可证授权。EfiGuardDxe/Zydis 子模块中的文件根据 MIT 许可证授权。
| Windows |