2020
10-06

VMware、ESXi等虚拟软件的反虚拟机检测技术方法探讨,VMware、ESXi等虚拟机检测与反检测

在开发测试中,不少人会选择使用虚拟机环境来进行,以避免对主机产生影响,特别是一些软件类测试,比如病毒分析等等。在实际测试中会发现,相当一部分软件或代码也在进行反虚拟机来逃避分析,这种技术可以检测自己是否运行在虚拟机中,如果探测到自己在虚拟机中运行,它就会执行与其本身行为不同的行为,这时候就无法达到我们测试的目的了。因此我们可以考虑通过修改配置来达到让虚拟机内运行的软件无法探测到虚拟机环境的目标。

VMware、ESXi等虚拟软件的反虚拟机检测技术方法探讨

探测方向

不管是通过 VMware 还是 Oracle VirtualBox 抑或是 Microsoft Hyper-V,只要是虚拟出来的环境,都或多或少会有痕迹存在,目前用来探测的比较多的痕迹有以下几个。

MAC 地址

这是最明显的特征。通常 MAC 地址的前三个字节标识一个提供商。以 00:05:69、00:0c:29 和00:50:56 开始的 MAC 地址与 VMware 相对应;以 00:03:ff 开始的 MAC 地址与 virtualpc 对应;以 08:00:27 开始的 MAC 地址与 VirtualBox 对应。

其他硬件信息

虚拟机环境中,主板序列号、主机型号、系统盘所在磁盘名称等硬件信息,以及这些硬件采用的驱动,通常都会带有 VMware、VirtualBox、VBOX、Virtual Machine 等字眼。

特定的进程信息

为方便使用,比如自动捕获鼠标、分辨率自适应等,我们会安装 VMware Tools 或者 VBoxGuestAdditions 等增强包,这也是虚拟机环境非常明显的一个特征。通过进程快照读取当前进程信息,查找是否存在虚拟机中特有的进程,如 VMware 中的 vmware.exe 和 VirtualBox 中的 VBoxService.exe。

特定的文件夹或文件信息

通过查找磁盘中是否存在特定的文件夹或文件,判断当前是否在虚拟机中。VMware 虚拟机中通常会有路径 C:\Program Files\VMware\VMware Tools\;VirtualBox 虚拟机中通常会有路径 C:\Program Files\Oracle\VirtualBox Guest Additions\。

特定的注册表信息

通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。针对 VMware 可以判断注册表项 HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe;针对 VirtualBox 可以判断注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions。当然,注册表中能被检测出的位置很多,这里只是举个例子。

特定的服务名

通过获取主机当前具有虚拟机特性的服务信息,判断当前主机是否为虚拟机。在 VMware 中通常会存在 VMware 物理磁盘助手服务和VMware Tools服务等;在 VirtualBox 中通常会存在VirtualBox Guest Additions Service服务等。

时间差

由于在虚拟机中,代码的运行速度通常不如真实主机。所以通过运行一段特定的代码来比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。

其他

上面说的几种方法都能够检测虚拟机,但检测的方法却不仅限于此,有兴趣的可以再深入研究。

反探测

近年来,随着虚拟化技术的使用不断增加,采用反虚拟机技术的软件数量逐渐下降,编写者已经开始意识到,目标主机是虚拟机,也并不意味着它就没有攻击价值,特别在于目前云计算产业正在如火如荼地发展中。

以 VMware 为例,我们可以通过下面的方法来解决上文探测方向中的大部分痕迹。由于修改信息可能会导致系统激活状态失效,或者修改后配置不生效,故建议在创建虚拟机时就修改好。

修改软件信息

VMTools 接口

直接将下面的代码贴到虚拟配置文件 .vmx 中(如果是 EXSi,建议通过 WEB 控制面板来修改配置),屏蔽 VMware 特定信息的探测:

isolation.tools.getPtrLocation.disable = "TRUE"
isolation.tools.setPtrLocation.disable = "TRUE"
isolation.tools.setVersion.disable = "TRUE"
isolation.tools.getVersion.disable = "TRUE"
monitor_control.disable_directexec = "TRUE"
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"
monitor_control.restrict_backdoor = "TRUE"

驱动信息

主要是显卡,可以采取先将驱动导出来,然后修改驱动中的安装文件 *.inf,将 STRING 一节中的相关字眼修改掉,再还原驱动。

DiskID = "NVIDIA Windows Driver Library Installation"
CompanyName = "NVIDIA"
SVGA = "GeForce GTX 660"

在这一步中,需要安装 VMware Tools 才会有显卡驱动,但是上面修改了配置,将无法安装 VMware Tools,会提示“只应安装在虚拟机内”。由于安装 VMware Tools 将会是一个非常明显的特征,因此不建议安装。且虚拟机驱动其实都是一样的,因此可以从其他虚拟机中导出来直接使用。

修改硬件信息

主板信息

下面的代码表示延用实体机的主板信息:

SMBIOS.reflecthost = "TRUE"
SMBIOS.noOEMStrings = "TRUE"
SMBIOS.addHostVendor = "TRUE"
hw.model.reflectHost = "TRUE"
serialNumber.reflectHost = "TRUE"
board-id.reflectHost = "TRUE"

也可以自己编一个,比如在黑苹果中会用到的:

smbios.reflectHost = "FALSE"
smbios.vendor = "Apple Computer, Inc."
smbios.version = "MBA51.88Z.0055.B08.0610121"
smbios.family ="MacBook Pro"
smbios.model = "MacBookPro1.1"
smbios.date ="10/12/06"
smbios.manufacturer = "Apple Computer, Inc."
smbios.systemversion = "1.0"

磁盘信息

如果在 scsi0 插槽上有 SCSI 虚拟磁盘作为系统驱动器,可以添加:

scsi0:0.productID = "WDC_____WD10EZEX-57WN4D11"
scsi0:0.vendorID = "WDC"

scsi0:0 表示第一个插槽,其他硬件也可以类似指定 ID。

网卡信息

参考实体机 MAC 地址信息,自行编一个:

ethernet0.checkMACAddress = "FALSE"
ethernet0.address = "BC:30:5B:DD:D2:E8"

以上的方法能够解决大部分的虚拟机探测,但是一些使用寄存器值、任务状态段(Task Status Segment, TSS)、I/O 接口等检测方法的软件,仍然骗不过。

如果您通过本站解决了一些问题,并希望本站能够很好的发展下去,动动手指即可帮助我们。

如无特殊说明,解压密码均为:aisoa.cn

您可能感兴趣的文章

支付宝打赏支付宝打赏微信打赏微信打赏