学习笔记-第十七章 恶意代码分析实战

第十七章 反虚拟机技术

恶意代码编写者经常使用反虚拟机技术逃避分析,恶意代码可以使用这种技术探测自己
是否运行在虚拟机中。如果恶意代码探测到自己运行在虚拟机中运行,它会执行与其本
身行为不同的行为,其中更简单的行为是停止自身运行。

1.VMware痕迹		VMware虚拟环境在系统中遗留了很多痕迹,特别是在VMware Tools
软件安装之后。因此,恶意代码可以通过存在于操作系统的文件系统,注册表和进程列
表中的标记痕迹,探测VMware虚拟环境的存在。安装VMware Tools的虚拟机会运行
VMwareService.exe,VMwareTray.exe和VMwareUser.exe。恶意代码在进程列表中搜索
带有VMware字符串的进程,就能找到上述三个进程中的任意一个。

	VMwareService.exe以service.exe子服务的形式启动VMware Tools服务。恶意代码可
	以通过搜索注册表中安装的服务,或者列举系统中的服务来识别它。
	
	<1>绕过VMware痕迹的探测。 挫败查找VMware标记痕迹的恶意代码分俩个步骤: 
	首先,定位恶意代码中查询wmware标记痕迹的代码位置,然后修补它们。例如,我
	们使用strings命令,对恶意代码vmt.exe进程检测。 使用CreateToolHelp32Snapshot,
	Process32Next等函数扫描进程列表。然后通过strncmp函数将字符串和VMwareTray.exe
	和扫描后的结果进行比较,来确定进程名是否在进程列表中。
	
	避免这种探测的方法如下:
	- 在调试过程中修补二进制代码。
	- 使用十六进制编辑器,将字符串VMware.exe修改。
	- 卸载VMware Tools,使得VMwareTray.exe服务不再运行。
	<2>探测内存痕迹 作为虚拟化的结果,VMware在内存中留下了很多痕迹。一些关键
	的处理器结构或是被移动或是被修改,这就留下了可识别的指纹。
	
	有一种常被用来探测内存痕迹的技术,即搜索整个物理内存中含有VMware的字符串。

2.查找漏洞指令 	虚拟机监视器(VMM)监视虚拟机的运行,它运行在宿主操作系统,并为
客户机操作系统提供一个完整的虚拟平台。

