目录
在 Proxmox VE 上准备一台“看不出是虚拟机”的 Windows 虚拟机
经验分享:本文记录在 PVE 上创建一台 Windows 虚拟机、并在装系统之前就把虚拟化特征尽量抹掉的做法。用途是做“绕过虚拟机环境检测”的测试(软件/样本是否会因为运行在虚拟机里而拒绝工作或被改变行为)。
环境是刚装好的 PVE 9.2.2,宿主机是 AMD 平台、插了一张 Tesla P100。当前盒子实际状态:为了开 P100 的 vGPU,内核已从出厂的 7.0.2-6-pve 降到
6.14.11-4-pve;qemu 已换成自编译反检测版pve-qemu-kvm 11.0.2-2(底层 qemu 11.0.2,已把开源项目的 sed 补丁打完重编,见第 4 节)。显卡怎么接见另一篇pve-vgpu-p100-setup.md。本文的“升级版检测策略”参考了开源项目
pve-anti-detection-main(作者 李晓流 & 大大帅666,基于zhaodice/proxmox-ve-anti-detection),下面会说明哪些能直接用、哪些因版本对不上暂时不能照搬。
1. 先确认环境
连上 PVE 后,先摸清楚几个会影响配置的点:
bash# PVE 版本与内核
pveversion
uname -a
# 存储(确认磁盘放哪)
pvesm status
# CPU 厂商(决定后面 IOMMU 参数用 amd_iommu 还是 intel_iommu)
grep -m1 vendor_id /proc/cpuinfo
# 是否已有虚拟机
qm list
本机实际信息:
- PVE:
pve-manager/9.2.2,内核6.14.11-4-pve(为 vGPU 降过),qemu 现已替换成自编译反检测版pve-qemu-kvm 11.0.2-2(官方原版11.0.0-3,meta 里creation-qemu=11.0.0是集群迁移兼容值,不影响实际运行版本) - 存储:
local-lvm(lvmthin,薄池约 141G 物理可用)和local(dir) - 宿主机真实硬盘(注意都不是“整”容量):
nvme0n1238.5G(SK hynix BC711 256GB 系统盘)、nvme1n11.9T(三星 PM9A1 2TB,完全空闲、没进任何卷组)—— 所以“标准 500G/1T”的假设不成立,虚拟机磁盘容量要对着真实盘来定 - CPU 厂商:
AuthenticAMD(AMD 平台 → IOMMU 用amd_iommu=on) - 已有虚拟机:无(本文从零创建 VMID 9000)
踩坑记录:PVE 9 的
qm create里--scsihw的可选值是lsi / lsi53c810 / virtio-scsi-pci / virtio-scsi-single / megasas / pvscsi,没有lsi53c895a,要用lsi。另外--smbios1的字段值不允许空格、小数点和连字符(正则限制),所以Dell Inc.要写成DellInc、版本号用A00这种形式;带空格/逗号的厂商名(如ASUSTeK COMPUTER INC.、带逗号的Advanced Micro Devices, Inc.)只能放到--args的-smbios里,不能进smbios1。
2. 创建虚拟机并抹掉虚拟化特征
“绕过虚拟机环境检测”要同时处理几类特征,下面一次性把能提前做掉的都做掉(装系统之前即可配置):
bash# 创建虚拟机(VMID 9000,名称用普通工作站风格)
qm create 9000 \
--name Workstation \
--bios seabios \
--machine pc-q35-9.2 \
--ostype win11 \
--cores 8 --sockets 1 --memory 16384 \
--scsihw lsi \
--ide0 local-lvm:238 \
--net0 e1000=3C:52:82:1A:2B:3C,bridge=vmbr0 \
--vga std --balloon 0 --onboot 0
# TPM 2.0(swtpm,Windows 11 安装会检查)
qm set 9000 --tpmstate0 local-lvm:1
# 系统信息 type1(smbios1,PVE 不允许空格/点/连字符,用无空格写法)
qm set 9000 --smbios1 "uuid=4c4c4544-0048-4410-8038-b4c04f365a31,manufacturer=ASUS,product=PRIMEB550MA,version=RevX0x,serial=SystemSerialNumber,sku=SKU,family=PRIME"
# 升级版隐藏参数 + 手工注入完整 SMBIOS(见第 4 节解释)
qm set 9000 --args "-cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true -smbios type=0,vendor=\"American Megatrends International LLC.\",version=\"1.0.0\",date=\"02/21/2023\",release=5.19 -smbios type=2,manufacturer=\"ASUSTeK COMPUTER INC.\",product=\"PRIME B550M-A\",version=\"Rev X.0x\",serial=\"System Serial Number\",asset=\"Asset-1234567890\",location=\"Slot1\" -smbios type=3,manufacturer=\"ASUSTeK COMPUTER INC.\",version=\"1.0\",serial=\"Chassis Serial\",asset=\"Chassis Asset\",sku=\"SKU\" -smbios type=4,sock_pfx=\"AM4\",manufacturer=\"Advanced Micro Devices Inc\",version=\"AMD Ryzen 9 5900X 12-Core Processor\",max-speed=3700,current-speed=3700,serial=\"To Be Filled By O.E.M.\",asset=\"To Be Filled By O.E.M.\",part=\"To Be Filled By O.E.M.\" -smbios type=17,loc_pfx=\"ChannelA-DIMM1\",manufacturer=\"Kingston\",speed=3200,serial=\"KF432C16BBK2\",part=\"KF432C16BBK2/16\",bank=\"BANK 0\",asset=\"9876543210\" -smbios type=8,internal_reference=\"CPU FAN\",external_reference=\"Not Specified\",connector_type=0xFF,port_type=0xFF -smbios type=8,internal_reference=\"J3C1 - GMCH FAN\",external_reference=\"Not Specified\",connector_type=0xFF,port_type=0xFF"
# RTC 本地时区(真实物理机 RTC 是本地时区,避免 UTC 破绽)
qm set 9000 --localtime 1
# 关闭显式 NUMA(单路单节点更像家用机)
qm set 9000 --numa 0
# 真实厂牌 MAC(避开 Proxmox BC:24:11 OUI 与 virtio)
qm set 9000 --net0 e1000=D8:FC:93:56:1D:C7,bridge=vmbr0
# 全局 MAC 前缀改真实厂牌(仅影响新建 VM 的自动 MAC,不碰已有 VM)
# 在 /etc/pve/datacenter.cfg 末尾加一行: mac-prefix: d8:fc:93
# 把系统盘型号/序列号伪造成真实硬盘(容量 238G ≈ 真实 256GB 盘在系统里显示的 238.5G,非整容量更真)
# 关键坑:PVE 9 的 sata/scsi/nvme 总线都不允许改 model,只有 ide 总线允许,
# 所以系统盘特意走 ide0(qemu 的 IDE 控制器是 Intel PIIX,真机也常见,不是干净破绽)。
qm set 9000 --ide0 "local-lvm:vm-9000-disk-0,size=238G,model=Samsung_SSD_980_PRO_250GB,serial=S3Y7NX0M812345,wwn=0x5002538e41234567"
# 启动顺序(分隔符是分号 ;,不是逗号;分号在 shell 里要引号包住)
qm set 9000 --boot order="ide0;net0"
创建完成后,配置文件 /etc/pve/qemu-server/9000.conf 关键内容如下:
iniargs: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true -smbios type=0,vendor="American Megatrends International LLC.",version="1.0.0",date="02/21/2023",release=5.19 -smbios type=2,manufacturer="ASUSTeK COMPUTER INC.",product="PRIME B550M-A",version="Rev X.0x",serial="System Serial Number",asset="Asset-1234567890",location="Slot1" -smbios type=3,manufacturer="ASUSTeK COMPUTER INC.",version="1.0",serial="Chassis Serial",asset="Chassis Asset",sku="SKU" -smbios type=4,sock_pfx="AM4",manufacturer="Advanced Micro Devices Inc",version="AMD Ryzen 9 5900X 12-Core Processor",max-speed=3700,current-speed=3700,serial="To Be Filled By O.E.M.",asset="To Be Filled By O.E.M.",part="To Be Filled By O.E.M." -smbios type=17,loc_pfx="ChannelA-DIMM1",manufacturer="Kingston",speed=3200,serial="KF432C16BBK2",part="KF432C16BBK2/16",bank="BANK 0",asset="9876543210" -smbios type=8,internal_reference="CPU FAN",external_reference="Not Specified",connector_type=0xFF,port_type=0xFF -smbios type=8,internal_reference="J3C1 - GMCH FAN",external_reference="Not Specified",connector_type=0xFF,port_type=0xFF
balloon: 0
bios: seabios
boot: order=ide0;net0
localtime: 1
machine: pc-q35-9.2
memory: 16384
net0: e1000=D8:FC:93:56:1D:C7,bridge=vmbr0
numa: 0
ostype: win11
ide0: local-lvm:vm-9000-disk-0,model=Samsung_SSD_980_PRO_250GB,serial=S3Y7NX0M812345,size=238G,wwn=0x5002538e41234567
scsihw: lsi
smbios1: uuid=4c4c4544-0048-4410-8038-b4c04f365a31,manufacturer=ASUS,product=PRIMEB550MA,version=RevX0x,serial=SystemSerialNumber,sku=SKU,family=PRIME
sockets: 1
tpmstate0: local-lvm:vm-9000-disk-1,size=4M
vga: std
3. 每一项在“隐藏什么”
| 配置项 | 默认会暴露的特征 | 这里怎么处理 |
|---|---|---|
args: -cpu host,hypervisor=off,... | CPUID 里 hypervisor 标志位置 1(KVM/QEMU 一眼被识破) | hypervisor=off 清掉该标志位;host-phys-bits=true 让客户机物理地址位数=宿主机(避免 “guest phys-bits < host” 这类检测);vmware-cpuid-freq=false + enforce=false 减少 vm-exit 带来的时序痕迹 |
-smbios type=0/2/3/4/8/17 | BIOS/主板/机箱/CPU/内存/端口 全是空的或带 QEMU 字样,al-khaser/pafish 查的 Win32_Fan、Win32_PhysicalMemory、Win32_PortConnector、CIM_* 传感器 全空 | 手工注入一套一致的整机信息(华硕 PRIME B550M 主板 + AMD Ryzen + 金士顿内存),喂饱上面那些 WMI 项。与 AMD 主机一致:CPUID 报 AMD,SMBIOS 也报 AMD,避免高级工具比对冲突 |
smbios1 (type1) | 系统信息带 QEMU / PVE / Proxmox 字样 | 伪造成华硕整机(无空格写法,因 PVE 正则限制) |
net0 e1000 + 真实 MAC | 默认网卡是 virtio 且 MAC 前缀是 Proxmox 的 BC:24:11 | 换成 e1000(Intel 82545EM,Windows 自带驱动),MAC 用真实厂牌前缀 D8:FC:93:...;并改了全局 mac-prefix |
ide0(系统盘) | 默认磁盘型号 QEMU HARDDISK、容量常是整 200G(强特征) | PVE 9 只有 ide 总线允许改 model,故系统盘走 ide0,型号伪造成 Samsung_SSD_980_PRO_250GB、自定义 serial/wwn;容量用 238G(真实 256GB 盘在系统里显示约 238.5G,非整更真)。IDE 控制器是 Intel PIIX,真机也常见,不是干净破绽 |
vga std | 默认 vmware/qxl 虚拟显卡 | 用标准 VGA,避免暴露 VMware/QXL |
balloon 0 | virtio-balloon 内存气球设备是典型 VM 痕迹 | 关闭内存气球 |
localtime 1 | 虚拟机 RTC 默认 UTC,真实物理机是本地时区 | 设成本地时区 |
numa 0 | 多 NUMA 节点容易暴露服务器/虚拟特征 | 单路单节点 |
tpmstate0 | 无 TPM → Windows 11 装不上 | 挂 swtpm 提供 TPM 2.0(同时让系统更“真实”) |
machine pc-q35-9.2 | 默认 i440fx 是 1996 年的老芯片组 | 用 q35(ICH9 级别),更像现代主板 |
4. 源码层面反检测(qemu 11 重编译,双保险)
第 2、3 节的配置级做法(CPU 隐藏参数、手工 SMBIOS、localtime/numa/MAC 前缀)和版本无关,即使不重编译也能过绝大多数检测。下面这步是从源码层面把 qemu 里的虚拟化字符串彻底抹掉,作为“双保险”。
开源项目 pve-anti-detection-main(作者 李晓流 & 大大帅666,基于 zhaodice/proxmox-ve-anti-detection)把反检测做到了源码层面:它给 PVE 自带的 pve-qemu-kvm 打补丁、并替换 pve-edk2-firmware-ovmf,从根上抹掉这些特征:
- 把 qemu 里所有
"QEMU"字符串替换成"ASUS"(设备厂商、显示器 EDID、USB、SCSI 控制器等); - ACPI 的 OEM ID 从
BOCHS/BXPC改成INTEL/PC8086,fw_cfg 签名QEMU CFG→ASUU CFG(0x51454d5520434647→0x4155535520434647),KVMKVMKVM的 CPUID hypervisor 签名改成GenuineIntel; - 禁用 vmgenid(直接让生成函数提前 return,去掉一个 VM 痕迹);
- 删除调试用 AML(
_DBG方法),并屏蔽fw_cfg节点; - SMBIOS 的 bios 特性位、电压、外频、缓存句柄、CPU family、内存类型/位宽/电压等字段全部改成真实机器的值。
项目给的是 qemu 9.x 补丁包 + OVMF 4.2023.08,和本机 qemu 11 不对版;但脚本里那批 sed 补丁是针对字符串的,绝大多数在 qemu 11 源码里依然能命中,所以完全可以在本机基于 qemu 11 重编译一个带补丁的 pve-qemu-kvm。这台盒子已经这么做了(见 4.1),VM 9000 在新 qemu 下能正常开机。
4.1 自己基于 qemu 11 重编译打补丁(实测)
前置:盒子是 vGPU 实验机,重编译有风险——但用户确认“挂了可以重装系统”。装完务必
apt-mark hold,并记住回退命令(见 4.1.5)。
4.1.1 拉源码(避开被墙的 git:// 与无源码的二进制仓库)
Proxmox 官方只发二进制包、不提供 apt-get source;git://git.proxmox.com 在国内常被墙。直接用 GitHub 镜像:
bash# 克隆打包仓库(PVE 的 deb 构建骨架)
git clone https://github.com/proxmox/pve-qemu.git
cd pve-qemu
# 子模块 qemu 的官方地址被墙,重定向到 github 镜像(qemu 11.0.2)
git config submodule.qemu.url https://github.com/proxmox/qemu.git
git submodule update --init --recursive
4.1.2 打 sed 补丁
把项目里的 sedPatch-pve-qemu-kvm7-8-anti-dection.sh 拷进 qemu/ 子模块根目录(它默认就在 qemu 源码树里跑),改名为 sedPatch.sh 后执行:
bashcp /root/pve-anti-detection-main/sedPatch-pve-qemu-kvm7-8-anti-dection.sh qemu/sedPatch.sh
cd qemu
bash sedPatch.sh
命中情况(qemu 11 实测):
| 补丁目标 | 结果 |
|---|---|
ACPI OEM BOCHS→INTEL、BXPC→PC8086(include/hw/acpi/aml-build.h) | 命中 |
fw_cfg 签名 0x51454d5520434647→0x4155535520434647(hw/nvram/fw_cfg.c) | 命中 |
CPUID KVMKVMKVM→GenuineIntel(target/i386/kvm/kvm.c) | 命中 |
"QEMU"→ASUS 设备名(pc_q35/pc_piix/ide 等) | 命中 |
vmgenid / acpi-build 注入 return;//do this once | 命中(注释,编译后剥离,效果是函数提前返回) |
SMBIOS 字段(hw/smbios/smbios.c 电压/缓存句柄/内存类型等) | 命中 |
个别老设备 sed(ads7846.c、tsc2005.c、roms/seabios/*.dsl) | qemu 11 已移除文件,sed 报 No such file,无害跳过 |
关键项(ACPI OEM、fw_cfg、KVMKVMKVM、SMBIOS 字段、vmgenid 禁用)全部命中;非关键设备名 sed 静默跳过不影响——那些设备 VM 9000 根本没接(用 ide/e1000/标准 VGA)。
4.1.3 解决 Ceph/RBD 构建冲突(本机不用 Ceph)
本机装了 ceph 库(19.2.3-pve4),librbd-dev 与已装版本冲突,且盒子不接 RBD 块设备。两处关掉:
bash# 去掉构建依赖里的 librbd-dev
sed -i '/librbd-dev/d' debian/control
# 构建参数关掉 rbd(注意:不要写带反斜杠的写法,容易 unterminated)
sed -i "s/--enable-rbd/--disable-rbd/" debian/rules
4.1.4 编译 + 打包
bash# 补齐可能缺的构建依赖
apt-get install -y check libfuse3-dev libpng-dev python3-venv python3-wheel
# meson 子项目(含 Rust crate,如 bilge 等)需联网拉取:
# 在 qemu 目录下执行 meson subprojects download(crates.io 偶尔 reset,失败重跑即可)
# 后台编译打包(32 核约 15–30 分钟)
nohup make deb > /root/pve-qemu-build/build.log 2>&1 &
tail -f /root/pve-qemu-build/build.log # 看 [NNNN/3672] Compiling ... 进度
产物在仓库根目录: pve-qemu-kvm_11.0.2-2_amd64.deb(约 31M)和对应的 -dbgsym 包(可不装)。
装之前先验证补丁真的进了二进制(强烈建议,避免白装):
bashmkdir /tmp/qcheck && dpkg-deb -x pve-qemu-kvm_11.0.2-2_amd64.deb /tmp/qcheck
BIN=/tmp/qcheck/usr/bin/qemu-system-x86_64
echo "patched (应 >0):"; for s in GenuineIntel "INTEL " PC8086 ASUS; do echo "$s -> $(strings $BIN|grep -cF "$s")"; done
echo "leak (应 =0):"; for s in KVMKVMKVM BXPC "BOCHS "; do echo "$s -> $(strings $BIN|grep -cF "$s")"; done
$BIN --version # 应显示 pve-qemu-kvm_11.0.2-2
KVMKVMKVM/BXPC/BOCHS 全为 0、GenuineIntel/INTEL/PC8086/ASUS 均 >0 即说明补丁生效。(QEMU CFG/ASUU CFG 在二进制里是小端存放,strings 查不到,属正常。)
4.1.5 安装 + 锁定 + 回退
bash# 安装(会升级掉官方 11.0.0-3)
dpkg -i pve-qemu-kvm_11.0.2-2_amd64.deb
# 锁定版本,防止 apt upgrade 把补丁覆盖回官方版
apt-mark hold pve-qemu-kvm
回退(万一新 qemu 让虚拟机起不来):
bashapt-mark unhold pve-qemu-kvm
apt-get install --reinstall pve-qemu-kvm # 恢复官方版
OVMF 补丁包(可选,本机未装):项目还给了 pve-edk2-firmware-ovmf_4.2023.08-4..._anti_detection.deb,作用是从 UEFI 固件层抹掉 OVMF/EFI 字样。但它会把 OVMF 整体降级,影响宿主机上所有用 UEFI 启动的虚拟机,而 VM 9000 用的是 bios: seabios,根本不走 OVMF,所以本机没有装这个包。只有当你要建一台 UEFI 启动的反检测 Windows 虚拟机时,才需要它(同样记得 apt-mark hold pve-edk2-firmware-ovmf 并备好回退)。
4.1.6 验证生效
装好后 qm start 9000,确认进程是 /usr/bin/kvm(即补丁后的 qemu-system-x86_64 软链),且 cmdline 含 hypervisor=off、各 -smbios(ASUS/AMD)、model=Samsung_SSD_980_PRO_250GB;strings /usr/bin/qemu-system-x86_64 里 KVMKVMKVM 为 0。最终“是否真的藏住”仍要在 Windows 里用 4.2 提到的 pafish64/al-khaser 实测。
4.2 剩下的“无解”项与注意事项
项目实测里剩下两项“无解”检测(真实物理机也过不了,不用纠结):
- LDT location(al-khaser 的 Local Descriptor Table 检查):作者试了好几台真机也是
BAD; - ThermalZoneInfo(WMI 温度传感器性能计数器):真机也没有,要写一堆 ACPI 才可能有。
还有一类时序攻击(RDTSC 强制 vm-exit / cpuid 计时差异):项目说需要打内核补丁(定制内核或 kvm 内核模块)。这对当前盒子是额外风险,先不做;前面那套配置已经能过绝大多数游戏/样本的反虚拟机检查。
项目还特别强调一点,和我们这台 VM 的现状正好契合:从第一次装系统开始就要用反检测环境。一旦用原版(官方)qemu/OVMF 装过系统,注册表里就会留下 QEMU 硬盘/光驱字符串,删都删不掉。我们这台 VM 还没装系统,从干净状态开始就行。
补充几条项目里提到的“过检测”经验:
- 装系统前的准备:建议把 MAC 地址前缀先改成真实厂牌(数据中心 → 选项 → MAC 地址前缀,我们已设
d8:fc:93);系统盘用 SATA/IDE、容量至少 128G(我们用了 238G),避开 50G/80G 这种“太假”的容量;避开一切scsi/virtio设备(硬盘、光驱、网卡),用e1000+ IDE/SATA;内存用4096/8192/16384(4G/8G/16G)这种真实档位。 - 推荐检测工具(金标准):
pafish64.exe和al-khaser(项目tools/目录里带了这两个以及一份“目前过不了的检测说明”)。装完系统拿这两个跑一遍,比systeminfo严格得多。 - Hyper-V 检测的 VDRVROOT 全局对象:不是真破绽(真实机也有,叫“Microsoft 虚拟驱动器枚举器”),看着不舒服就在设备管理器里卸载该设备,这一项就过。
- Windows 是否正版(Genuine):激活一下就过。
5. 装系统后怎么验证“藏好了”
进 Windows 后,用下面几样确认虚拟化特征是否消失:
powershell# 看 hypervisor 是否被识别 systeminfo | findstr /i "hyper-v" # 看 CPU 厂商与型号(应是真实 AMD,不应出现 KVM/QEMU) Get-WmiObject Win32_Processor | Select-Object Name,Manufacturer # 看系统厂商/型号(应是我们伪造的 ASUS / PRIMEB550MA) Get-WmiObject Win32_ComputerSystem | Select-Object Manufacturer,Model Get-WmiObject Win32_BIOS | Select-Object Manufacturer,SerialNumber,Version # 看内存(应出现 Kingston、速度 3200,而不是空) Get-WmiObject Win32_PhysicalMemory | Select-Object Manufacturer,PartNumber,Speed # 看端口连接器(应出现我们注入的 CPU FAN 等,而不是空) Get-WmiObject Win32_PortConnector | Select-Object Name,ExternalReference # 看磁盘型号(应是 Samsung_SSD_980_PRO_250GB,不是 QEMU HARDDISK) Get-WmiObject Win32_DiskDrive | Select-Object Model,SerialNumber
更严格的验证用第 4 节提到的 pafish64.exe / al-khaser:检查 CPUID 0x40000000 厂商标识、是否加载 VBox/VMware 驱动、MAC OUI、磁盘型号、SMBIOS 各型是否齐全。如果 systeminfo 里不再出现 “A hypervisor has been detected…” 之类提示,说明 hypervisor=off 已生效。
6. 把 P100 显卡接进来(vGPU)
虚拟机本身先不装系统,显卡先留好位置。接法见另一篇 pve-vgpu-p100-setup.md:等宿主机 vGPU 配好后,用 mdevctl 创建一个 P100 的 vGPU 实例,再 qm set 9000 --hostpci0 <mdev> 或图形界面添加“PCI Device(MDev 类型)”。
本机已经接好:
bashqm set 9000 -hostpci0 0000:01:00.0,mdev=nvidia-86 # nvidia-86 = GRID P100-8Q / 8G
qm start 9000 时 PVE 自动用 mdevctl 建好实例挂上 vfio-pci;qm stop 时自动回收,无需手管。
显卡接进来后,
vga std可以改成none(显示走直通的 P100),但装系统阶段先保持vga std方便看安装界面。装好 Windows 后,在 guest 里安装与宿主机同大版本的 GRID 客户驱动(本机宿主是 535 分支,guest 也装 535 分支),设备管理器里会看到 Tesla P100,nvidia-smi也能识别这张 vGPU。
7. 排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
qm create 报 scsihw ... does not have a value in the enumeration | 用了不存在的值 lsi53c895a | 改成 lsi |
smbios1: invalid format | 字段值里有空格/小数点/连字符 | 去掉(如 Dell Inc.→DellInc,PRIME-B550M-A→PRIMEB550MA);带空格/逗号的厂商名只能放进 --args 的 -smbios |
qm set ... --boot order= 报 boot.legacy: value does not match the regex pattern | 启动顺序分隔符用了逗号 | 用分号 ;(不是逗号),且分号在 shell 里是命令分隔符,必须引号包住,例如 --boot order="ide0;net0" |
磁盘型号想改却报 property is not defined in schema | 只有 ide 总线允许 model | 系统盘走 ide0 才能把 QEMU HARDDISK 伪造成真实型号 |
qm set 的 size 想设小数(如 238.5G)被忽略 | size 不接受小数 | 用整数 GiB(如 238G ≈ 真实 256GB 盘的 238.5G) |
--args 里的 -smbios 值带逗号让 qemu 启动失败 | qemu 把逗号当字段分隔符 | 去掉逗号(如 Advanced Micro Devices, Inc.→Advanced Micro Devices Inc);空格和连字符没问题 |
--args 里 -smbios type=9 的 designation 在 qemu 11 不被接受 | qemu 11 无此参数 | 去掉 type=9(Win32_PortConnector 已由 type=8 覆盖) |
薄池超分配告警(lvs 里虚拟盘 238G > 薄池 ~141G) | 薄分配正常 | 只要实际写入不超薄池物理量(~141G)就无事;要扩容把闲置 2TB 盘 pvcreate+vgextend pve+lvextend 薄池 |
| Windows 安装时找不到硬盘 | 系统盘不在 IDE/ATA | 确认是 ide0(Windows 自带 atapi/pciide 驱动),不要放 scsi0(除非加载 LSI 驱动) |
| 装 Windows 11 卡在“本电脑不满足要求” | TPM/安全启动检查 | 已挂 swtpm;仍不过就 Shift+F10 注入 LabConfig 注册表跳过 |
进系统后 systeminfo 仍提示检测到 hypervisor | hypervisor=off 未生效 | 确认已写进 conf,且虚拟机是完全关机再开机(不是重启)后生效 |
| 想从源码层抹特征(ASUS 字符串、禁用 vmgenid、ACPI OEM 等) | 需重编译 qemu | 我们已基于 qemu 11 重编译并安装补丁版 pve-qemu-kvm 11.0.2-2(见第 4.1 节),已 apt-mark hold 防覆盖,回退见 4.1.5。OVMF 补丁包全局降级、影响所有 UEFI VM,VM 9000 用 SeaBIOS 故未装,仅 UEFI 反检测 VM 才考虑 |
小结
一台“看不出是虚拟机”的 Windows VM,由两层构成:配置层(第 2、3 节,hypervisor=off + 一致的华硕/AMD SMBIOS + 伪硬盘型号 + 真实厂牌 MAC + 标准 VGA + 关 balloon/localtime/numa)对付绝大多数检测工具;源码层(第 4 节,基于 qemu 11 重编译 pve-qemu-kvm 11.0.2-2)把 QEMU/KVMKVMKVM/BOCHS/BXPC 等字符串从根上抹掉,作为双保险。两者都从第一次装系统前就生效,避免注册表里留下 QEMU 痕迹。显卡走 P100 的原生 vGPU(mdev=nvidia-86 / P100-8Q),guest 装同版本 GRID 客户驱动即可看到 Tesla P100。
参考资料
- pve-anti-detection-main — 本文反检测策略来源(李晓流 & 大大帅666,基于
zhaodice/proxmox-ve-anti-detection) - proxmox/pve-qemu — PVE 的 qemu 打包仓库(构建骨架)
- proxmox/qemu — qemu 11.0.2 子模块源码
- pve-vgpu-p100-setup.md — 同盒子的 P100 vGPU 开启教程(显卡接法来源)
ai协作,人工编辑