pve kvmqemu反虚拟化检测

https://github.com/z.

https://github.com/zhaodice/proxmox-ve-anti-detection

https://github.com/zhaodice/qemu-anti-detection

dpkg -l|grep kvm

查看你目前使用的kvm版本(这里需要明确,你pve管理网页左上角看到的版本比如Virtual Environment 8.0.3这个和kvm包比如8.0.2-4版本是不一样的哈,这里你通过上面命令查询确认就是)然后如果是8.0.2-4运行类似下面命令就是

dpkg -i pve-qemu-kvm_8.0.2-4_amd64_anti_detection.deb

然后虚拟机里面再加这一串代码,这个你可以自己类比改动,不一定和我的一致。

args: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true, -smbios type=0,vendor="American Megatrends International LLC.",version=H3.7G,date='02/21/2023' -smbios type=1,manufacturer="Maxsun",product="MS-Terminator B760M",version="VER:H3.7G(2022/11/29)" -smbios type=2,manufacturer="Maxsun",product="MS-Terminator B760M",version="VER:H3.7G(2022/11/29)" -smbios type=17,manufacturer="KINGSTON",speed=3200,serial=DF1EC466,part=SED3200U1888S

这些参数也可以用源码作者的参数。有热心网友提供了检测软件,通过我这测试,-cpu host,hypervisor=off 这个是关键参数,即使不安装我编译的包(保持pve原生包),也能过一堆检测(只有se检测过不了,要过se检测就得安装我编译的包),其他剩下的参数比如smbios就是图个心理安慰。hypervisor=on会给windows明说我是虚拟机。

1、首先知道下源码项目作者打补丁太猛,scsi等virtIO设备存在无法工作bug,下面文字讲解了解下就是,可不看下面内容

源码项目作者打补丁太猛,对pci.h文件 里面所有redhat virtIO设备都强制改成了8086(intel),bug就是如果你原先pve里面有虚拟机使用了virtIO等设备都用不起(比如scsi virtIO网卡,rng等等设备。用不起的原因:比如scsi是通过检测厂商id+设备id后进行驱动安装,你改了后,ovmf就不认识这块硬盘了,virtIO驱动也不认识也打不上驱动了,最后症状就是不认盘。网卡等其他设备也是一样。要想virtIO设备反虚拟化检测去掉得干干净净,那只有kvm+ovmf+virtIO驱动这三个源码一起改,这样太折腾了!)。不能因为反虚拟化检测把其他虚拟机也搞废了哈(比如你的ikuai,你的ubuntu,你的centos等等)。结论就是为了兼容性这个文件就最好不要打补丁。我后面的sed补丁中就没对这个文件处理。建议游戏的反虚拟化检测配置就是:sata硬盘,e1000网卡,但是推荐还是尽量不沾边virtIO设备(虽然我也用虚拟机检测工具试了scsi硬盘也检测不了,其他virtIO设备也检测不了)。

diff -Naur –no-dereference a/include/hw/pci/pci.h b/include/hw/pci/pci.h
— a/include/hw/pci/pci.h 2023-07-04 11:03:21.671219333 +0000
+++ b/include/hw/pci/pci.h 2023-07-20 16:39:20.332693304 +0000
@@ -72,19 +72,19 @@
#define PCI_DEVICE_ID_INTEL_82801IR 0x2922

/* Red Hat / Qumranet (for QEMU) — see pci-ids.txt */
-#define PCI_VENDOR_ID_REDHAT_QUMRANET 0x1af4
-#define PCI_SUBVENDOR_ID_REDHAT_QUMRANET 0x1af4
-#define PCI_SUBDEVICE_ID_QEMU 0x1100
+#define PCI_VENDOR_ID_REDHAT_QUMRANET 0x8086
+#define PCI_SUBVENDOR_ID_REDHAT_QUMRANET 0x8086
+#define PCI_SUBDEVICE_ID_QEMU 0x8086

