收集整理一下虚拟机检测相关的文章,过段时间用。

方法一

方法一:

使用RDTSC指令来判断虚拟机类型(通过指令执行的时钟周期来判断):

RDTSC指令将计算机启动以来的CPU运行周期数放到EDX:EAX里面,EDX是高位,EAX是低位。 RDTSC指令还可以antidebug,实现微秒级计时器

方法二

方法二:VMware“后门”

VMware后门开在IO端口0x5658。

利用这个后门时,必需: EAX = 0x564D5868 (“VMXh”) EBX 为参数,一般不用。 ECX 低 16 位为功能号。其实是一个函数数组的索引。 Vmware 调用对应的函数处理后门请求。 这个函数数组共有36 个元素,但某些没有定义。 ECX 的高 16 位为功能参数。 EDX = 0x5658 (“VX”),为 IO 端口号。

sm

方法三:环境内进程检测

方法四

方法四:windows主机检查注册表键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet等键值是否包含常见虚拟机的键值

方法五

方法五:检查CPUID/硬盘型号/主板型号 参考代码如下,适用没有做过硬件名称修改的虚拟机: 如果使用的是 VMware/Xen HVM/KVM 这样的全虚拟就更难判断一些,最准确的办法是读取 CPUID 来判断,Xen 源代码下面有一段检测是否是 Xen 的 C 语言代码 tools/misc/xen-detect.c,这段代码提供了一个很好的例子,重写了代码,用宏替代了函数,增加了对 VMware 和 KVM 的识别,用 gcc 编译后就可以运行:

使用wmi检查硬盘型号是否包含VMWARE字符串

组合起来的方法

特别感谢以下资料出处: