0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

反虚拟机技术合集3

jf_78858299 来源:看雪社区 作者:houjingyi 2023-02-14 13:45 次阅读

二、查找漏洞指令

虚拟机监视器监视虚拟机的运行,它运行在宿主操作系统,并为客户机操作系统提供一个完整的虚拟平台。与此同时,虚拟机监视器也存在一些可以被恶意代码探测到虚拟化的安全缺陷。

在内核模式下,VMware使用二进制翻译技术进行指令的模拟。运行于内核态的某些特权指令被解释和模拟,所以它们不在物理处理器上运行。

相反,在用户模式下,代码直接在处理器上运行,几乎所有与硬件交互的指令,要么是特权指令,要么会产生内核态陷阱指令或中断指令。

VMware截获所有中断并处理它们,以便虚拟机仍然认为这是一个正常机器。然而在x86体系结构中,一些指令在获取硬件相关的信息时并不产生异常,如sidt、sgdt、sldt、cpuid等等。为了正确虚拟这些指令,VMware需要在所有指令上进行二进制翻译,因此造成巨大的性能损失。

为了避免执行全指令模拟造成的巨大性能损失,VMware允许一些特定指令在没有正确虚拟化的前提下运行。最终,这意味着某些指令序列在VMware虚拟机而不是在物理机中运行时返回不同的结果。处理器使用某些关键的结构与表,它们会被加载与真实系统不同的偏移量,而这正是未进行全虚拟化的副作用。

中断描述表(IDT)是CPU内部的一个数据结构,操作系统使用它来确保正确响应中断和异常。在x86体系结构下,所有的内存获取,或是通过全局描述表(GDT)获得,或是通过本地描述表(LDT)获得。这些表中包含段描述符,它们提供每一个段的详细存取信息,其中包含段基地址类型、长度,以及存取权限等等。

IDT、GDT和LDT是CPU内部的寄存器,它们分别存放着各自表的基地址和大小。有三条敏感指令(sidt、sgdt和sldt)可以读取这些表的位置,并且将相应的寄存器存入内存地址。因为这些指令可以随时被用户态代码调用,且不会产生陷阱,也未被VMware正确虚拟化,所以这些异常都可能被用来探测VMware的存在。

1.使用Red Pill反虚拟机技术

Red Pill通过运行sidt指令获取IDTR寄存器的值。虚拟机监视器必须重新定位Guest系统的IDTR,来避免与Host系统的IDTR冲突。因为在虚拟机中运行sidt指令时,虚拟机监视器不会得到通知,所以会返回虚拟机的IDTR。

Red Pill通过测试这种差异来探测Vmware的使用。这种方法存在一个缺陷,由于IDT的值只针对处于正在运行的处理器而言,在单CPU中它是个常量,但当它处于多CPU时就可能会受到影响了,因为每个CPU都有其自己的IDT,这样问题就自然而然的产生了。

针对此问题,Offensive Computing组织成员提出了两种应对方法:

其中一种方法就是利用Red Pill反复地在系统上循环执行任务,以此构造出一张当前系统的IDT值变化统计图,但这会增加CPU负担;

另一种方法就是windows API函数SetThreadAffinityMask()将线程限制在单处理器上执行,当执行此测试时只能准确地将线程执行环境限制在本地处理器,而对于将线程限制在VM处理器上就可能行不通了,因为VM是计划在各处理器上运行的,VM线程在不同的处理器上执行时,IDT值将会发生变化,因此此方法也很少被使用。

2.使用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;  
   }  
}

通过禁用VMware加速可以防止No Pill技术的探测。

3.查询I/O端口

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

这种技术成功的关键在于x86体系结构中的in指令,它从一个源操作数指定的端口复制数据到目的操作数指定的内存地址。VMware会监视in指令的执行,并捕获目的通信端口为0x5668(VX)的I/O。

VMware会检查第二个操作数是否是VX,在这种情况发生时,EAX寄存器载入的值是0x564D5868(VMXh),ECX寄存器必须被载入你希望在端口上执行相应操作的值,值0xA表示 get VMware version type,0x14代表 get the memory size。

