在桌面平台攻防中虚拟机是一项重要技术。对于桌面平台的恶意代码如果具备比较强的虚拟机检测能力可以大大提高战场生存能力。当恶意代码发现自己是在虚拟机中执行
就可以改变自己的行为方式,比如不进行解密操作,或者简单运行后退出从而规避虚拟机分析。对于手机平台的病毒随着时间的推移、硬件能力的提高,反病毒阵营必然也会引入
虚拟机技术来检测我们。那么研究识别虚拟机的技术就显得很有价值了。


最近一年的学习研究中我一直在关注这个问题并不断积累,总结了一些虚拟机检测的技术和经验。我总结的基本原则是:
虚拟机永远也不可能做到和真机完全相同;越偏向底层,差距越大。

目前主要的虚拟机平台就是微软提供的模拟器,现在我们的研究重点就是检测病毒是在真机上还是在模拟器上运行。

我们在研究API时发现了两个可以用于检测。

方法1:利用SetEndOfFile()函数的特点来检测。
       SetEndOfFile()函数的功能是把文件指针的当前位置设置为文件的结尾,调用后返回BOOL类型数据表示设置是否成功。我们发现这个函数在一般操作中都没有问题,
       但是在模拟器中当这个文件处于SD卡中时,设置文件末尾会出错。似乎模拟器将模拟的SD卡当作一个网络设备而禁止了这个操作。但是在真机上就没有这个问题。
       DetectVM01正是利用这个原理检测当前系统是否为虚拟机。


方法2:利用SystemParametersInfo()函数获取OEM名称字符串。
       在微软提供的模拟器中OEM字符串为"MicroSoft DeviceEmulator"。但真机不可能为这个字符串,所以获取当前系统的OEM字符串然后检测其中是否含有Emulator字样。
       如果含有则是模拟器,没有则是真机。DetectVM02就是用这个原理来检测的。


两个程序都在真机和模拟器上做了实验显示的结果不同,可以检测出来。

真机使用Touch Daul。
OEM字符串显示的是:NIKI100。
SD卡下路径为:\存储卡\VM

上传的附件 DetectVM.rar