遇见你我该如何逃避你——反虚拟机技术概述

遇见你,我该如何逃避你?实际上我并想认识你。

“恶意代码”是一个非常神秘的人,他最不想的就是被别人发现和了解,而“调试”和“虚拟机”是“恶意代码”最不喜欢的俩个人,因为他们总是能认出“恶意代码”,并且还可以走进他的内心,了解“恶意代码”行为的原因。

“恶意代码”不想他们俩个人认出来,所以就想,遇见他们该如何躲开他们,保护自己神秘的形象,基于这些原因,他练出了自己逃避方法——反虚拟机技术。

他的作战计划是这个样子的:
如果“恶意代码”检测到自己遇见了“虚拟机”(在虚拟机里运行),他就会装作自己不是恶意代码,例如去执行其他行为啊,或者干脆就不动了,停止运行。
这个计划确实也有效果,“虚拟机”更难以去分析“恶意代码”了。

“恶意代码”和“虚拟机”的爱恨情仇,躲躲藏藏一直很精彩,可惜“虚拟机”同样有着最普通主机的弱点,这意味着他也有被“恶意代码”攻击的意义。同时随着虚拟化技术的发展,“虚拟机”更是垂垂老矣,出战的机会更加少了。但之前和“恶意代码”的故事还是非常精彩的,下面介绍相关的反虚拟机技术。

一、虚拟机的痕迹

“恶意代码”善于隐藏,“虚拟机”善于发现他,但是“虚拟机”却不善于隐藏自己,因此经常被“恶意代码”发现,从而失去机会。

1.MAC地址:
虚拟网卡MAC地址的配置,前三个字节一般为00:0C:29,一般情况下,可以查看虚拟网卡的MAC地址是否在WMware属性范围内。
2.基于主板序列号、主机型号、系统盘所在磁盘名称等其他硬件信息
一般这些信息中包含虚拟机的信息。
3.根据当前进程信息
当进程中是否有Vmware的进程VMwareService.exe、VMwareTray.exe和VMwareUser、exe。
4.特定的文件夹或文件信息
通过查找磁盘中是否存在特定的文件夹或文件,判断当前是否在虚拟机中。VMware虚拟机中通常会有路径C:\ProgramFiles\VMware\VMware Tools\;VirtualBox 虚拟机中通常会有路径 C:\Program
Files\Oracle\VirtualBox Guest Additions\。
5.注册表痕迹
通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。针对VMware可以判断注册表项HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe;针对VirtualBox可以判断注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBoxGuest Additions。当然,注册表中能被检测出的位置很多,这里只是举个例子。
6.根据特定服务名
通过获取主机当前具有VMware特性的服务信息,判断当前主机是否为虚拟机。在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等;在VirtualBox中通常会存在VirtualBox Guest Additions Service服务等。
7.根据时间差
由于在虚拟机中,代码的运行速度通常不如真实主机。所以恶意代码通过运行一段特定的代码来比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。

二、查找漏洞指令

“虚拟机”本身存在非常多的弱点(漏洞),这些弱点常常被“恶意代码利用”。

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

在内核模式下,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的使用。
2.No Pill技术
sgdt与sldt指令探测VMware的技术通常被称为No Pill。No Pill依赖于LDT结构由处理器分配,而不是由操作系统分配这个事实。
3.查询IO通信端口
当前最流行的VMware技术当属查询IO通信端口。
VMware使用虚拟化IO端口完成宿主系统与虚拟机之间的通信,以便支持诸如复制和粘贴功能。这个端口可以被查询,然后与一个神秘数进行比较,以便确认VMware的使用。
4.使用str指令
str指令用来从任务起存其中检索段选择子,段选择子指向当前运行任务的任务状态段(TSS)。
恶意代码使用str指令探测虚拟机的存在,因为这条指令返回的值,在虚拟机系统和宿主系统中可能不同。
5.反虚拟机的x86指令
sidt、sgdt、sldt、smsw、str、in(第二个操作数被设置为VX)、cpuid
6.在IDA Pro中高亮显示反虚拟机代码

7.使用ScoopyNG
一种免费的VMware探测工具。

三、调整设置

挫败VMware探测技术:修补代码、卸载VMware Tools、修补VMware设置,以及使用多处理器机器。
VMware的.vmx文件中的未文档化选项被用来战胜反虚拟机技术。

四、虚拟机逃逸

VMware等软件中或多或少都存在一些安全漏洞,可以利用这些漏洞使宿主操作系统崩溃或者是在宿主操作系统中运行代码。当主机系统被感染后,一些公开可用的工具可以用来对VMware等软件进行攻击。

总结:
以上都是对于反虚拟机的技术大概介绍,可以让我们对反虚拟机技术有一个大概的了解,知道有哪些反虚拟机技术,但是要想深入还得去看看每一技术的原理和实现。

参考资料:
《恶意代码分析实战》

发布了24 篇原创文章 · 获赞 27 · 访问量 1369

猜你喜欢

转载自blog.csdn.net/weixin_43742894/article/details/105281435