唐凌 发表于 2018-11-5 15:33:49

一种检测VMware虚拟机的手段,以及反制检测的手段

检测的手段是通过cpuid指令实现的。当eax寄存器被设置为1后,VMware将会把ecx的第31位置位。如果不在虚拟机内,处理器将会把ecx的第31位复位。
根据这个原理,用汇编写检测代码的话,大致如下:
xor eax,eax
inc eax
cpuid
bt ecx,1fh
setc al
movzx eax,al
ret
其中eax寄存器用于存放函数的返回值。
如果用MSVC写,大致如下:
int data;
__cpuid(data,1);
return _bittest(&data,31);

如何反制虚拟机检测呢?闲着蛋疼的话,可以套个VT框架然后拦截cpuid指令,当eax=1的时候把ecx的第31位复位。
(真够蛋疼的)
简单的方法是:
打开虚拟机的.vmx文件,在最底下加上一行:
hypervisor.cpuid.v0 = "FALSE"
默认情况下,这一行是没有的,而且是可以让虚拟机内的程序检测到的。

为啥会有这种事情呢?
其实AMD规定了cpuid指令中当eax=1的时候,ecx的第31位是给虚拟机保留的。
什么?你问Intel?
Intel也保留了这一位,但没做出任何解释。

watermelon 发表于 2018-11-5 18:32:41

知识点get,orz

Si515 发表于 2018-11-20 18:17:20

这样子我是不是就可以多加一道暗桩保护程序了
页: [1]
查看完整版本: 一种检测VMware虚拟机的手段,以及反制检测的手段