欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

ANTI ANTI-VMWare

程序员文章站 2022-07-10 09:54:54
文/图 fOx 喜欢调试程序或者测试程序的朋友应该都知道,著名的VMWare 虚拟机能够很方便地完成我们的任务,特别是它的快照功能、虚拟机克隆等功能。但是有些程序,加上一些特殊处理,比如Th...
文/图 fOx
喜欢调试程序或者测试程序的朋友应该都知道,著名的VMWare 虚拟机能够很方便地完成我们的任务,特别是它的快照功能、虚拟机克隆等功能。但是有些程序,加上一些特殊处理,比如Themida壳后,就无法运行于虚拟机中了,这给我们带来了很大的麻烦,如图1所示。

ANTI ANTI-VMWare

图1
下面我就来献一下丑了,说明如何解决这个问题。当然,这种东西我们首先是搜索Google,搜索关键词“Detect VMWare”,第一篇就出现了我们要的结果。
 
上面这一段C代码中黑体显示的部分就是检测虚拟机的关键所在,其原理也比较简单。因为我们的应用程序在Ring3下默认是没有访问读写端口的权限的,因此,Windows默认将直接以一个特权指令异常来调用异常处理函数,显然只要用一个“__try,__except”结构就可以很容易的判断了。那么,我们大名鼎鼎的Themida是不是也这样呢?
下面我们就来做一下测试。首先利用图1所示的选项来最小化加密任意一个应用程序,如notepad.exe或者calc.exe等,用于方便我们调试,然后把加壳后的应用程序在Host主机中用OllyDBG加载,在OllyDBG的调试选项中,把忽略特权指令异常的勾去掉,以便验证我们的猜想。之后运行,OD状态栏在出现特权指令的时候,向上翻一下指令,即可出现图2所示的指令,这很显然就是刚才讲的Detect VMWare的方法。为了进一步验证猜想,我们在虚拟机中运行对应的测试程序,在刚才出现特权指令的地方下一个硬件断点,并把忽略“无效或特权指令”异常的勾重新打上。
ANTI ANTI-VMWare
图2
运行刚才的程序,断下后,我们将寄存器EAX的值清0,继续运行。很明显,程序已经运行起来了,Themida的Virtual Machine Compatible的选项我们也就可以无视了。然后我们来研究一下为什么这样就可以检测VMWare。
这里先给大家介绍一个小技巧。要判断VMWare是怎么处理指令的,我们就要找到是哪个程序、哪个DLL或是模块要执行虚拟化任务,因此我们从网上下载一个SuperPI,用于在虚拟机中占用CPU资源,并打开Host机器的任务管理器。当虚拟机中的Super PI正在强力计算之时,可以观察到vmware_vmx.exe这个进程的CPU占有率是最高的,而且接近50%(在双核、多处理器、多线程的计算机上,这多数情况下意味着该进程已经占用了一个内核或者一个CPU的资源,因此我们可以判断这个进程正在全速运转。当然,如果是4核或8核的机器就应该依此类推为100%/4=25%、100%/8=12.5%。),结合Vista任务管理器的进程路径显示功能,便可以方便地定位这个文件,如图3所示。找到这个文件以后,我们还是拿出静态分析的强力武器IDA来进行静态分析。用IDA 打开此文件,加载后等待大约数分钟,IDA分析结束,我们就可以开始工作了。
ANTI ANTI-VMWare
图3
重新回顾一下刚才的那段检测代码,常数“0x564D5868, 10, 0x5658”引起了我们的兴趣,因此首先搜索第一个常数,因为这个常数占4个字节,比其余的1个字节和2个字节的10和0x5658来说,显然能够避免过多的无效记录。在IDA的默认反汇编窗口中按ALT+I搜索Immediate Value(立即数),在弹出的Search Immediate窗口中的“Value to search”处输入0x564D5668,并注意勾选Find all occurrences(查找所有),如图4所示,按OK后,主窗口的选项卡中就出现了“occurrences of value 0x564d5668”,其中就是所有的引用地址。比如我的VMWare 6.0中就出现了如图5所示的几个结果。注意,VMXGetVersion是我自己的命名,大家自行分析的时候应该是一个类似sub_XXXXXX的地址。下面我们就大致来对每一个函数进行一下简单的分析。
ANTI ANTI-VMWare
图4
ANTI ANTI-VMWare
图5
 
首先看第一项。
 
很明显,这是一个检测函数,和前面那段C语言的检测VMWare的代码差不多,肯定不是进行处理的地方,应该是用于判断是否运行于虚拟机中,我将这个函数命名为IfRunInVMWare。由此,搜索结果列表中的第一和第二项就被我们顺利地排除了。