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

QQ登录

只需一步,快速开始

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

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

[复制链接]

65

主题

113

回帖

1万

积分

用户组: 超级版主

OS与VM研究学者

UID
1043
精华
35
威望
789 点
宅币
8248 个
贡献
1094 次
宅之契约
0 份
在线时间
2053 小时
注册时间
2015-8-15
发表于 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也保留了这一位,但没做出任何解释。
回复

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
发表于 2018-11-5 18:32:41 | 显示全部楼层
知识点get,orz
Passion Coding!
回复 赞! 靠!

使用道具 举报

1

主题

16

回帖

44

积分

用户组: 初·技术宅

UID
4492
精华
0
威望
2 点
宅币
23 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-11-20
发表于 2018-11-20 18:17:20 | 显示全部楼层
这样子我是不是就可以多加一道暗桩保护程序了
回复 赞! 靠!

使用道具 举报

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

GMT+8, 2024-3-29 16:51 , Processed in 0.038552 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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