网络靶场实战-网络对抗之反虚拟机技术

背景:

    恶意代码和游戏外挂的作者为了逃避技术人员对他们的程序进行分析,经常使用反虚拟机技术,这种技术可以检测自己是否运行在虚拟机中,如果发现自己在虚拟机中运行那么恶意程序就不会执行恶意代码,或者游戏外挂就会直接退出进程。甚至在HW行动中的入侵诱捕对抗中也会应用到,这篇文章可以让我们了解反虚拟机技术,知道他是怎样一个原理,就可以做出破防的方法。

VMware痕迹检测

根据进程信息

在任务管理器中的进程列表可以看到vmtoolsd、vmacthlp、VGAuthService与Vmware有关的程序正在运行

BOOL CheckVMWare() {     DWORD ret = 0;     PROCESSENTRY32 pe32;     pe32.dwSize =sizeof(pe32);      HANDLE hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);      if(hProcessSnap ==INVALID_HANDLE_VALUE)      {          return FALSE;      }     BOOL bMore =Process32First(hProcessSnap, &pe32);      while(bMore)     {         if (strcmp(pe32.szExeFile,"vmware.exe")==0)         {             return TRUE;         }         bMore =Process32Next(hProcessSnap, &pe32);      }    CloseHandle(hProcessSnap);      return FALSE; }

还可以通过“net start|findstr VMware”命令来进行搜索与VMware的相关证据。

根据注册表信息

通过读取主机具有虚拟机特性的注册表来判断是否处于虚拟机环境中。

可以在“HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe”进行查看。

BOOL CheckVMWare() {       HKEY hkey;       if (RegOpenKey(HKEY_CLASSES_ROOT,"\\Applications\\VMwareHostOpen.exe", &hkey) ==ERROR_SUCCESS)       {           return TRUE;       }       else       {           return FALSE;       } }

根据MAC信息

通常MAC地址的前三个字节标识一个提供商

00:05:69、00:0c:29和00:50:56开始的MAC地址与VMware相对应。

BOOL CheckVMWare() {     string mac;     get_mac(mac);     if(mac=="00-05-69" || mac=="00-0c-29" ||mac=="00-50-56")     {         return TRUE;     }     else     {         return FALSE;     } }

根据特定的文件夹

通过查找磁盘中是否存在特定的文件夹或者文件来判断当前是否在虚拟机环境中。

在”C:\Program Files\VMware\VMwareTools\”路径下通常会有下图的文件。

BOOL CheckVMware() {     if(PathIsDirectory("C:\\Program Files\\VMware\\VMware Tools\\") ==0)     {         return FALSE;     }     else     {         return TRUE;     } }

根据特定服务名

通过获取当前主机的服务信息来判断当前主机是否为虚拟机。

在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等。

通过获取当前主机的服务信息来判断当前主机是否为虚拟机。

在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等。

