来自:http://www.codeproject.com/kb/system/VmDetect.aspx
分析病毒的时候人们通常在vmware等虚拟机下运行,以查看病毒的执行路径或者提取特征码。但是近年来出现许多抗虚拟机检测的病毒。也就是说,在虚拟机下运行的时候,病毒会隐匿其恶意行为,使人们无法检测得到。
上面那篇文章是codeproject的链接。它详细说明了程序如何检测自身是否在虚拟机下并且提供了源代码。我用我的windows Xp测试通过。
其实检测vmware的原理很简单。vmware存在一个隐藏通道,这个通道用于虚拟机和实体机的信息交流。文中的代码检测这个通道是否存在,并用try...catch来得到结果——如果try和catch之间的那段代码不出现异常,则表示在虚拟机里。如果出现异常,则表示在虚拟机外。(既没有虚拟机)
对抗这种抗虚拟机技术的方法,我看过一篇论文《Efficient Detection of Split Personalities in Malware》。我看了一遍,可惜我还没彻底看懂,以后再补充。
作为测试,可以新建一个VC++工程并且把下面代码复制粘贴:
#include <windows.h>
#include <stdio.h>
bool IsInsideVMWare()
{
bool rc = true;
__try
{
__asm
{
push edx
push ecx
push ebx
mov eax, 'VMXh'
mov ebx, 0 // any value but not the MAGIC VALUE
mov ecx, 10 // get VMWare version
mov edx, 'VX' // port number
in eax, dx // read port
// on return EAX returns the VERSION
cmp ebx, 'VMXh' // is it a reply from VMWare?
setz [rc] // set return value
pop ebx
pop ecx
pop edx
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
rc = false;
}
return rc;
}
int main()
{
if (IsInsideVMWare())
printf("yes");
else
printf("no");
return 0;
}