虚拟机去虚拟化及检测技术攻防
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机()是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件(比如,),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。本文主要针对基于的虚拟环境中的系统进行检测分析,并列举出当前常见的几种虚拟机检测方法。
方法一:通过执行特权指令来检测虚拟机
为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“”指令来读取特定端口的数据以进行两机通讯,但由于指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“”的异常,而在虚拟机中并不会发生异常,在指定功能号(获取版本)的情况下,它会在中返回其版本号“”;而当功能号为时,可用于获取内存大小,当大于时则说明处于虚拟机中。正是利用前一种方法来检测的存在,其检测代码分析如下:
代码:
()
{ ; { {
, ''
, 将设置为非幻数’’的其它值, 指定功能号,用于获取版本,当它为时用于获取内存大
小, '' 端口号, 从端口读取版本到若上面指定功能号为时,可通过判断中的值是否大于,若是则说明处于虚拟机中, '' 判断中是否包含版本’’,若是则在虚拟机中[] 设置返回
值
} } () 如果未处于中,则触发此异
常{ ; } ;}
测试结果:
图
如图所示,成功检测出的存在。
方法二:利用基址检测虚拟机
利用基址检测虚拟机的方法是一种通用方式,对和均适用。中断描述符表()用于查找处理中断时所用的软件函数,它是一个由项组成的数据,其中每一中断对应一项函数。为了读取基址,我们需要通过指令来读取(中断描述符表寄存器,用于在内存中的基址),指令是以如下格式来存储的内容:
代码:
{ ; 的大小; 的低位地
址; 的高位地址} ;
由于只存在一个,但又存在两个操作系统,即虚拟机系统和真主机系统。为了防止发生冲突,(虚拟机监控器)必须更改虚拟机中的地址,利用真主机与虚拟机环境中执行指令的差异即可用于检测虚拟机是否存在。著名的“红丸”()正是利用此原理来检测的。作者在上发现虚拟机系统上的地址通常位于,而通常位于,而在真实主机上正如图所示都位于。仅仅是通过判断执行指令后返回的第一字节是否大于,若是则说明它处于虚拟机,否则处于真实主机中。的源码甚是精简,源码分析如下:
代码:
<> () { [], [] "\ \\\\\\\"; 相当于[],其中用于保存地址* ((*)[]) (); 将[]中的设为的地址(((*)()))(); 执