注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

vmware的检测  

2010-10-29 17:11:22|  分类: 个人备忘 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原文链接:

先说3种方法
代码:

#include <windows.h>
#include <stdio.h>

BOOL gInVMWARE, gInVirtualPC;

BOOL VMWareTest()
{
BYTE PortValue1,PortValue2;
__try
{
    __asm
    {
      pushad 
      pushfd
      xor ebx,ebx
      mov ecx,0xa 
      mov eax, 'VMXh'        ; EAX=magic    //564D5868
      mov dx, 'VX'            ; DX=magic
      in eax, dx            ; specially processed io cmd
      cmp ebx, 'VMXh'        ; also eax/ecx modified (maybe vmw/os ver?)
      sete al;
    movzx eax, al
      mov gInVMWARE, eax;
      popfd
      popad
    }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    gInVMWARE=FALSE;
}
return gInVMWARE;
}

BOOL VirtualPCTest()
{
__try
{
    __asm
    {
      pushad      
      mov ebx, 0 // Flag
      mov eax, 1 // VPC function number
      __emit 0Fh
      __emit 3Fh
      __emit 07h
      __emit 0Bh
      test ebx, ebx
    sete al
    movzx eax, al
      mov gInVirtualPC , eax;
      popad
    }

}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    gInVirtualPC=FALSE;
}
return gInVirtualPC;
}

BOOL VMTest()
{
    ULONG xdt = 0 ;
    ULONG InVM = 0;
    __asm
    {
        push edx
            sidt [esp-2]
            pop edx
            nop
            mov xdt , edx
    }
    printf("idt = %08x\n" , xdt);
    if (xdt > 0xd0000000)
    {
        //printf("IDT Test :running in vm!\n");
        InVM = 1;
    }
    else
    {
        InVM = 0;
    }
    __asm
    {
        push edx
            sgdt [esp-2]
            pop edx
            nop
            mov xdt , edx
    }
    
    printf("gdt = %08x\n" , xdt);
    
    if (xdt > 0xd0000000)
    {
        InVM += 1;
    }
    else
    {
        InVM += 0;
    }
    return InVM;
}

int main()
{
    if (VMWareTest())
    {
        printf("In Vmware !!!");
    }
    else if (VirtualPCTest())
    {
        printf("In VirtualPC!!!!");
    }
    else if (VMTest())
    {
        printf("In VM !");
    }
    else
    {
        printf("In Host!");
    }
    
    getchar ();
    return 1;
}

OK,这样VMWare里面基本都能检测到
检测虚拟机,一般来说有3种方法:
1,是猥琐法,比如系统中有没有vmware类似的服务,进程等,检查BIOS的信息,虚拟设备的名称等等,这种方法是很猥琐的,优点是防不胜防,缺点就是不准确,而且都能修改(注意:BIOS也是能修改的)。
2,是模拟漏洞法,由于虚拟机毕竟不是真机,模拟上面是有一定的漏洞的,上面的VMTest就是漏洞法。优点是准确,基本上100%可以确定,因为是模拟的漏洞,所以不容易修改,缺点基本上没有。
3,是后门法,虚拟机需要和host进行通讯,利用通讯检测虚拟机,如上面的那个VMWare.GetVersion的后门。优点是准确,缺点是可以屏蔽掉后门。
  评论这张
 
阅读(1241)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018