/* legacy virtio-pci devices */
-#define PCI_DEVICE_ID_VIRTIO_NET 0x1000
-#define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001
-#define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002
-#define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003
-#define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004
-#define PCI_DEVICE_ID_VIRTIO_RNG 0x1005
-#define PCI_DEVICE_ID_VIRTIO_9P 0x1009
-#define PCI_DEVICE_ID_VIRTIO_VSOCK 0x1012
+#define PCI_DEVICE_ID_VIRTIO_NET 0x8086
+#define PCI_DEVICE_ID_VIRTIO_BLOCK 0x8086
+#define PCI_DEVICE_ID_VIRTIO_BALLOON 0x8086
+#define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x8086
+#define PCI_DEVICE_ID_VIRTIO_SCSI 0x8086
+#define PCI_DEVICE_ID_VIRTIO_RNG 0x8086
+#define PCI_DEVICE_ID_VIRTIO_9P 0x8086
+#define PCI_DEVICE_ID_VIRTIO_VSOCK 0x8086

/*
* modern virtio-pci devices get their id assigned automatically,
@@ -95,7 +95,7 @@
*/
#define PCI_DEVICE_ID_VIRTIO_10_BASE 0x1040

-#define PCI_VENDOR_ID_REDHAT 0x1b36
+#define PCI_VENDOR_ID_REDHAT 0x8086
#define PCI_DEVICE_ID_REDHAT_BRIDGE 0x0001
#define PCI_DEVICE_ID_REDHAT_SERIAL 0x0002
#define PCI_DEVICE_ID_REDHAT_SERIAL2 0x0003

2、编译环境准备

最好是在pve8环境中编译,而不用ubuntu等。你可以pve8里面再装个单独的pve8虚拟机来只做编译事情。pve7 的包最好在7上编译,8上会有报错无法解决

3、处理下git访问github 太慢问题(经常网速慢、断流打不开),后面下载更加网速快,可不看下面内容

cd ~
nano .gitconfig
复制进去下面内容,大概意思用ghproxy对github进行代理加速,尽快检测git网速慢问题,boringssl不用google的用github替代。git.proxmox.com这个网速也慢啊等啊等啊等,目前没找到可以代理加速的办法得。题外话:如果有个在线网页代理可以直接看github网页的就更好了。

