技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 80|回复: 1
收起左侧

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

[复制链接]

26

主题

68

帖子

1941

积分

用户组: 管理员

UID
1043
精华
10
威望
43 点
宅币
1654 个
贡献
83 次
宅之契约
0 份
在线时间
288 小时
注册时间
2015-8-15
发表于 2018-11-5 15:33:49 | 显示全部楼层 |阅读模式

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

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

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

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


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

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

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

评分

参与人数 1威望 +2 宅币 +16 贡献 +8 收起 理由
0xAA55 + 2 + 16 + 8

查看全部评分

flowers for Broken spirits - a woman turned into stake will hold the world in the basin of fire.

11

主题

100

帖子

738

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
557 个
贡献
44 次
宅之契约
0 份
在线时间
90 小时
注册时间
2018-5-6
发表于 2018-11-5 18:32:41 | 显示全部楼层
知识点get,orz
菜鸟一枚,直接指正,不必留情

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-11-20 14:18 , Processed in 0.075265 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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