某些指令序列在VMware虚拟机和在物理机中运行时返回不同的结果。
	处理器使用某些关键的结构与表,它们会被加载与真实系统不同的偏移量,而这正式未
	进行全虚拟化的副作用。IDT(中断描述表)是CPU内部的一个数据结构。在x86体系结构
	下,所有的内存获取,或是通过全局描述表(GDT)获得,或是通过本地描述表(LDT)获得。
	IDT,GDT和LDT(本地描述表)是CPU内部的寄存器,它们分别存在着各自表的基地址
	和大小。
	
	需要注意操作系统不需要使用这些表。有三条敏感指令(sidt,sgdt,sldt)可以读取这些表的
	位置。因此,这些寄存器的值必须对底层宿主操作系统(Host)有效。
	
	<1>使用Red Pill反虚拟机技术
	red pill是一种反虚拟机技术,通过运行 sidt指令获取IDTR寄存器的值。虚拟机监视器必
	须重新定位Guest系统的IDTR,来避免与Host系统的IDTR。因此在虚拟机中运行sidt指
	令时,虚拟机监视器不会得到通知,会返回虚拟机的IDTR。red pill通过测试这种差异来
	探测VMware的使用。
	
	恶意代码可以通过 sidt fword ptr[eax] 将IDTR寄存器的内容存储到EAX指向的内存地址。
	将第5个字节与0xFF比较,来判断VMware的存在。 mov al,[eax+5]  ,  cmp al,0FFh。
	red pill仅在单处理器的机器上有效,多处理器都有一个分配给虚拟机的IDT,所以sidt指
	令的结果可能各种各样,Red Pill使用的特征不在可靠。
	
	阻止这种技术,将虚拟机运行在多核处理器上,或是简单地用NOP替换sidt指令。
	<2>使用No Pill技术
	sgdt与sldt指令探测VMware的技术通常被称为No Pill。与Red Pill不同,No Pill依赖于
	LDT结构由处理器分配,而不是由操作系统分配这个事实。正常情况下,在VMware中
	它是非零值。可以通过简单地检查sldt指令返回结果是否为零值实现探测。
	
	我们可以通过禁用VMware的加速,防止sldt探测方法。具体操作方法是选择VM->
	Settings->Processors,勾选DIsable Acceleration框。如果sldt探测方法失败,No Pill将
	通过smsw指令解决这个禁用加速的问题。(这个方法涉及检查smsw指令返回值中未文
	档化的高位部分)
	
	<3>查询I/O通信端口 当前使用的最流行的反VMware技术当属查询I/O通信端口。这种
	技术经常在蠕虫和僵尸程序中碰到,例如Storm worm和phatbot。
	
	VMware使用虚拟化I/O端口完成宿主系统与虚拟机之间的通信56,以便支持诸如复制
	和粘贴功能。这个端口可以被查询,然后与一个神秘数进行比较,以确定VMware的使用。
	
	这种技术成功的关键在于x86体系结构中的in指令,它从一个源操作数指定的端口复制数
	据到目的的操作数指定的内存地址。VMware会监视in指令的执行,并捕获目的通信端
	口为0x5668(vx)的I/0。VMware会检查第二个操作数是否为VX,在这种情况发生时,
	EAX寄存器载入的值是0x564D5868(VMXh),ECX寄存器中必须被载入你希望在端口上执
	行相应操作的值,值0xA表示"get VMware version type";0x14代表"get the memory size"。
	它们都可以被用来探测VMware,但0xA更受欢迎,因为它能确定VMware的版本。
	
	phatbot也称为Agobot,是一个简单易用的僵尸网络。它的一个特点是内置了对I/O通信端口
	探测技术的支持。
	
	当in指令被虚拟机捕获,然后再进行模拟执行。in指令使用参数EAX(magic数),ECX(操作数),
	以及EBX(返回信息)。如果magic数与VMXh匹配,表示代码运行在虚拟机中,虚拟机监视器会
	将值存入有EBX指令的内存位置。
	
	cmp eax,'VMXh'可以用来确定代码是否运行在虚拟机中。由于选择了获取版本的选项,ECX
	寄存器会包含VMware类型(1=Express,2=ESX,3=GSX,4=workstation)。
	
	对付这种反虚拟化技术最简单的方法是使用NOP指令替换in指令,或修补条件跳转,使得它
	不论比较结果如何,都执行到未探测到虚拟机的程序分支。
	
	<4>使用str指令。 str指令用来从任务寄存器中检测段选择子,段选择子指向当前任务的
	状态段(TSS)。此外恶意代码编写者可以利用str指令探测虚拟机的存在,因为这条指令返回
	的值,在虚拟机系统与宿主系统中可能不同。(这种技术对于多处理器的硬件无效)。
	
	例如; str word ptr [ebp +... ]
	<5> 反虚拟机的x86指令
	我们回顾了恶意代码实现反虚拟机技术常用的一些指令,它们是:
	- sidt (用来获得IDTR的位置, 在多处理器中这个无效)
	- sgdt (判断LDT本地描述表,非零值表示在虚拟机中)
	- smsw
	- str(任务寄存器中检测段选择子)
	- in(第二个操作数被设置为vx,来检测虚拟机)
	- cpuid
	<6> 在IDA Pro中高亮显示反虚拟机代码。 可以使用IDApython脚本查找前面列出的指令,并且用红色高亮显示。
	<7>使用ScoopyNG  是一款免费的VMware探测工具,它实现了对虚拟机的其中不同检测,具体如下:
		- 前三种检测是查找 sidt,sgdt,sldt(Red Pill,和No pill)指令
		- 第四钟检测是查找str指令。
		- 第五种和第六钟检测是分别使用后面I/O端口0xa和0x14选项。
		- 第七种检测是利用VMware较老版本运行在模拟模式下的一个漏洞。

3.调整设置 在VMware中有一些未文档化的功能可以帮助减轻反虚拟机技术的探测。例如,将代码清单
的选项放到虚拟机.vmx中,以减轻虚拟机被探测的可能。

4.虚拟机逃逸。 VMware存在着一些安全漏洞, 可以利用这些漏洞,使宿主操作系统崩溃或是在宿主
操作系统中运行代码。