[http]
lowSpeedLimit = 10
lowSpeedTime = 10
[url “https://ghproxy.com/https://github.com/”]
insteadOf = https://github.com/
[url “https://ghproxy.com/https://github.com/google/boringssl.git”]
insteadOf = https://boringssl.googlesource.com/boringssl
4、根据源码作者项目介绍先正常自编译成功pve-qemu-kvm包

https://github.com/zhaodice/proxmox-ve-anti-detection中有详细介绍,这里我们直接采用以下代码编译

apt update
git clone git://git.proxmox.com/git/pve-qemu.git
cd pve-qemu
首先更新下软件库(pve如何换国内源请看其他教程),到pve源码库去克隆pve-qemu下来

git reset –hard 409db0cd7bdc833e4a09d39492b319426029aa92
//后面409db0cd7bdc833e4a09d39492b319426029aa92这个是8.0.2-3具体的commit,其他版本请自己查
如果你要编译最新包就不要执行这个操作,如果你要编译旧版本,比如8.0.2-3就要去https://git.proxmox.com/?p=pve-qemu.git;a=summary 查8.0.2-3的commit是多少,查了下是409db0cd7bdc833e4a09d39492b319426029aa92

这个操作意思是强制切换到8.0.2-3这个版本

apt install  devscripts aptitude
git submodule update –init –recursive
mk-build-deps –install
编辑debian/rules
找到 –disable-download 删掉这行

make

然后安装依赖包,编译,这里要说明下,具体缺什么依赖,你要有耐心看报错一个个安装好,如果apt install 安装遇到问题就换成aptitude install 来进行安装(解决包之间的依赖问题)
这里面安装依赖包是最烦的。我试了下,其他确的包都可以apt install安装。可能
aptitude install librbd-dev 这个包需要aptitude 选择安装方案旧版本来安装。

如果老是编译失败,cd qemu目录更新下它内部的子模块
除了缺依赖包问题,有时候就是qemu的子模块没有下载齐全导致编译包老是编译不好。
耐心一点,就是通过下面5个命令反复执行解决依赖:
make
qemu目录下单独执行 git submodule update –init –recursive
mk-build-deps –install
apt install XXX包
aptitude install XXX包
反复执行哈!!直到不报错为止!!!
如果一切顺利(都会曲折的),你会顺利编译出来pve-qemu-kvm_xxx_amd64.deb 这个包。
恭喜你,成功一半了!
5、打sed补丁,自编译反虚拟机检测的pve-qemu-kvm包
5.1 先确认你目前shell在pve-qemu目录,如果没有cd pve-qemu 一下
5.2 先把编译的包和各种二进制代码清理一下清理干净!
make clean
5.3 把qemu文件夹先备份一下,免得出错了无法使用,后面好拿qemu-bak目录来补救使用
cp -r qemu qemu-bak
5.4 进入qemu目录
cd qemu
5.5 编辑新建一个sed文件
nano sedPatch-pve-qemu-kvm7-8-anti-dection.sh
5.6 把下面里面的代码全部贴进去保存一下,目前只支持7.0到8.1。8.2等没弄
#!/bin/bash
#适用于给pve-qemu-kvm7 和pve-qemu-kvm8里面的qemu打补丁使用,最高从7.0支持到8.1(再高的8.2等没有测试),直接放本脚本在qemu目录下,在make包之前在qemu目录运行一次本脚本就是,运行后你可以继续使用git工具生成qemu具体版本的patch文件
#参考开源项目 https://github.com/zhaodice/proxmox-ve-anti-detection 编写,处理重复劳作
#作者 李晓流
echo “开始sed工作”
sed -i ‘s/QEMU v” QEMU_VERSION/ASUS v” QEMU_VERSION/g’ block/vhdx.c
sed -i ‘s/QEMU VVFAT”, 10/ASUS VVFAT”, 10/g’ block/vvfat.c
sed -i ‘s/QEMU Microsoft Mouse/ASUS Microsoft Mouse/g’ chardev/msmouse.c
sed -i ‘s/QEMU Wacom Pen Tablet/ASUS Wacom Pen Tablet/g’ chardev/wctablet.c
sed -i ‘s/QEMU vhost-user-gpu/ASUS vhost-user-gpu/g’ contrib/vhost-user-gpu/vhost-user-gpu.c
sed -i ‘s/desc->oem_id/ACPI_BUILD_APPNAME6/g’ hw/acpi/aml-build.c
sed -i ‘s/desc->oem_table_id/ACPI_BUILD_APPNAME8/g’ hw/acpi/aml-build.c
sed -i ‘s/array, ACPI_BUILD_APPNAME8/array, “PTL “/g’ hw/acpi/aml-build.c
grep “do this once” hw/acpi/vmgenid.c >/dev/null
if [ $? -eq 0 ]; then
echo “hw/acpi/vmgenid.c 文件只能处理一次!以前已经处理,本次不执行!”
else
sed -i ‘s/    Aml \*ssdt/       \/\/FUCK YOU~~~\n       return;\/\/do this once\n    Aml \*ssdt/g’ hw/acpi/vmgenid.c
echo “hw/acpi/vmgenid.c 文件处理完成(第一次处理,只处理一次)”
fi
sed -i ‘s/QEMU N800/ASUS N800/g’ hw/arm/nseries.c
sed -i ‘s/QEMU LCD panel/ASUS LCD panel/g’ hw/arm/nseries.c
sed -i ‘s/strcpy((void *) w, “QEMU “)/strcpy((void *) w, “ASUS “)/g’ hw/arm/nseries.c
sed -i ‘s/”1.1.10-qemu” : “1.1.6-qemu”/”1.1.10-asus” : “1.1.6-asus”/g’ hw/arm/nseries.c
sed -i “s/QEMU ‘SBSA Reference’ ARM Virtual Machine/ASUS ‘SBSA Reference’ ARM Real Machine/g” hw/arm/sbsa-ref.c
sed -i ‘s/QEMU Sun Mouse/ASUS Sun Mouse/g’ hw/char/escc.c
sed -i ‘s/info->vendor = “RHT”/info->vendor = “DEL”/g’ hw/display/edid-generate.c
sed -i ‘s/QEMU Monitor/DEL Monitor/g’ hw/display/edid-generate.c
sed -i ‘s/uint16_t model_nr = 0x1234;/uint16_t model_nr = 0xA05F;/g’ hw/display/edid-generate.c
grep “do this once” hw/i386/acpi-build.c >/dev/null
if [ $? -eq 0 ]; then
echo “hw/i386/acpi-build.c 文件只能处理一次!以前已经处理,本次不执行!”
else
sed -i ‘/static void build_dbg_aml(Aml \*table)/,/ /s/{/{\n     return;\/\/do this once/g’ hw/i386/acpi-build.c
sed -i ‘/create fw_cfg node/,/}/s/}/}*\//g’ hw/i386/acpi-build.c
sed -i ‘/create fw_cfg node/,/}/s/{/\/*{/g’ hw/i386/acpi-build.c
echo “hw/i386/acpi-build.c 文件处理完成(第一次处理,只处理一次)”
fi
sed -i ‘s/”QEMU”, “Standard PC (i440FX + PIIX, 1996)”,/”ASUS”, “M4A88TD-M”,/g’ hw/i386/pc_piix.c
sed -i ‘s/”QEMU”, “Standard PC (Q35 + ICH9, 2009)”,/”ASUS”, “M4A88TD-M”,/g’ hw/i386/pc_q35.c
sed -i ‘s/mc->name, pcmc->smbios_legacy_mode,/”ASUS-PC”, pcmc->smbios_legacy_mode,/g’ hw/i386/pc_q35.c
sed -i ‘s/pcmc->smbios_uuid_encoded,/0x00,/g’ hw/i386/pc_q35.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/ide/atapi.c
sed -i ‘s/”QEMU/”ASUS /g’ hw/ide/core.c
sed -i ‘s/QM%05d/ASUS%05d/g’ hw/ide/core.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/adb-kbd.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/adb-mouse.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/ads7846.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/hid.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/ps2.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/tsc2005.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/input/tsc210x.c
sed -i ‘s/”QEMU Virtio/”ASUS/g’ hw/input/virtio-input-hid.c
sed -i ‘s/QEMU M68K Virtual Machine/ASUS M68K Real Machine/g’ hw/m68k/virt.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/misc/pvpanic-isa.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/nvme/ctrl.c
sed -i ‘s/0x51454d5520434647ULL/0x4155535520434647ULL/g’ hw/nvram/fw_cfg.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/pci-host/gpex.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/ppc/e500plat.c
sed -i ‘s/qemu-e500/asus-e500/g’ hw/ppc/e500plat.c
sed -i ‘s/s16s8s16s16s16/s11s4s51s41s91/g’ hw/scsi/mptconfig.c
sed -i ‘s/QEMU MPT Fusion/ASUS MPT Fusion/g’ hw/scsi/mptconfig.c
sed -i ‘s/”QEMU”/”ASUS”/g’ hw/scsi/mptconfig.c
sed -i ‘s/0000111122223333/1145141919810000/g’ hw/scsi/mptconfig.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/scsi/scsi-bus.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/scsi/scsi-disk.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/scsi/spapr_vscsi.c
sed -i ‘s/extension_bytes[1] = 0x14/extension_bytes[1] = 0x08/g’ hw/smbios/smbios.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-audio.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-hid.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-hub.c
sed -i ‘s/314159/114514/g’ hw/usb/dev-hub.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-mtp.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-network.c
sed -i ‘s/”RNDIS\/QEMU/”RNDIS\/ASUS/g’ hw/usb/dev-network.c
sed -i ‘s/400102030405/400114514405/g’ hw/usb/dev-network.c
sed -i ‘s/s->vendorid = 0x1234/s->vendorid = 0x8086/g’ hw/usb/dev-network.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-serial.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-smartcard-reader.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-storage.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-uas.c
sed -i ‘s/27842/33121/g’ hw/usb/dev-uas.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/dev-wacom.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/u2f-emulated.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/u2f-passthru.c
sed -i ‘s/”QEMU/”ASUS/g’ hw/usb/u2f.c
sed -i ‘s/”BOCHS/”INTEL/g’ include/hw/acpi/aml-build.h
sed -i ‘s/”BXPC/”PC8086/g’ include/hw/acpi/aml-build.h
sed -i ‘s/”QEMU0002/”ASUS0002/g’ include/standard-headers/linux/qemu_fw_cfg.h
sed -i ‘s/0x51454d5520434647ULL/0x4155535520434647ULL/g’ include/standard-headers/linux/qemu_fw_cfg.h
sed -i ‘s/”QEMU/”ASUS/g’ migration/migration.c
sed -i ‘s/”QEMU/”ASUS/g’ migration/rdma.c
sed -i ‘s/0x51454d5520434647ULL/0x4155535520434647ULL/g’ pc-bios/optionrom/optionrom.h
sed -i ‘s/”QEMU/”ASUS/g’ pc-bios/s390-ccw/virtio-scsi.h
sed -i ‘s/”QEMU/”ASUS/g’ roms/seabios/src/fw/ssdt-misc.dsl
sed -i ‘s/”QEMU/”ASUS/g’ roms/seabios-hppa/src/fw/ssdt-misc.dsl
sed -i ‘s/KVMKVMKVM\\0\\0\\0/GenuineIntel/g’ target/i386/kvm/kvm.c
sed -i ‘s/QEMUQEMUQEMUQEMU/ASUSASUSASUSASUS/g’ target/s390x/tcg/misc_helper.c
sed -i ‘s/”QEMU/”ASUS/g’ target/s390x/tcg/misc_helper.c
sed -i ‘s/”KVM/”ATX/g’ target/s390x/tcg/misc_helper.c
echo “结束sed工作”
5.7 补丁加执行权限
chmod +x sedPatch-pve-qemu-kvm7-8-anti-dection.sh
5.8 运行一次这个sed补丁
这个补丁是通用的,不管kvm是7还是8版本都支持,可以免除kvm每一个小版本都写一个patch(patch有时候比较死板,只能特定的版本才能打成功,用sed方便但是成功与否没法直观判断,两者各有优缺点!我这里写的sed参考了源码作者kvm7 kvm8.0 kvm8.1他patch kvm的方式和每一个地方,写的通用处理办法,支持性更加方便快速。可以通过批量sed一下,然后用git工具生成每一个小版本kvm的patch文件来(这个留给大家去玩去弄,我玩不来patch,sed处理重复性操作还是比较方便的))
bash sedPatch-pve-qemu-kvm7-8-anti-dection.sh
你会看到输出如下
开始sed工作
hw/acpi/vmgenid.c 文件处理完成(第一次处理,只处理一次)
hw/i386/acpi-build.c 文件处理完成(第一次处理,只处理一次)
结束sed工作
看到这些代表sed完成了所有工作了
5.9 返回pve-qemu目录再次make
cd ..
make
5.10 成功编译出来反虚拟检测的包
成功编译出来包以后,你就可以复制他到你真实pve上强制安装使用了
dpkg -i –force-all pve-qemu-kvm_X.X.X.X_amd64.deb
如果你想改个名字,把包重命名加anti-dection就是了
安装上后使用,你只需要判断光驱是不是asus的就知道是否成功了。