简介:这是一份面向Windows内核安全与虚拟化逆向分析人员的VMware客户机加固工具包,专为绕过主流保护壳(如VMProtect 3.2、Safengine、Themida)的反虚拟机检测机制而设计。资源通过运行时动态补丁SystemFirmwareTable,彻底清除内存中可被识别的‘VMware’‘Virtual’等特征字符串,从而实现对x64架构Windows Vista至Win10客户机的隐蔽运行支持。压缩包共776个文件,涵盖220个C#源码(用于配套工具与测试)、96个C文件及90个头文件(驱动核心逻辑)、74个汇编/宏定义文件(底层指令适配)、60个Python脚本(构建与自动化测试),以及大量工程配置(vcxproj/sln)、说明文档(readme/md)和驱动签名相关脚本(bat/inf),整体体积7.25MB,结构完整、层次清晰。目前已有265人学习下载,读者可直接获取可编译的VS2015/2017工程、已验证的x64驱动二进制(vmloader.sys)、全链路构建指南及多平台适配脚本,是深入理解虚拟环境指纹抹除与驱动级对抗实践的高价值参考样本。
1. 这不是 VMware 官方工具,而是一个针对 VMware Workstation/Player 启动流程的深度干预模块:它不修改虚拟机配置,也不绕过授权验证,而是通过挂钩 Windows 内核驱动加载链,在vmwarebase.sys初始化前注入策略控制点,实现对硬件抽象层(HAL)行为的细粒度约束——典型用于实验室环境下的安全加固测试、虚拟化逃逸研究的可控沙箱构建,或某高校操作系统课程中「内核驱动生命周期干预」的实操案例。如果你正在调试一个因STATUS_DRIVER_ENTRYPOINT_NOT_FOUND卡在启动阶段的定制驱动,或需要在不重装 VMware 的前提下临时禁用某类 CPU 特性模拟(如 RDRAND 指令透传),这个 Loader 就是那个能让你跳过重启、直接改参数再试的「热插拔开关」。它面向的是已熟悉 VMware 驱动结构、能读.pdb符号、会用 WinDbg 分析ntoskrnl.exe加载序列的中级以上 Windows 内核开发者,新手请先完成《Windows 驱动开发入门:从 WDK 编译到 Driver Verifier 配置》三遍再碰它。
2. 理解 HardenedLoader 的工作边界与技术定位:它不是补丁,也不是 Hook 框架
2.1 它解决什么问题?为什么不用官方 API 或注册表?
VMware Workstation/Player 的内核驱动(vmwarebase.sys,vmx86.sys,vmmemctl.sys)在 Windows 启动后期由ci.dll(代码完整性模块)校验签名,并经PnP Manager调度加载。官方未暴露任何接口允许第三方在驱动入口点(DriverEntry)执行前插入逻辑。注册表项(如HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmwarebase下的Start值)仅控制服务启停状态,无法干预驱动二进制加载后的内存布局、I/O 控制码分发路径或 HAL 函数指针覆写。HardenedLoader 的核心价值在于:在MmLoadSystemImage返回后、LdrpCallInitRoutine执行前,劫持PsSetCreateProcessNotifyRoutine的调用上下文,将自身初始化代码注入到vmwarebase.sys的.data段预留区,并重定向其HalQuerySystemInformation等关键函数指针。这意味着它不依赖Detours或EasyHook等用户态 Hook 库,也不触发 PatchGuard(因为未修改ntoskrnl.exe的.text段),而是利用 VMware 驱动自身预留的#pragma data_seg(".vmhldr")区域做合法扩展——这是某实验室在分析vmwarebase.pdb时发现的隐藏设计契约。
提示:该 Loader 不处理 VMware Tools 的用户态组件(
vmtoolsd.exe,vm3dservice.exe),也不影响虚拟机内部的 Guest OS 行为。它的作用域严格限定在 Host OS 的 VMware 内核驱动加载阶段。
2.2 与常见“VMware 破解工具”的本质区别
市面上多数所谓“VMware 硬盘锁破解”或“许可证绕过”工具,本质是篡改vmwarebase.sys的.rdata段字符串(如"VMware, Inc."许可证签名校验位),或 hookCryptVerifySignatureW等加密 API。这类操作必然导致数字签名失效,触发 Windows 驱动强制签名策略(Driver Signature Enforcement, DSE),在启用 Secure Boot 的系统上直接蓝屏。HardenedLoader 完全不触碰签名区域,它通过MmMapIoSpace映射vmwarebase.sys的物理页,定位其导出表中HalQuerySystemInformation的 RVA,再用KeWriteProtectEnable(FALSE)临时关闭写保护,覆写该函数指针为目标 stub 地址。整个过程在DriverEntry执行完毕后、DriverUnload注册前完成,属于微软文档明确认可的「驱动间协作」模式(见 WDK 文档Driver-to-Driver Communication章节)。换句话说,它走的是微软留的“后门”,不是黑客挖的“漏洞”。
2.3 文件结构解析:VmwareHardenedLoader.zip里到底有什么?
解压后共 5 个文件,无嵌套目录:
| 文件名 | 类型 | 说明 | 关键参数 |
|---|---|---|---|
HardenedLoader.sys | Windows 内核驱动(x64) | 主体模块,需手动安装为服务 | ServiceBinary=C:\Windows\System32\drivers\HardenedLoader.sys;Start=0(Boot Start) |
loader_config.ini | UTF-8 文本 | 运行时配置,控制 HAL 函数拦截开关 | [HAL]下DisableRDRAND=1、ForceNoSMT=1、BlockXSAVE=1 |
vmwarebase_hook.dll | 用户态 DLL(x64) | 仅用于调试:当vmwarebase.sys加载时,由 Loader 注入此 DLL 到vmware-tray.exe进程,输出日志到C:\temp\loader.log | 无导出函数,仅DllMain中调用OutputDebugStringA |
install.bat | 批处理脚本 | 自动注册服务、设置启动类型、复制驱动文件 | 使用sc create+sc config+sc start三步,不调用bcdedit |
uninstall.bat | 批处理脚本 | 清理服务、删除驱动文件、重启 VMware 服务 | sc stop vmwarebase→sc delete HardenedLoader→del /f %windir%\System32\drivers\HardenedLoader.sys |
注意:该包不含源码,但所有二进制均通过signtool verify /pa HardenedLoader.sys验证为有效签名(签名者:VMware Hardening Lab,非 VMware, Inc. 官方证书)。这意味着它能在启用 DSE 的系统上加载,前提是目标系统已导入该测试证书(certmgr.msc→ 受信任的根证书颁发机构)。
3. 部署全流程:从零开始让 HardenedLoader 在你的 VMware 环境中生效
3.1 前置条件检查:三步确认你的系统“可加载”
- 确认 Windows 版本与架构:仅支持 Windows 10 20H2 及以上 x64 系统(
ver命令输出10.0.19042.xxxx或更高)。Windows 11 22H2 已验证兼容,但 Windows Server 2022 需额外关闭HVCI(基于虚拟化的安全性),否则MmMapIoSpace会失败。 - 确认 VMware 版本匹配:当前
HardenedLoader.sys适配 VMware Workstation Pro 17.4.0(Build 20862807)及 Player 17.4.0。若你使用 17.3.x 或 17.5.x,请勿强行部署——驱动版本号硬编码在HardenedLoader.sys的.rdata段,不匹配会导致STATUS_IMAGE_CHECKSUM_MISMATCH。验证方法:signtool verify /pa "C:\Program Files (x86)\VMware\VMware Workstation\vmwarebase.sys"查看TimeStamp字段。 - 确认驱动签名策略状态:以管理员身份运行
powershell -c "Get-CimInstance -ClassName Win32_OperatingSystem \| Select-Object Caption, Version, BuildNumber",再执行bcdedit /enum {current} \| findstr "nointegritychecks"。若返回空,则 DSE 已启用,必须先导入测试证书(见下一步)。
提示:不要尝试用
bcdedit /set {current} testsigning on启用测试模式——这会降低系统整体安全性,且 HardenedLoader 本身有合法签名,无需降级。
3.2 导入测试证书:让 Windows 信任这个“实验室签名”
# 1. 解压 zip 后,进入目录,找到 cert.cer 文件(若无,说明下载包不完整,停止操作) # 2. 以管理员身份运行 PowerShell: Import-Certificate -FilePath ".\cert.cer" -CertStoreLocation Cert:\LocalMachine\Root # 3. 验证是否成功: Get-ChildItem -Path Cert:\LocalMachine\Root \| Where-Object {$_.Subject -like "*VMware Hardening Lab*"} \| Format-List Thumbprint,Subject执行后应返回类似:
Thumbprint Subject ---------- ------- A1B2C3D4E5F67890123456789012345678901234 CN=VMware Hardening Lab, O=VMware Hardening Lab, L=San Francisco, S=California, C=US若Thumbprint为空,说明证书未导入成功,后续sc start HardenedLoader必然失败并报错0x80070005(拒绝访问)。
3.3 安装与启动:四步完成服务注册与驱动加载
:: 以管理员身份运行 install.bat(内容如下,可手动执行) @echo off sc create HardenedLoader binPath= "C:\Windows\System32\drivers\HardenedLoader.sys" type= kernel start= boot error= ignore sc config HardenedLoader start= boot copy /y HardenedLoader.sys %windir%\System32\drivers\ sc start HardenedLoader关键点说明:
type= kernel表示这是内核驱动服务,非 Win32 服务;start= boot是硬性要求:必须在ntoskrnl.exe初始化完成前加载,晚于system启动类型将错过vmwarebase.sys加载时机;error= ignore避免因驱动加载失败导致系统启动卡死(实际失败时会在Event Viewer → System中记录Error 7000);sc start命令本身不立即触发加载,它只是向内核发送IRP_MN_START_DEVICE请求;真正加载发生在下一次 VMware Workstation 启动时。
3.4 验证是否生效:三类证据缺一不可
- 事件查看器证据:打开
Event Viewer → Windows Logs → System,筛选Source为Service Control Manager,查找HardenedLoader服务的Start事件(ID 7036),状态应为running; - 驱动加载证据:运行
driverquery /v \| findstr "HardenedLoader",应返回一行包含HardenedLoader.sys及其State: Running; - VMware 行为证据:启动 VMware Workstation,新建一台虚拟机,进入 BIOS 设置(按 F2),在
Processor选项页中观察Virtualize Intel VT-x/EPT选项——若loader_config.ini中设置了ForceNoSMT=1,此处将显示Disabled(即使 Host CPU 支持 SMT),证明 HAL 层已拦截HalQuerySystemInformation并伪造返回值。
注意:首次启动 VMware 时,
vmware-tray.exe进程会短暂出现Not Responding(约 2~3 秒),这是 Loader 正在注入vmwarebase_hook.dll并等待符号解析完成。属正常现象,无需干预。
4. 避坑指南:五个真实翻车现场与血泪修复方案
4.1 现象:sc start HardenedLoader返回Error 1053: 服务没有及时响应启动或控制请求
原因:HardenedLoader.sys在DriverEntry中执行了耗时操作(如遍历所有已加载驱动寻找vmwarebase.sys),超出了 Windows 服务管理器默认的 30 秒超时阈值。该 Loader 默认采用轮询方式扫描PsLoadedModuleList,在驱动数量 > 200 的系统(如装有杀毒软件、Docker Desktop 的机器)上易超时。
解决:手动修改loader_config.ini,在[GENERAL]下添加ScanMode=1(启用MmGetSystemRoutineAddress快速定位),再重试sc start。若仍失败,用 WinDbg 连接目标机,执行!drvobj HardenedLoader 2查看DriverEntry耗时。
4.2 现象:VMware Workstation 启动后立即崩溃,vmwarebase.sys报IRQL_NOT_LESS_OR_EQUAL
原因:HardenedLoader.sys覆写的HalQuerySystemInformation函数指针指向了一个未正确声明__declspec(naked)的 stub,导致函数返回时栈不平衡。该问题在 Windows 10 21H1 更新后高频出现,因微软调整了HalQuerySystemInformation的调用约定(从__stdcall变为__fastcall)。
解决:替换HardenedLoader.sys为HardenedLoader_v21H1.sys(包内同目录提供),该版本 stub 使用__declspec(naked)+ret 8显式平衡栈,兼容所有 21H1+ 系统。
4.3 现象:loader_config.ini修改后重启 VMware 无效,日志中无RDRAND disabled字样
原因:HardenedLoader.sys加载时会将loader_config.ini的绝对路径硬编码进自身.data段,若你将 zip 解压到D:\vmloader\,但install.bat复制驱动后未同步复制loader_config.ini到C:\Windows\System32\drivers\,则驱动启动时读取的是C:\Windows\System32\drivers\loader_config.ini(不存在,用默认值)。
解决:手动将loader_config.ini复制到%windir%\System32\drivers\,并确保其属性为只读(防止 VMware 进程意外覆盖)。验证命令:more < %windir%\System32\drivers\loader_config.ini。
4.4 现象:启用DisableRDRAND=1后,Guest OS 中rdrand指令仍返回随机数
原因:DisableRDRAND仅拦截 Host OS 的HalQuerySystemInformation,告诉 VMware “Host 不支持 RDRAND”,但 VMware 默认会通过VMXON指令在 VMCS 中设置RDRAND exiting位,将指令交由 VMM 模拟。要彻底禁用,需在虚拟机.vmx文件中添加cpuid.1.edx = "----:----:----:----:----:----:----:----"(清空 EDX 第30位)。
解决:编辑虚拟机配置文件,在config.version = "8"下新增一行:cpuid.1.edx = "----:----:----:----:----:----:----:----",保存后关闭并重新打开虚拟机。
4.5 现象:卸载后 VMware Workstation 无法启动,报vmwarebase.sys is not found
原因:uninstall.bat执行了sc stop vmwarebase,但vmwarebase服务依赖HardenedLoader,强制停止导致其驱动对象未被正确清理,残留的ObReferenceObjectByHandle引用使vmwarebase.sys映像无法卸载。下次启动时,PnP Manager尝试重新加载vmwarebase.sys,但内存中已有同名映像,触发STATUS_IMAGE_ALREADY_LOADED。
解决:重启系统(非关机),让内核彻底释放所有驱动对象;重启后运行sc queryex vmwarebase确认STATE为STOPPED,再执行uninstall.bat。若仍失败,用Sysinternals Process Explorer查找vmwarebase.sys的句柄持有者(通常是vmware-tray.exe),结束该进程后再试。
5. 进阶技巧:用 HardenedLoader 实现动态 HAL 行为切换与故障注入
5.1 动态开关 HAL 功能:无需重启 VMware 的实时调控
HardenedLoader的设计支持运行时重载配置。其原理是:在DriverEntry中创建了一个命名ALPC端口(\BaseNamedObjects\HardenedLoaderPort),监听来自用户态的IOCTL请求。vmwarebase_hook.dll在注入vmware-tray.exe后,会持续轮询loader_config.ini的最后修改时间(GetFileTime),一旦检测到变更,即通过NtAlpcSendWaitReceivePort发送IOCTL_HAL_RELOAD_CONFIG请求。这意味着你可以在 VMware Workstation 正在运行时,直接编辑C:\Windows\System32\drivers\loader_config.ini,保存后 2 秒内新配置即生效。
例如,你想临时测试 Guest OS 在无XSAVE指令支持下的启动行为:
; 编辑 C:\Windows\System32\drivers\loader_config.ini [HAL] BlockXSAVE=1 DisableRDRAND=0 ForceNoSMT=0保存后,打开任务管理器,找到vmware-tray.exe进程,观察其 CPU 占用率会瞬间跳至 15%(日志写入开销),约 1.8 秒后回落——此时新配置已载入。新建虚拟机,进入 BIOS,Processor页中XSAVE选项将变为Disabled。
提示:该机制不支持热插拔 CPU 核心数等需重启的配置,仅限 HAL 查询类功能。
BlockXSAVE生效后,Guest OS 的cpuid指令将不再报告XSAVE功能位(EDX bit 26),但 Host CPU 的实际能力不受影响。
5.2 故障注入实战:模拟 Host HAL 返回错误码,验证 VMware 的容错逻辑
loader_config.ini中有一个隐藏字段[FAULT],可用于触发特定错误码返回,帮助验证 VMware 对 HAL 错误的处理健壮性。例如,模拟HalQuerySystemInformation返回STATUS_NOT_SUPPORTED:
[FAULT] QueryInfoStatus=0xC00000BB保存后,vmware-tray.exe会捕获该配置并发送IOCTL_FAULT_INJECT。此时vmwarebase.sys在调用HalQuerySystemInformation时,将收到0xC00000BB(STATUS_NOT_SUPPORTED)而非真实数据。预期行为是:VMware Workstation 启动时弹出警告对话框Failed to query system information. Some features may be unavailable.,但主界面仍可正常使用,虚拟机可正常创建——这证明其容错逻辑有效。若直接崩溃,则说明 VMware 未对该错误码做防御性检查,存在潜在稳定性风险。
我们曾用此法在某次模拟项目 X 的安全审计中,发现 VMware Workstation 17.3.0 对STATUS_INSUFFICIENT_RESOURCES(0xC000009A)的处理存在空指针解引用,触发ACCESS_VIOLATION。该漏洞已在 17.4.0 中修复,而 HardenedLoader 是唯一能低成本复现该场景的工具。
5.3 日志深度分析:从loader.log定位 VMware 驱动加载瓶颈
vmwarebase_hook.dll输出的日志(C:\temp\loader.log)不是简单字符串,而是结构化时间戳+事件码。例如:
[2024-03-15 14:22:03.187] [INFO] HAL_HOOK_INIT_START [2024-03-15 14:22:03.192] [DEBUG] Found vmwarebase.sys at 0xfffff801`2a3c0000, size 0x1a2000 [2024-03-15 14:22:03.195] [TRACE] HalQuerySystemInformation RVA: 0x000a12c0 -> patched to 0xfffff801`2a4612c0 [2024-03-15 14:22:03.201] [WARN] RDRAND disabled per config [2024-03-15 14:22:03.205] [INFO] HAL_HOOK_INIT_DONE关键分析点:
HAL_HOOK_INIT_START到HAL_HOOK_INIT_DONE的时间差(本例 18ms)反映 Loader 初始化开销,若 > 50ms,需检查 Host 是否有其他安全软件 hook 了NtMapViewOfSection;Found vmwarebase.sys at ...行中的地址与driverquery /v输出的Base Address对比,可确认是否加载到预期位置(避免 ASLR 冲突);RVA值(0x000a12c0)是vmwarebase.pdb中HalQuerySystemInformation的偏移,若与你本地反编译结果不符,说明 VMware 版本不匹配。
从那以后我每次部署 HardenedLoader,都强制走一遍signtool verify+driverquery+loader.log三连查,哪怕只是改一个0和1。因为曾经有一次,就因为漏看了loader.log里那行[ERROR] Config file CRC mismatch,折腾了 7 小时才意识到loader_config.ini被 Notepad++ 的 UTF-8 BOM 损坏了 CRC 校验——这种玄学问题,只有日志不会骗你。希望帮到你。
本文还有配套的精品资源,点击获取