在共享文件夹功能或者共享工具中发现了很多公开的漏洞,它们都利用了VMware Tools的拖放功能。
一个使用了文件夹共享功能的公开漏洞,可以使Guest系统在宿主系统上写任何文件,从而修改或者
破坏宿主操作系统。另外一个广为人知的漏洞在VMware的虚拟机显示函数中被发现。一个利用这个
漏洞的方法叫"CloudBurst“,它作为canvas渗透测试工具的一部分而公开可用。

当主机系统被感染后,一些公开可用的工具可以用来对VMware进行攻击,这些工具包括VMchat,
VMcat,VMftp.等等。除非你已经从虚拟机中逃逸出来,否则这些工具几乎毫无用处,所以你不必
担心运行在虚拟机中的恶意代码会使用这些工具。
	

实验

Lab17-1
在虚拟机VMware中分析恶意代码Lab17-01.exe,这是与Lab07-01.exe相同的恶意代码,但是加入了反VMware技术。
提示:这个恶意代码使用的反虚拟机技术可能在你的环境中不起作用。
问题

1.这个恶意代码使用了什么虚拟机技术?
  使用sidt来检测是否在虚拟机中运行,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.如果你有一个商业版本IDA Pro,运行第17章中代码清单17-4所示的IDA python脚本(提供如findAntiVM.py),发现了什么?
  

3.每种反虚拟机技术成功执行后会发生什么?
  通过对三次检测分析,发现使用sidt执行成功之后会删除自身。str执行成功也会删除自身程序。,使用sldt检测,执行失败之后会结束运行。

4.针对你的虚拟机,这些反虚拟机技术中那些技术会生效?
  在我的虚拟机中 sidt检测失败。推测因为处理器是i7-6700,4核
  str也检测失败。
  sldt检测也失败。
然后程序就开始等待一个固定时间去开启一个线程访问一个网站,发送ddos攻击。

5.为什么每个反虚拟机的技术,会生效或失败?
  sidt检测失败。推测原因是处理器是i7-6700,4核

6.怎么使这些反虚拟机技术无效,从而让恶意代码运行?
  可以通过修改这些指令,或者隐藏虚拟机。

Lab17-2

在虚拟机VMware中分析恶意代码文件Lab17-02.dll。回答本实验的第一个问题后,尝试使用rundll32.exe运行DLL的安装导出函数,并且使用类似procmon的工具监视他们。下面是DLL的命令行的例子。
rundll32.exe Lab17-02.dll,InstallRT(or InstallSA/InstallSB)
问题

1.这个DLL导出了什么?
在这里插入图片描述
2.尝试使用rundll32.exe安装后,都发生了什么?
在这里插入图片描述
  随后发现在当前文件夹下面新建了xinstall.log查看发现检测到虚拟机的标志。第一次检测之后便删除自身。

3.它创建了那些文件,这些文件都包含什么内容?
  xinstall.log,并写入
  [04/04/19 16:38:53]
  Found Virtual Machine,Install Cancel.

4.它使用何种反虚拟机方法?
  使用in指令判断。
在这里插入图片描述
在这里插入图片描述
5.在恶意代码运行时,怎么强制安装它。
  跳过in指令判断,直接执行。通过修改指令实现强制安装。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6.怎样可以永久禁用这些反虚拟机技术?
  不使用vmware tools。

7.每个安装的导出函数是如何工作的?
  流程和函数相同,都是进行判断in指令。

Lab17-3
在VMware中分析恶意代码Lab17-03.exe。这个实验与Lab12-02.exe相似,不同的是添加了反VMware技术。

问题
1.当你在虚拟机中运行这个恶意代码时会发生什么?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.怎么让这个恶意代码运行,并且关闭它的键盘记录呢?
  我们可以使用nop指令将位于0x0040145D的指令填充掉,这样程序就可以直接从自身的资源节中提取键盘记录器,并执行进程的替换。

3.这个恶意代码使用了何种反虚拟机技术?
  使用了四种手段。 第一处通过in指令来判断是否运行在虚拟机中,第二处通过在注册表项下查找是否运行在虚拟机中。第三处通过比较MAC地址,来判断是否运行在虚拟机中。第四处通过比较进程来判断是否运行在虚拟机中。

4.你可以对系统做什么样的变化,从而使你能够永久避免恶意代码所使用的反虚拟机技术?
  可以通过卸载VMware Tools并修改MAC地址的方法来避免。
在这里插入图片描述

5.为了让反虚拟机技术永久失效,你该如何用ollydbg对二进制文件进行修补?
在这里插入图片描述
  通过对指令的修改,实现关键的跳转。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值