A Windows x64 kernel driver that hides virtual machine indicators from the guest OS. Works on any hypervisor — KVM/QEMU, VMware, VirtualBox, Hyper-V, Xen, Parallels.
Adapted from VmwareHardenedLoader and extended to cover all major hypervisors in a single driver.
Commercial software protection systems (VMProtect, Themida, anti-cheat engines) detect virtual machines by querying firmware tables via NtQuerySystemInformation(SystemFirmwareTableInformation). These tables contain hypervisor-specific strings that identify the virtual environment.
HypervisorHide hooks the Windows kernel's firmware table providers (ACPI, RSMB, FIRM) and scrubs all known hypervisor indicator strings from the returned data. This operates below the syscall level — even direct syscall stubs (used by VMProtect) go through the kernel's firmware table handler, which our driver intercepts.
| Table | Indicator | Description |
|---|---|---|
| ACPI | BOCHS, BXPC |
QEMU default ACPI OEM ID and table ID |
| SMBIOS | QEMU |
SMBIOS system manufacturer |
| SMBIOS | Proxmox |
Proxmox OVMF firmware branding |
| SMBIOS | EDK II |
UEFI firmware identifier |
| SMBIOS | SeaBIOS |
BIOS firmware identifier |
| SMBIOS | KVMKVMKVM |
KVM CPUID vendor string (cached in firmware) |
| All | Red Hat, VirtIO |
Red Hat / VirtIO device identifiers |
| Table | Indicator | Description |
|---|---|---|
| ACPI | VMware |
VMware ACPI OEM ID |
| SMBIOS | VMware, VMWARE |
VMware system manufacturer |
| FIRM | VMware |
VMware firmware identifier |
| All | Virtual Platform |
VMware product name |
| Table | Indicator | Description |
|---|---|---|
| ACPI | VBOX |
VirtualBox ACPI identifiers |
| SMBIOS | VirtualBox, innotek |
VirtualBox system info |
| All | Oracle |
Oracle Corporation (VirtualBox parent) |
| Table | Indicator | Description |
|---|---|---|
| SMBIOS | Hyper-V |
Hyper-V product string |
| SMBIOS | Microsoft Corporation |
Hyper-V manufacturer |
| All | Virtual Machine |
Generic VM product name |
| Table | Indicator | Description |
|---|---|---|
| SMBIOS | Xen, xen |
Xen hypervisor |
| SMBIOS | Parallels |
Parallels Desktop |
| SMBIOS | prl_ |
Parallels driver prefix |
Usermode tools (Frida, API hooks) can intercept GetSystemFirmwareTable() and scrub strings. But:
- VMProtect makes direct syscalls — its own
syscallstubs bypass ntdll.dll entirely, making usermode hooks invisible - OVMF firmware branding ("Proxmox distribution of EDK II") is a compile-time constant that cannot be changed via hypervisor configuration
- Some strings are generated at runtime by firmware, not stored as patchable static data
The kernel driver hooks at the firmware table provider level — below syscalls, above the actual firmware tables. Every query path goes through our hooks.
- Windows 10/11 x64
- Windows Driver Kit (WDK) for building
- Test Signing mode enabled for loading unsigned drivers
- Install Visual Studio 2022 with C++ Desktop workload
- Install Windows Driver Kit (WDK)
msbuild HypervisorHide.sln /p:Configuration=Release /p:Platform=x64
Or open in Visual Studio and build.
bcdedit /set testsigning on
# Reboot requiredcopy HypervisorHide.sys C:\Windows\System32\drivers\
sc create HypervisorHide type=kernel binPath=C:\Windows\System32\drivers\HypervisorHide.sys
sc start HypervisorHidesc config HypervisorHide start=boot# Before:
(Get-CimInstance Win32_BIOS).BIOSVersion
# "BOCHS - 1", "Proxmox distribution of EDK II - 10000"
# After:
(Get-CimInstance Win32_BIOS).BIOSVersion
# Hypervisor strings replaced with spacessc stop HypervisorHide
sc delete HypervisorHide- Locate kernel structures: Disassembles the
PAGEsection of ntoskrnl.exe using Capstone, pattern-matchingmov r8d, 'TFRA'to findExpFirmwareTableResourceandExpFirmwareTableProviderListHead - Hook firmware table providers: Acquires
ExpFirmwareTableResourceexclusively, walks the provider linked list, replaces handlers for ACPI, RSMB, and FIRM providers - Scrub on query: When any process queries firmware tables, our handler calls the original, then searches the returned buffer for all known hypervisor indicator strings and overwrites them with spaces (preserving buffer layout)
- Clean unload:
DriverUnloadrestores original handler pointers
cpu: host,hidden=1
balloon: 0
agent: 0
vmgenid: 0
scsihw: lsi
vga: std
net0: e1000=D4:BE:D9:12:34:56,bridge=vmbr0
args: -smbios type=0,vendor=Dell\ Inc.,version=1.14.0 -smbios type=1,manufacturer=Dell,product=Latitude-5520 -global scsi-hd.vendor=WDC -global scsi-hd.product=WD10EZEX -machine x-oem-id=ALASKA,x-oem-table-id=A_M_I___
hypervisor.cpuid.v0 = "FALSE"
smbios.reflectHost = "TRUE"
board-id.reflectHost = "TRUE"
VBoxManage modifyvm "VMName" --paravirtprovider noneThe driver handles what hypervisor configuration cannot: runtime-generated firmware strings.
- Original concept and VMware implementation: hzqst/VmwareHardenedLoader
- Universal hypervisor adaptation: Arkana Project
- Capstone disassembly engine: aquynh/capstone
MIT