找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4354|回复: 2

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

[复制链接]
发表于 2018-11-5 15:33:49 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
检测的手段是通过cpuid指令实现的。当eax寄存器被设置为1后,VMware将会把ecx的第31位置位。如果不在虚拟机内,处理器将会把ecx的第31位复位。
根据这个原理,用汇编写检测代码的话,大致如下:
  1. xor eax,eax
  2. inc eax
  3. cpuid
  4. bt ecx,1fh
  5. setc al
  6. movzx eax,al
  7. ret
复制代码

其中eax寄存器用于存放函数的返回值。
如果用MSVC写,大致如下:
  1. int data[4];
  2. __cpuid(data,1);
  3. return _bittest(&data[2],31);
复制代码


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

默认情况下,这一行是没有的,而且是可以让虚拟机内的程序检测到的。

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

使用道具 举报

发表于 2018-11-5 18:32:41 | 显示全部楼层
知识点get,orz
回复 赞! 靠!

使用道具 举报

发表于 2018-11-20 18:17:20 | 显示全部楼层
这样子我是不是就可以多加一道暗桩保护程序了
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-24 23:14 , Processed in 0.033081 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表