• 使用这种技术探测自己是否运行在虚拟机中
  • 主要是早期用于捕获恶意软件的蜜罐使用虚拟机,而恶意软件攻击的目标通常是用户机器
  • 近年来,随着虚拟化技术的使用不断增加,采用反虚拟机技术的恶意代码数量逐渐下降 。恶意代码编写者已经意识到目标主机是虚拟机,也不意味着没有攻击价值

17.1 VMware痕迹

  • 通过存在于操作系统的文件系统、注册表、进程与服务列表中的标记痕迹探测VMware虚拟环境的存在
  • 恶意代码在进程列表中搜索带VMware字符串的进程
    • 会发现VMware Tools中VMwareService.exe、VMwareTray.exe和VMwareUser.exe
  • 恶意代码通过搜索注册表中安装的服务识别VMwareService.exe
  • 恶意代码通过查看VMware安装目录,通过在虚拟机注册表中快速搜索VMware字符串,能找到虚拟机硬盘驱动器、网络适配器和虚拟鼠标等
  • 通过虚拟机的网络连接痕迹
    • 根据虚拟网卡MAC地址的配置可以识别出VMware虚拟机,通常,以00:0C:29开始的MAC地址与VMware相对应
  • 卸载VMware Tools或停止VMware Tools服务(net stop)是最常见的消除VMware 痕迹的方法
  • 当在恶意代码中发现与VMware相关的字符串时, 如VMware、VMwareTray.exe,说明恶意代码可能 正在尝试搜索VMware痕迹。
  • 绕过VMware痕迹的探测
    • 方法
    1. 定位恶意代码中查询VMware标记痕迹的代码位置
      • string命令,查找恶意代码中包含vmwarexxx字符串的位置以及字符串交叉引用
        17.1.jpg
        17.2.jpg
    2. 修改查询代码
    • 绕过探测的方法
      • 在调试过程中修补二进制代码,使0x4010a5处的跳转永远不会被执行。
      • 使用十六进制编辑器,将字符串VMwareTray.exe 修改为XXXareTray.exe,就可以让比较函数返回不 匹配。
      • 卸载VMware Tools,使得VMwareTray.exe服务不再运行。
  • 探测内存痕迹
    • VMware在内存中留下很多痕迹,一些关键的处理器结构被移动或被修改,留下可识别的指纹
    • 搜索整个物理内存中含有VMware的字符串

17.2 查找漏洞指令

  • 虚拟机监视器(VMM)监视虚拟机的运行,运行在宿主操作系统,为客户机操作系统提供一个完整的虚拟平台
  • 内核模式下,vmware使用二进制翻译技术进行指令的模拟,不再物理处理器上运行,为了避免全指令模拟造成的性能损失,VMware允许一些特定指令在没有正确虚拟化的前提下运行,意味着这些指令序列在虚拟机和在物理机运行时返回不同的结果
  • 典型的不同结果:关键的结构和表加载的位置于真实系统不同
    • IDT:中断描述符表
    • GDT:全局..
    • LDT:局部…
  • 常用探测指令(x86下能运行在用户态)
    • Sidt:获取IDT(中断描述表)地址
    • Sgdt:获取GDT(全局描述表)地址
    • Sldt:获取LDT(局部描述表)地址
    • Str:将任务寄存器(TR)中的段选择器存储到目标操作数
    • In:从一个指定的端口复制数据到指定的内存地址
    • Cpuid:获取CPU详细信息
  • 使用Red Pill反虚拟机技术
    • Red Pill是一种反虚拟机技术,通过运行sidt指令获取IDTR 寄存器的值。防止与宿主系统的IDTR冲突,虚拟机需要重新定位系统的IDTR,靠 IDTR的不同,来判定是否运行在虚拟机中
    • VMware中的IDTR地址通常位于0xFFXXXXXXXX,Virtual PC通常位于 0xE8XXXXXXXX,而真实主机上通常位于0x80XXXXXXXX
    • 解决方法:
      • 仅在单处理器的机器上有效,因为每一个处理器都有一个IDT,可以将虚拟机运行在多核处理器上
      • 用NOP替换sidt
  • 使用No Pill技术
    • 原理:Sgdt和sldt指令探测VMware称为No Pill。正常情况下,Windows不会使用LDT结 构,但VMware为LDT提供了虚拟化支持。
    • 当LDT基址位于0x0000(只有两字节)时 为真实主机,非零值时为虚拟机
    • 当GDT基址位于0xFFXXXXXX时说明处于 虚拟机中,否则为真实主机
  • 查询I/O通信端口
    • 原理:VMware使用虚拟化I/O端口,以便支持复制和粘贴功能
    • 实现:VMware会监视in指令的执行,并捕获目的 通信通道端口为0x5668(VX) 的I/O。VMware会检查 第二个操作数是否为VX,在这种情况发生时,EAX 寄存器载入的值是 0x564D5868(VMXh),ECX寄存 器中载入的值是要执行操作的值。值0xA表示 “get VMware version type”;0x14代表“get the memory size”,它们都可以被用来探测Vmware。
      17.6.jpg
    • 修补:用NOP替代in或修补条件跳转
  • 使用str指令
    • 原理:在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选 择器将会被存储在任务寄存器中。STR指令 是用于将任务寄存器 (TR) 中的段选择器存储到目标操作数。在虚拟机和真实主机之 中,通过STR读取的地址是不同的
    • 实现:当STR读取的地址等于0x0040xxxx时, 说明处于虚拟机中,否则为真实主机
  • 反虚拟机的x86指令
    • 恶意代码实现反虚拟机常用的指令
      -sidt、sgdt、sldt、smsw、str、in、cupid
    • 如果你在用户态模式的代码中看到上述指令, 很有可能是反VMware代码的一部分

17.3 调整设置

  • 挫败VMware探测的技术
    • 修补代码、卸载VMware Tools、修改VMware设置、使用多核处理器
  • 通过修改VMware配置减轻反虚拟机技术的探测
    17.3.jpg

17.4 虚拟机逃逸

  • 利用VMware的漏洞,使宿主操作系统崩溃或是在宿主操作系统中运行代码
  • 例如:VMware Tools中拖放文件夹功能、共享文件夹功能、共享工具
  • VMware虚拟机显示函数,“Cloudburst”

17.5 小结

  • 在使用反汇编分析不能运行的恶意代码之前,应该考虑卸载vmtools或者换一个虚拟环境运行或者在物理主机运行
  • 一个代码在条件跳转处过早终止,可能是反虚拟机技术造成的结果