程序检测自身是否运行在虚拟机下

来自: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值