vmware的检测与反检测

简介: 先说3种方法代码:#include #include BOOL gInVMWARE, gInVirtualPC;BOOL VMWareTest(){BYTE PortValue1,PortValue2;_...
先说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的后门。优点是准确,缺点是可以屏蔽掉后门。

所以,一般来说都是用后门法,高级一点用模拟漏洞。

随着硬件虚拟化技术的迅猛发展,模拟的漏洞越来越少,开了VT功能后,使用VMWare 6.0以上基本上灭掉了所有模拟的漏洞,后门法,patch一下主程序和guest的tools。

下面图是我修改过的开了VT-x的VMWare,用上面的代码是检测不出来的



注意红框,如果修改配置文件屏蔽后门,vmware tools是无法启动的。我这里是Patch了Vmware tools和vmware-vmx.exe的主程序实现的,后来想想,还是避不开猥琐的校验。。

能过99%的anti vmware,主要还是靠VT技术,实在太强大了。

由于某些原因,上面的模拟漏洞我只贴了MJ0011的代码,还有几个漏洞(暂时不公开写出来,当然无法对付VMWare的)可以对付其他几款虚拟机,比如VBox(开了VT也被检测)。
目录
相关文章
|
开发工具 虚拟化 存储
使用VMware VSphere WebService SDK进行开发 (六)——检测告警信息
获取告警信息相对而言比较简单点,这里先陈述告警信息的pojo类,作为存储告警信息的源头(省略getter和setter方法): public class AlarmItem { //对象 private String ObjectName; //状态 private Manag...
1468 0
|
19天前
|
Unix Linux 虚拟化
虚拟机VMware知识积累
虚拟机VMware知识积累
|
2月前
|
算法 虚拟化 C++
VMware虚拟机无法自适应和拖拽复制粘贴和共享目录问题
VMware虚拟机无法自适应和拖拽复制粘贴和共享目录问题
259 0
|
2月前
|
存储 SQL 数据挖掘
服务器数据恢复—误删除VMware虚拟机vmdk文件的数据恢复案例
服务器数据恢复环境: 某大厂PS4000服务器,服务器上部署VMware ESXi虚拟化平台。 服务器故障: 机房断电,重启后服务器中的某台虚拟机不能正常启动。管理员查看虚拟机配置文件,发现无法启动的虚拟机的配置文件除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还存在。联系VMware原厂工程师进行诊断,VMware原厂工程师尝试新建一个虚拟机,但发现存储空间不足,于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除了。VMware工程师重新建了一个虚拟机,分配了固定大小的虚拟磁盘,为虚拟机安装了Window
服务器数据恢复—误删除VMware虚拟机vmdk文件的数据恢复案例
|
28天前
|
存储 IDE 开发工具
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
|
29天前
|
虚拟化 UED
vmware-17虚拟机安装教程(保姆级,包含图文讲解,不需注册账户)
vmware-17虚拟机安装教程(保姆级,包含图文讲解,不需注册账户)
|
12天前
|
Linux 虚拟化
部署04-ncpa.cpl 虚拟机介绍,什么是虚拟机,怎样使用虚拟机,安装VMWARE,WorkStation,VMWARE这款软件是收费软件,可以在一个月期间进行使用,成功看VMWARE高级网络设置
部署04-ncpa.cpl 虚拟机介绍,什么是虚拟机,怎样使用虚拟机,安装VMWARE,WorkStation,VMWARE这款软件是收费软件,可以在一个月期间进行使用,成功看VMWARE高级网络设置
|
1月前
|
Linux 调度 虚拟化
Linux系统——初识Linux、虚拟机介绍、VMware WorkStation安装、在VMware上安装Linux
Linux系统——初识Linux、虚拟机介绍、VMware WorkStation安装、在VMware上安装Linux
74 4
|
2月前
|
Shell Linux 开发工具
Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
在Linux主机上,以`root`用户停止NetworkManager服务并重启网络: ```shell systemctl stop NetworkManager systemctl restart network ``` 或修改网卡配置文件`ifcfg-ens33`,添加`NM_CONTROLLED=&quot;no&quot;`,然后重启`network`服务: ```shell vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network ```
|
2月前
|
程序员 Linux KVM
【qemu虚拟化】将img镜像文件转换为VMware虚拟机
QEMU是一个开源的硬件虚拟化器,能在多种平台如x86、ARM、PowerPC上运行,支持虚拟化不同体系结构的操作系统。它具有硬件仿真、虚拟化支持、磁盘和网络仿真、快照回滚及可扩展性等特点。要使用QEMU,首先从[官网](https://www.qemu.org/download/)下载,然后通过命令行运行进行转换。转换后的vMDK文件可在VMware中导入,创建新的虚拟机进行使用。
971 1
【qemu虚拟化】将img镜像文件转换为VMware虚拟机