它们都可以被用来探测VMware,但0xA更受欢迎,因为它能确定VMware的版本。如代码所示setz指令在magic数与VMXh匹配时设置返回值rc为1,如果在真实的机器上运行会触发EXCEPTION_EXECUTE_HANDLER 异常,在异常处理中设置返回值rc为0。

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;  
}

对付这种反虚拟化技术的最简单方法是使用NOP指令替换in指令,或修补条件跳转,使得它不论比较结果如何,都执行到未探测到虚拟机的程序分支。

4.使用str指令

在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选择器将会被存储在任务寄存器中,TSS中包含有当前任务的可执行环境状态,包括通用寄存器状态、段寄存器状态、标志寄存器状态、EIP寄存器状态等等,当此项任务再次被执行时,处理器就会其原先保存的任务状态。

每项任务均有其自己的TSS,而我们可以通过STR指令来获取指向当前任务中TSS的段选择器。这里STR指令是用于将任务寄存器(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;  
   }  
}

在IDA PRO中,可以使用下面的脚本查找我们前面提到的指令。

from idautils import *  
from idc import *  
 
heads = Heads(SegStart(ScreenEA()), SegEnd(ScreenEA()))  
antiVM = []  
for i in heads:  
   if (GetMnem(i) == "sidt" or GetMnem(i) == "sgdt" or GetMnem(i) == "sldt" or GetMnem(i) == "smsw" or GetMnem(i) == "str" or GetMnem(i) == "in" or GetMnem(i) == "cpuid"):  
       antiVM.append(i)  
 
print "Number of potential Anti-VM instructions: %d" % (len(antiVM))  
 
for i in antiVM:  
   SetColor(i, CIC_ITEM, 0x0000ff)  
   Message("Anti-VM: %08x\\n" % i)

要在IDA PRO中运行脚本,选择File->Script File,可以看到下面的输出。

图片

这个输出表明脚本检测到了三条漏洞指令类型。滚动到IDA PRO的反汇编窗口,我们看到三条红色高亮显示的指令sidt、str和sldt。

5.使用无效的操作码

每台机器都有一组定义的指令,通常称为指令集架构(Instruction Set Architecture)。

当遇到无效指令(不存在于ISA中)时,机器引发无效操作码异常。软件可以处理异常(使用通常的try/catch机制),也可以让操作系统处理异常,或者在最坏的情况下崩溃机器。

VirtualPC使用一堆无效指令来允许虚拟机和VirtualPC之间连接。当VirtualPC的虚拟机想要与VirtualPC通信时,程序设置异常处理程序(try/catch块),在调用VM软件之前设置所需的参数,发出特殊的无效操作码指令。

VM软件将识别此无效操作码并相应地操作,如果VirtualPC存在则不引起异常,并且如果VirtualPC不存在则产生异常。

最后,程序的catch块将处理异常并检查返回的VM软件的参数。总之,VirtualPC使用无效的操作码机制作为后门。