BOOL CheckVMWare() {     int menu = 0;       //打开系统服务控制器       SC_HANDLE SCMan =OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);      if(SCMan == NULL)       {         cout <<GetLastError() << endl;        printf("OpenSCManager Eorror/n");           return -1;       }       //保存系统服务的结构     LPENUM_SERVICE_STATUSAservice_status;        DWORD cbBytesNeeded =NULL;        DWORD ServicesReturned =NULL;       DWORD ResumeHandle =NULL;       service_status =(LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);       //获取系统服务的简单信息       bool ESS =EnumServicesStatusA(SCMan, //系统服务句柄           SERVICE_WIN32, //服务的类型          SERVICE_STATE_ALL,  //服务的状态          (LPENUM_SERVICE_STATUSA)service_status, //输出参数,系统服务的结构           1024 * 64,  //结构的大小           &cbBytesNeeded,//输出参数,接收返回所需的服务           &ServicesReturned,//输出参数,接收返回服务的数量           &ResumeHandle);//输入输出参数,第一次调用必须为0,返回为0代表成功       if(ESS == NULL)        {          printf("EnumServicesStatus Eorror/n");           return -1;       }       for(int i = 0; i < ServicesReturned;i++)       {           if(strstr(service_status[i].lpDisplayName, "VMware Tools")!=NULL ||strstr(service_status[i].lpDisplayName, "VMware 物理磁盘助手服务")!=NULL)         {             return TRUE;         }     }       //关闭服务管理器的句柄     CloseServiceHandle(SCMan);      return FALSE; }

查找漏洞指令

虚拟机监视器VMM(Virtual Machine Monitor)是一个运行在宿主机系统,用来监视虚拟机状态的监视器。VMM为客户及操作系统提供一个完整的虚拟平台。但是VMM也存在一些可以被恶意代码探测到虚拟化的安全缺陷。

NO Pill反虚拟机

使用sgdt和sldt指令探测VMware的技术通常被称为No Pill。

BOOL CheckVMWare() {     ULONG xdt = 0 ;     ULONG InVM = 0;     __asm     {         push edx         sidt [esp-2]         pop edx         nop         mov xdt , edx     }     if (xdt >0xd0000000)     {           InVM = 1;     }     else     {         InVM = 0;     }     __asm     {         push edx         sgdt [esp-2]         pop edx         nop         mov xdt , edx     }     if (xdt >0xd0000000)     {         InVM += 1;     }     if (InVM == 0)     {         return FALSE;     }     else     {         return TRUE;     } }

查询I/O端口

VMware使用虚拟化的I/O端口完成宿主系统与虚拟机之间的通信,以便支持诸如复制和粘贴功能。这个端口可以被查询,然后与一个神秘数比较,以确定VMware的使用

BOOL CheckVMWare() {     bool rc = true;     __try     {         __asm         {             push   edx             push   ecx             push   ebx               mov    eax, 'VMXh'             mov    ebx, 0               mov    ecx, 10              mov    edx, 'VX'             in     eax, dx              cmp    ebx, 'VMXh'              setz   [rc]              pop    ebx             pop    ecx             pop    edx         }     }    __except(EXCEPTION_EXECUTE_HANDLER)       {         rc = false;     }     return rc; }

使用STR指令

STR(Store task register)指令是用于将任务寄存器 (TR) 中的段选择器存储到目标操作数,目标操作数可以是通用寄存器或内存位置,使用此指令存储的段选择器指向当前正在运行的任务的任务状态段 (TSS)。在虚拟机和真实主机之中,通过STR读取的地址是不同的,当地址等于0x0040xxxx时,说明处于虚拟机中,否则为真实主机。

BOOL CheckVMWare() {     unsigned char mem[4] ={0};     __asm str mem;     if ((mem[0] == 0x00)&& (mem[1] == 0x40))     {         return TRUE;     }     else     {         return FALSE;     } }

总结:

    对抗反虚拟机技术也是多种多样比如修改Vmware的.vmx文件就可以减轻虚拟机被检测的可能;修改跳转指令等等。在文章的最后最后介绍一种对抗反虚拟机技术,方法很多,仅给各位提供一个参考。

在虚拟机文件中找到下图的文件,之后用记事本打开,输入以下代码即可缓解反虚拟机效果。

isolation.tools.getPtrLocation.disable = "TRUE" //禁止获取父进程isolation.tools.setPtrLocation.disable = "TRUE" //禁止获取虚拟机状态isolation.tools.setVersion.disable = "TRUE" isolation.tools.getVersion.disable = "TRUE" //前四条指令主要是使运行在Guest系统中的VMware Tools不能获取宿主系统的信息。monitor_control.disable_directexec = "TRUE" //开启3D加速monitor_control.disable_chksimd = "TRUE" //下面都是关于性能优化的设置monitor_control.disable_ntreloc = "TRUE" monitor_control.disable_selfmod = "TRUE" monitor_control.disable_reloc = "TRUE" monitor_control.disable_btinout = "TRUE" monitor_control.disable_btmemspace = "TRUE" monitor_control.disable_btpriv = "TRUE" monitor_control.disable_btseg = "TRUE" 

蛇矛实验室成立于2020年,团队核心成员均由从事安全行业10余年经验的安全专家组成,团队涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域方向。蛇矛实验室致力于安全研究、攻防解决方案以及靶场仿真复现等相关方向,曾多次参与国家级、省级护网行动,具备充足的一线应急响应、漏洞挖掘、渗透测试、安全加固、攻击追溯、漏洞复现、实网攻防、靶场场景复现等能力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛇矛实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值