文档介绍:虚拟机检测技术剖析
作者:riusksk (泉哥)
主页:http://riusksk.
前言
在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安
全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机
(VirtualMachine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计
算机系统。通过虚拟机软件(比如 VMware,VirtualPC ,VirtualBox),你可以在一台物理计算机上模拟出
一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、
安装应用程序、访问网络资源等等。攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他
们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。当发现程序处于虚拟机(特别
是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。
本文主要针对基于 Intel CPU 的虚拟环境 VMware 中的 WindowsXP SP3 系统进行检测分析,并列举出当
前常见的几种虚拟机检测方法。
方法一:通过执行特权指令来检测虚拟机
Vmware 为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以
进行两机通讯,但由于 IN 指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,
否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在
指定功能号 0A(获取 VMware 版本)的情况下,它会在 EBX 中返回其版本号“VMXH”;而当功能号为
0x14 时,可用于获取 VMware 内存大小,当大于 0 时则说明处于虚拟机中。VMDetect 正是利用前一种方
法来检测 VMware 的存在,其检测代码分析如下:
bool IsInsideVMWare()
{
bool rc = true;
__try
{
__asm
{
push edx
push ecx
push ebx
mov eax, 'VMXh'
mov ebx, 0 // 将 ebx 设置为非幻数’VMXH’的其它值
mov ecx, 10 // 指定功能号,用于获取 VMWare 版本,当它为 0x14 时用于获取 VMware 内存大小
mov edx, 'VX' // 端口号
in eax, dx // 从端口 dx 读取 VMware 版本到 eax
//若上面指定功能号为 0x14 时,可通过判断 eax 中的值是否大于 0,若是则说明处于虚拟机中
cmp ebx, 'VMXh' // 判断 ebx 中是否包含 VMware 版本’VMXh’,若是则在虚拟机中
setz [rc] // 设置返回值
pop ebx
pop ecx
pop edx
}
}
__except(EXCEPTION_EXECUTE_HANDLER) //如果未处于 VMware 中,则触发此异常
{
rc = false;
}
return rc;
}
测试结果:
图 1
如图 1 所示,VMDetect 成功检测出 VMWare 的存在。
方法二:利用 IDT 基址检测虚拟机
利用 IDT 基址检测虚拟机的方法是一种通用方式,对 VMware 和 VirtualPC 均适用。中断描述符表 IDT
(Interrupt Descriptor Table)用于查找处理中断时所用的软件函数,它是一个由 256 项组成的数据,其中
每一中断对应一项函数。为了读取 IDT 基址,我们需要通过 SIDT 指令来读取 IDTR(中断描述符表寄存
器,用于 IDT 在内存中的基址),SIDT 指令是以如下格式来存储 IDTR 的内容:
typedef struct
{
WORD IDTLimit; // IDT 的大小
WORD LowIDTbase; // IDT 的低位地址
WORD HiIDTbase; // IDT 的高位地址
} IDTINFO;
由于只存在一个 IDTR,但又存在两个操作系统,即虚拟机系统和真主机系统。为了防止发生冲突,VMM
(虚拟机监控器)必须更改虚拟机中的 IDT 地址,利用真主机与虚拟机环境中执行 sidt 指令的差异即可
用于检测虚拟机是否存在。著名的“红丸”(redpill)正是利用此原理来检测 VMware 的。Redpill 作