VMware 虚拟机反检测完整指南:3 步部署 VmwareHardenedLoader,让 VMProtect 3.2 查不出虚拟机
VMware 虚拟机反检测完整指南:3 步部署 VmwareHardenedLoader,让 VMProtect 3.2 查不出虚拟机
【免费下载链接】VmwareHardenedLoaderVmware Hardened VM detection mitigation loader (anti anti-vm)项目地址: https://gitcode.com/gh_mirrors/vm/VmwareHardenedLoader
VmwareHardenedLoader 是一个运行在 VMware Windows x64 客户机中的内核驱动:它实时修补系统固件表,抹掉 "VMware"、"Virtual"、"VMWARE" 这类可被识别的特征串,让 VMProtect 3.2、Safengine、Themida 的反虚拟机(anti-VM)校验直接失效。适合做逆向分析、软件测试、隔离实验,又不想被"虚拟机身份"出卖的开发者。
🗺️ 能力全景:一张表看清它挡掉哪些检测
| 检测面 | 对方常见手段 | 本项目对策 |
|---|---|---|
| 固件表 | RtlGetSystemFirmwareTable读 SMBIOS/ACPI 表,搜 "VMware" 字符串 | 内核态挂钩固件查询处理器,查询返回前实时改写缓冲 |
| CPUID | 读 hypervisor 位 / hypervisor 品牌串 | .vmx中hypervisor.cpuid.v0 = "FALSE"隐藏 |
| 硬件指纹 | 主板、机型、序列号、SMBIOS OEM 串全是 VMware 默认值 | .vmx的*.reflectHost参数组反射宿主机真实信息 |
| 网络 MAC | MAC 前缀00:05:69/00:0C:29/00:1C:14/00:50:56属 VMware | 换 MAC,或.vmx里ethernet0.address |
| 后门接口 | VMware backdoor、tools 版本/指针查询 | .vmx的monitor_control.*、isolation.tools.*参数组 |
| 磁盘型号 | SCSI 系统盘 vendorID/productID 是默认值 | scsi0:0.productID/scsi0:0.vendorID覆盖 |
一个前提要说在前面:目前仅支持 Windows Vista ~ Win10 的 x64 客户机,没有 x86 构建,macOS/ARM 客户机不适用。
🚀 三步上手:编译、配 vmx、装驱动
第 1 步:宿主机编译驱动
环境要求 Visual Studio 2015/2017 + WDK 10:
git clone https://gitcode.com/gh_mirrors/vm/VmwareHardenedLoader用 VS 打开根目录VmLoader.sln,选x64/Release生成。如果客户机没开测试签名,记得先给bin\vmloader.sys做 test-sign。驱动本体代码在VmLoader/main.cpp,反汇编相关的内核适配在VmLoader/cs_driver_mm.c和VmLoader/kernel_stl.cpp。
第 2 步:改 .vmx 配置与 MAC
把下面这些键值写进.vmx(关键项摘录,完整 19 行参数在项目根README.md里):
hypervisor.cpuid.v0 = "FALSE" board-id.reflectHost = "TRUE" hw.model.reflectHost = "TRUE" serialNumber.reflectHost = "TRUE" smbios.reflectHost = "TRUE" SMBIOS.noOEMStrings = "TRUE" ; isolation.tools.* 四项(getPtrLocation/setPtrLocation/setVersion/getVersion)全部 "TRUE" ; monitor_control.* 十项(disable_directexec ... restrict_backdoor)全部 "TRUE" ethernet0.address = "00:11:56:20:D2:E8"如果系统盘是 scsi0 槽的 SCSI 虚拟磁盘,再补两行:
scsi0:0.productID = "Tencent SSD" scsi0:0.vendorID = "Tencent"MAC 也可以在 VMware 图形界面里改:虚拟机设置 → 网络适配器 → NAT 高级 → MAC 地址,如图(img/4.png):
新 MAC 的前三个字节不能落在上表那四个 VMware OUI 前缀里,否则等于白改。
第 3 步:客户机里加载驱动
以管理员身份运行install.bat,服务正常拉起即成功。先别急着装 VMware Tools——它自带的工具栈会把你前面做的伪装全部漏掉,远程桌面请走 mstsc / TeamViewer / AnyDesk / VNC。
🔍 原理透视:驱动到底改了什么
特征码 + 内核态反汇编,定位固件表管理器
Windows 查固件表统一走ExpFirmwareTable,但相关全局变量没有导出符号。DriverEntry的处理路径是:
ZwQuerySystemInformation(SystemModuleInformation)枚举模块表,定位ntoskrnl基址;- 在
.PAGE段里搜固定特征41 B8 41 52 46 54(mov r8d, 'TFRA'指令); - 从该指令起逐条反汇编、沿分支最多跟踪 16 层,认出
ExpFirmwareTableResource和ExpFirmwareTableProviderListHead两个地址。
第 3 步用的就是项目自带的 capstone 反汇编引擎(capstone/目录,含完整的 x86 表与 MC 测试套件 的移植内核版),kernel_stl.cpp则提供内核环境下的部分 STL 容器支持。
在 ACPI / RSMB / FIRM 三条查询路径上挂钩
定位到FirmwareTableProviderList后,驱动遍历这张链表,按 Provider 签名找到三个节点,把各自的FirmwareTableHandler换成包装函数:
ACPI节点:查询成功后抹掉VMware、VirtualRSMB/FIRM节点:抹掉VMware、VMWARE
包装函数先调原处理器拿到真实表缓冲,再做一次内存搜索,把命中字节整段覆盖成'7'。未处理时的固件表长这样(img/2.png),高亮的 "VMware SVGA II" 就是重写目标:
卸载即还原
DriverUnload会再次持有ExpFirmwareTableResource锁,遍历链表把三个处理器逐一换回原函数(main.cpp中DriverUnload),所以这套修改是运行时、可逆的——卸载驱动、重启客户机即可恢复原状,不碰任何磁盘文件。
✅ 效果验证:怎么确认它生效了
看检测方。跑一个开启 anti-vm 选项的 VMProtect 3.2 保护程序。没部署驱动时它会弹窗拒绝运行(img/1.png即部署前状态):
部署成功后同样的程序直接跑通,不再弹 "cannot run under a Virtual Machine"。
看驱动方。用 DbgView 抓内核调试输出,正常序列是:SystemFirmwareTableInformation called→requesting FIRM, act 1, table 786432, ret=00000023(查询前的无权限占位)→ret=00000000(查询成功,拿到的是已清洗的表)。img/3.png展示的就是生效后的输出:
看特征方。用十六进制工具转储 SMBIOS/ACPI 表缓冲,原先的 "VMware" 字符串应全部变为77777777占位。
⚠️ 避坑清单:5 个最容易翻车的地方
- 装完 VMware Tools 后又被告密→ 现象:全套配置做完仍被识别 → 原因:tools 自带 backdoor 与版本查询通道 → 处理:彻底不装 tools,远程一律走 mstsc / TeamViewer / AnyDesk / VNC。
- install.bat 一执行服务就起不来→ 现象:启动服务报错 → 原因:
vmloader.sys没 test-sign,或特征与该版本ntoskrnl不匹配 → 处理:先补签名;仍失败用 DbgView 抓内核输出,连同ntoskrnl.exe一起提 issue。 - 换了 MAC 依然被识破→ 现象:网络侧检测照旧 → 原因:新 MAC 前缀仍落在四个 VMware OUI 段内 → 处理:重新生成随机 MAC,或直接在
.vmx里写ethernet0.address。 - 32 位系统/虚拟机想复用→ 现象:找不到对应产物、编译无 x86 配置 → 原因:项目仅支持 Vista~Win10 x64 客户机 → 处理:换 x64 客户机,别无捷径。
- 显卡信息仍能被查出来→ 现象:经 DXGI 接口问到虚拟显卡型号 → 原因:显卡驱动文件本身携带 VMware 信息,属已知 TODO → 处理:按 README 提示修改显卡驱动文件,或接受此残留。
🧩 进阶玩法
- 扩特征清单:
RemoveSigs是纯内存搜索替换,往MyFIRMHandler/MyACPIHandler里追加自己的字符串即可覆盖更多变体;同理也可以再挂新的 Provider 签名节点。 - 伪造"物理机指纹":
*.reflectHost参数会让客户机反射宿主机真实的主板/序列号/SMBIOS,配合一台品牌机做宿主,得到的指纹与真机几乎无法区分。 - 内核工程参考:
cs_driver_mm.c(内核态内存分配适配)+kernel_stl.cpp(STL 子集)是"在 Windows 内核里跑 C++ 反汇编器"的少见完整样例,值得细读。
结语
VmwareHardenedLoader 的体量不大,但把 VMware 反虚拟机检测里最硬的一层——固件表查询——用"定位、挂钩、清洗、可逆"四步完整拿下,且与 .vmx 侧参数形成内外配合。边界同样明确:只针对 VMware、只覆盖 Windows x64 客户机,显卡 DXGI 泄漏尚待处理。对逆向分析、隔离测试、兼容性验证这类场景,它是环境准备清单里值得加的一项。
【免费下载链接】VmwareHardenedLoaderVmware Hardened VM detection mitigation loader (anti anti-vm)项目地址: https://gitcode.com/gh_mirrors/vm/VmwareHardenedLoader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