DWORD IslnsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)  
{  
   PCONTEXT ctx=ep->ContextRecord;  
   ctx->Ebx = -1; //未运行在VPC中  
   ctx->Eip += 4; //跳过”call VPC”操作  
   return EXCEPTION_CONTINUE_EXECUTION;  
}
BOOL CheckVirtualPC()  
{  
   bool rc = TRUE;  
   __try  
   {  
       __asm  
       {  
           push ebx  
           mov ebx, 0  
           mov eax, 1  
           __emit 0fh  
           __emit 3fh  
           __emit 07h  
           __emit 0bh  
           test ebx, ebx  
           setz[rc]  
           pop ebx  
       }  
   }  
   __except(IslnsideVPC_exceptionFilter(GetExceptionInformation()))  
   {  
       rc = FALSE;  
   }  
   return rc;  
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Mac
    Mac
    +关注

    关注

    0

    文章

    1104

    浏览量

    51458
  • 恶意代码
    +关注

    关注

    0

    文章

    12

    浏览量

    7634
  • 虚拟机
    +关注

    关注

    1

    文章

    914

    浏览量

    28160
收藏 人收藏

    评论

    相关推荐

    什么是虚拟机虚拟机真的那么好用吗?

    在日新月异的科技世界中,虚拟技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、系统测试和云
    的头像 发表于 07-06 08:05 463次阅读
    什么是<b class='flag-5'>虚拟机</b>?<b class='flag-5'>虚拟机</b>真的那么好用吗?

    有关虚拟机虚拟技术的几点诠注

    虚拟机虚拟技术给计算机应用注入了新的研究与开发点,同时也存在诸多不利因素。本文综述了虚拟机虚拟
    发表于 06-22 18:04 36次下载

    虚拟机虚拟技术

    虚拟机虚拟技术给计算机应用注入了新的研究与开发点,同时也存在诸多不利因素。本文综述了虚拟机虚拟
    发表于 09-07 10:15 13次下载

    基于虚拟机技术的DSC仿真系统设计

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 12-03 17:26 26次下载
    基于<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b>的DSC仿真系统设计

    基于虚拟机技术的DCS仿真系统设计与实现

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 01-16 15:04 2178次阅读
    基于<b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b>的DCS仿真系统设计与实现

    虚拟机:QEMU虚拟机和主机无线网络通讯设置

    虚拟机:QEMU虚拟机和主机无线网络通讯设置
    的头像 发表于 06-22 10:19 5442次阅读
    <b class='flag-5'>虚拟机</b>:QEMU<b class='flag-5'>虚拟机</b>和主机无线网络通讯设置

    KVM虚拟机管理和基本使用

    KVM — 全称是基于内核的虚拟机(Kernel-based Virtual Machine)是一个开源软件,基于内核的虚拟技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用
    的头像 发表于 02-07 09:20 1283次阅读

    虚拟机技术合集1

    恶意代码编写者经常使用虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在
    的头像 发表于 02-14 13:45 1261次阅读

    虚拟机技术合集2

    恶意代码编写者经常使用虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在
    的头像 发表于 02-14 13:45 677次阅读
    <b class='flag-5'>反</b><b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b><b class='flag-5'>合集</b>2

    虚拟机技术合集4

    恶意代码编写者经常使用虚拟机技术逃避分析,这种技术可以检测自己是否运行在虚拟机中。如果恶意代码探测到自己在
    的头像 发表于 02-14 13:46 1026次阅读
    <b class='flag-5'>反</b><b class='flag-5'>虚拟机</b><b class='flag-5'>技术</b><b class='flag-5'>合集</b>4

    linux虚拟机使用教程

    引言:Linux虚拟机是一种方便且常用的技术,它允许用户在现有操作系统的基础上创建和运行另一个独立的操作系统。在本篇文章中,我们将提供一份详尽的教程,帮助你了解如何安装、配置和使用Linux虚拟机
    的头像 发表于 11-17 10:06 1267次阅读

    Docker与虚拟机的区别

    Docker和虚拟机是两种不同的虚拟技术,它们在实现方式、资源消耗、运行性能等方面存在许多差异。本文将会详细介绍它们的区别。 一、实现方式 1.1 虚拟机
    的头像 发表于 11-23 09:37 9762次阅读

    怎么安装linux虚拟机

    在计算机领域,虚拟机是一种软件程序,它允许在主操作系统上运行多个虚拟操作系统。Linux虚拟机在开发、测试和学习等环境中得到广泛应用。本文将详细介绍如何安装Linux虚拟机,并提供一个
    的头像 发表于 11-23 10:50 1092次阅读

    虚拟机ubuntu怎么联网

    虚拟机ubuntu怎么联网  虚拟机(Virtual Machine)是运行在物理(Host Machine)上的虚拟操作系统环境。在虚拟机
    的头像 发表于 12-27 16:51 976次阅读

    虚拟机数据恢复—KVM虚拟机被误删除的数据恢复案例

    :EXT4 主要数据:MySQL数据库 虚拟机2:备份数据库服务器 虚拟磁盘:系统盘(qcow2)+数据盘(raw) 文件系统:EXT4 主要数据:MySQL数据库 虚拟机
    的头像 发表于 08-07 13:33 448次阅读
    <b class='flag-5'>虚拟机</b>数据恢复—KVM<b class='flag-5'>虚拟机</b>被误删除的数据恢复案例