- UID
- 1043
- 精华
- 积分
- 11700
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
检测的手段是通过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[4];
- __cpuid(data,1);
- return _bittest(&data[2],31);
复制代码
如何反制虚拟机检测呢?闲着蛋疼的话,可以套个VT框架然后拦截cpuid指令,当eax=1的时候把ecx的第31位复位。
(真够蛋疼的)
简单的方法是:
打开虚拟机的.vmx文件,在最底下加上一行:
- hypervisor.cpuid.v0 = "FALSE"
复制代码
默认情况下,这一行是没有的,而且是可以让虚拟机内的程序检测到的。
为啥会有这种事情呢?
其实AMD规定了cpuid指令中当eax=1的时候,ecx的第31位是给虚拟机保留的。
什么?你问Intel?
Intel也保留了这一位,但没做出任何解释。 |
|