适用于 Windows x64 的 BYOVD 手动映射器 · CVE-2025-8061
MSRMapper 是一款适用于 Windows x64 的手动内核驱动映射器,它利用存在漏洞的 Lenovo 驱动 LnvMSRIO.sys 中的 CVE-2025-8061 来执行 BYOVD(自带易受攻击驱动)攻击。
该项目将 PE64 驱动直接映射到内核内存中,无需使用 sc create 或服务,并在 ring 0 中执行其 DriverEntry。整个过程依赖于:
LnvMSRIO.sys 进行 MSR 和物理内存读写。NtQuerySystemInformation 的 SuperfetchPfnQuery 类进行 VA → PA 转换。LSTAR 以执行 ring-0 shellcode。NtAddAtom 以调用内核函数,如 ExAllocatePoolWithTag、RtlCopyMemory 和 DriverEntry。状态: 已在 Windows 10 22H2(OS Build 19045.6466) 上测试。驱动成功映射,且
DriverEntry返回STATUS_SUCCESS(0x0)。
ExAllocatePoolWithTag 在内核中手动映射 PE64。KiSystemCall64、NtAddAtom 等)。NtQuerySystemInformation 类 0x4F)进行 VA → PA 转换,无需自定义页表遍历器。LnvMSRIO.sys 进行 MSR(LSTAR、FMASK)和物理内存读写。LSTAR。MmGetPhysicalAddress 以获取 NtAddAtom 的 PA。swapgs; sysret 将控制权返回用户模式。NtAddAtom(12 字节 jmp rax)以调用任意内核函数。\\.\WinMsrDev(由 LnvMSRIO.sys 暴露的服务)。EnumDeviceDrivers 获取 ntoskrnl 基址,并使用 LSTAR 进行验证。PdbResolver 以解析内核符号 RVA。NtAddAtom 的 PALSTAR 被劫持时将在 ring 0 中运行。swapgs; iretq gadget 写入 LSTAR。PrepareStack 准备栈,并通过 EnableACUserMode 在用户模式下启用 AC=1。syscall 时,CPU 跳转到 gadget,运行 shellcode,调用 MmGetPhysicalAddress(NtAddAtom),并将 PA 存储到用户缓冲区中。LSTAR,并通过 swapgs; sysret 返回用户模式。ExAllocatePoolWithTag 分配非分页池(通过临时挂钩 NtAddAtom 调用)。RtlCopyMemory 将 PE 映像复制到池中。DriverObject = NULL 和 RegistryPath = NULL 调用 DriverEntry。NtAddAtom 的原始字节。.asm 文件。LnvMSRIO.sys(CVE-2025-8061),且 WinMsrDev 服务正在运行。C:\Symbols 中的本地缓存。本项目使用 CMake。要从命令行构建:
生成 Visual Studio 2022 解决方案:
cmake -B build -G "Visual Studio 17 2022" -A x64
以 Release 模式构建:
cmake --build build --config Release
输出的二进制文件将位于 build/bin/Release/(或根据 CMake 配置的类似路径)。
或者,你可以在 Visual Studio 2022 中打开生成的 build/KernelLoader.sln 并从那里构建。
确保 ShellcodeAsm.asm 和 EnableAC.asm 使用 MASM 编译。提供的 CMakeLists.txt 会自动处理这一点。
如果需要调整构建配置,请编辑 CMakeLists.txt。
安装并启动 LnvMSRIO.sys 服务:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
以管理员身份运行 KernelLoader.exe:
KernelLoader.exe
要查看已映射驱动的 DbgPrint 输出,请以管理员身份使用 DebugView(Sysinternals),并设置:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
Default 的 DWORD,值为 。PdbResolver 日志中出现的 DBGHELP: ... - unmatched 消息是表面性的。PDB 被加载到一个人为的虚拟基址,且 SymFromName 仍能正常工作。它不会影响符号解析。EnumDeviceDrivers 可能返回错误的基址。本项目通过 LSTAR - KiSystemCall64 计算真实基址。NtAddAtom 挂钩是临时的,并在每次调用后恢复。尽管如此,请仅在受控环境中使用。SMEP/SMAP 已启用。它们通过 CR4 被临时禁用,并在返回用户模式前恢复。EnumDeviceDrivers 可能返回错误的内核基址;真实内核基址通过 LSTAR - KiSystemCall64 计算得出。0xFFFFFFFF