路径条件驱动的混淆恶意代码检测

点赞:13505 浏览:57251 近期更新时间:2024-03-29 作者:网友分享原创网站原创

摘 要:代码混淆是恶意代码隐藏自身的主要手段之一.本文提出了一种新的动态检测方法,能够有效检测混淆后的恶意代码.该方法能够利用ISR进行动态调试.在调试过程中通过对路径条件的约束求解,驱动恶意代码执行不同的路径更深入地检测隐藏恶意代码.此外,对于需要读取外部资源的恶意代码,恶意行为往往需要结合外部资源才能检测.本文方法能够准确定位外部资源并结合原始恶意代码进行检测,提高检测的准确性.在原型系统的测试中,与12种杀毒软件的横向测试表明,该方法在对混淆恶意代码检测中能有效地降低漏报率.

关 键 词:程序调试;恶意代码检测;代码混淆;路径分析;动态测试

中图分类号:TP309文献标识码:A

经过多年研究,恶意软件检测领域发展出了多种有效的恶意软件检测方法.恶意软件分析方面主要包括静态分析和动态分析两大类方法;恶意软件的归类和检测方面则主要采用基于特征,基于规范以及基于异常[1]三种方法.

基于特征的恶意软件检测主要将恶意软件中特定的二进制序列、字符串或者程序行为作为恶意软件的主要特征,分析检测对象后与已有的特征库进行匹配,来识别恶意软件[2].刘巍伟等人提出综合检测程序行为来作为特征实现恶意软件检测[3].基于规范的恶意软件检测方法则首先整理系统的关键安全属性得到安全规范.建立安全规范后,分析检测对象,如果检测对象的行为不满足规范,则认为检测对象为恶意软件.基于规范的恶意软件检测属于白名单机制,相较于基于特征的恶意软件检测能够更有效地检测未知的恶意软件[4],但误报率较高.基于异常的恶意软件检测采用统计的方法得到正常程序的行为集合,检测对象的行为与正常行为集合不同时,认为代码有异常行为从而判定为恶意软件.基于异常的恶意软件检测方法的误报率相对基于规范的方法低,同时漏报率相对基于特征的方法高[5].

然而随着恶意攻击者的水平不断提高,恶意代码取代恶意软件成为攻击的主要手段.恶意代码并不是完整的可执行程序,而是二进制代码片段.恶意代码相较于恶意软件,能够更容易地进行代码混淆,更方便地通过网络传输,并能更好地与软件或系统漏洞相结合.恶意攻击者针对原有的安全防护技术,针对性地对恶意代码进行伪装.一方面,使用代码混淆技术使得恶意代码没有固定特征[6];另一方面,攻击静态分析中关键的反汇编算法使其得到错误结果.静态恶意软件分析需要首先将二进制恶意软件反汇编为中间表示,才能继续分析.恶意软件保护技术中的预防混淆技术能够有效地针对反汇编算法进行攻击,使得反汇编出错[6].除此之外,分析经过控制流混淆的恶意代码,静态分析有着较大的局限性[7].另一方面,研究人员提出了一系列新的动态软件分析技术.部分研究人员提出利用纯软件虚拟机来对抗代码混淆[8-9].另外一部分研究人员提出利用CPU的调试功能的方法,提升了动态分析的效率[10-11].

本文在动态分析方法的基础上,提出了一种新的动态恶意代码检测方法.该方法采用基于CPU调试功能的动态检测技术,并利用路径驱动的分析方法提升了恶意代码检测的路径覆盖率,同时对程序I/O的检测,使得本文方法能够有效加载外部资源,检测分离式恶意代码.本文按照以下方式组织,第1节介绍与本文相关的前人研究,第2节具体介

绍本文采用的动态恶意代码检测方法,第3节给出并分析原型系统的实验结果,最后第4节进行总结.

1相关工作

在恶意代码检测领域中,研究人员主要采用静态程序分析和动态程序分析两种方法来对恶意代码进行自动化分析.其中静态分析主要包括控制流分析、数据流分析、切片以及抽象解释等多种分析方法.

由于恶意代码一般为二进制机器码,静态分析需要首先通过反汇编技术将其转化为汇编语言再进行深入分析.反汇编主要有线性扫描和递归扫描两种算法[12],然而Linn等人指出通过在二进制中插入垃圾指令,能够有效地攻击这两种主流反汇编算法,使得反汇编结果错误[6].与此同时,结合了代码混淆技术的恶意代码隐藏技术也给静态分析带来了不小的挑战.控制流混淆能够彻底改变恶意代码的执行流程,使得静态恶意代码检测技术无法通过匹配控制流图来实现检测.平展控制流混淆[13]是控制流混淆中较为常用的一种,平展控制流混淆将顺序结构的控制流图扁平化,加入大量冗余块来保护程序的真实执行流程,如图1.从图中可以看出,代码经过混淆后各个节点的执行顺序无法直观看出,需要分析派遣变量运行时信息才能获得.

动态分析相较于静态分析来说,由于需要实际执行程序,往往能够更准确地得到程序的执行流程.MichalisPolychronakis利用模拟执行环境对恶意代码变种进行动态调试,取得了很好的效果[14].在此之后,动态的恶意代码分析技术得到了全面发展,DawnSong等人提出了基于该思想的恶意代码分析平台[8].这些动态调试方法的共同特点都是通过Bochs/qemu等软件模拟环境来执行恶意代码,并对其进行分析.恶意攻击者发现软件模拟运行环境无法完全模拟所有真实CPU指令,通过某些特定的指令能够绕过模拟环境的检测机制[15].为了解决这一问题,YanickFratantonio利用真实环境中CPU的陷阱标志进行单步调试.

动态分析主要存在两个主要问题,一是路径覆盖率低,二是执行效率底.以上提到的动态执行方面采用多种方法提升了执行效率,但是忽略了路径覆盖率.本文在修改ISR实现程序跟踪的基础上,通过对执行路径条件的跟踪和约束求解,采用Concolic测试的分析思想[16],提高恶意代码分析过程的路径覆盖率.此外,在动态分析过程中通过对系统I/O函数的检测来更全面地定位获取外部资源.对外部资源的定位与跟踪能够更好地分析一些分离式的恶意代码.木马下载器作为一种典型的分离式恶意代码,只有在能够通过网络下载木马资源的情况下才会运行木马并实施恶意行为.在外部资源无法加载的情况下,恶意代码可以自动退出或者自毁.因此,为了全面分析恶意代码行为,必须能够识别并下载外部资源.


2恶意代码动态检测方法

本文提出的动态恶意代码分析框架主要包含3个主要部分:在Bochs基础上通过修改中断怎么写作例程实现的ISR调试器;实现路径驱动测试的跟踪模块;恶意代码特征分析模块,如图2所示.

在ISR调试器中,将CPU的EFLAGS寄存器中的TF标志位置为1,并修改其中断处理例程ISR1来实现对恶意代码的动态跟踪.跟踪模块则根据ISR调试器的输出记录恶意代码执行流程,将汇编语言转化为更加适合分析的中间表示.此外,跟踪模块还具有两个主要功能,一是利用Concolic思想驱动恶意代码的多次运行,提高分析的路径覆盖率;二是定位包括文件读取,网络下载等系统I/O函数来自动加载外部资源.特征分析模块则根据系统调用序列来判断、分类、记录恶意代码行为.

2.1路径条件驱动的检测

在动态跟踪的基础上,准确地发掘可疑行为是恶意代码检测的关键.传统动态分析技术仅对恶意代码的少数路径进行动态分析,无法保证路径覆盖率.然而恶意攻击者往往通过各种条件跳转来隐藏恶意代码中的攻击行为.比如通过检测自身父进程来判断运行环境,只在特定的环境下实施恶意行为.针对这种手段,跟踪模块采用Concolic测试方法驱动分析对象动态执行.首先根据ISR调试器的输出得到分析对象当前执行路径的约束条件,并对其进行变换和约束求解得到新的目标路径和输入.然后,跟踪模块驱动分析对象执行新的目标路径,避免重复执行同一路径造成冗余测试.Concolic分析算法如图3所示.

算法中,跟踪模块监控ISR调试器逐指令运行分析对象.当发生关键系统API调用时,记录API调用并分析是否需要加载外部资源.当遇到条件分支语句时,将其加入路径约束条件表达式并调用update_branch_stack函数将该分支条件及其当前值入栈.当程序执行完成时,如果分支栈为空,则说明所有分支已经遍历,测试完成;否则取得栈顶未被遍历的分支条件,对该分支条件取反并得到新的路径条件,求解该路径条件并继续Concolic测试.

跟踪模块采用基于Concolic测试的恶意代码检测方法,能够提高恶意代码分析的路径覆盖率,更深入地挖掘疑似恶意代码中的恶意行为特征,并将特征反馈到特征库用于其他恶意代码样本的检测.

2.2外部资源定位与跟踪

跟踪模块的另一个重要特点是在发现系统I/OAPI时能检测并加载外部资源.许多恶意代码作者为了方便恶意代码通过网络传播或者捆绑漏洞,采用加载器加外部资源的方式制作恶意代码.加载器体积小,能够自动通过网络或者读取文件的方式加载包含实际恶意行为的外部资源.在恶意代码检测的过程中如果仅仅对加载器进行分析,可能无法发现恶意行为从而漏报.因此,自动检测系统I/O加载分析对象的外部资源并进行联合分析能够大大降低恶意代码检测的漏报率.本文的方法通过对文件、网络、注册表读写等多种I/O相关系统调用的HOOK和参数分析,实现准确地定位、保存外部资源,并将其作为检测的一部分进行深入分析.根据系统调用的不同,外部资源可能以本地文件、网络流、内存数据等不同形式出现.对于这些不同形式的外部资源,加载器会采取不同的加载方式.

PE文件:以PE文件形式存在的外部资源,可使用WinExec,CreateProcess等系统函数直接运行.跟踪模块通过对这些系统调用的参数与外部资源路径匹配,实现外部资源加载和执行检测.随后,跟踪模块会结合原分析对象的行为和外部资源的行为实现检测.

网络流与内存数据:以这种形式存在的外部资源,加载器可以通过call,jmp等调用或跳转直接跳入执行.检测系统通过目标地址范围匹配,标识外部资源所在的内存范围,监控跟踪内存执行代码情况,发现跳转到外部资源后,跟踪模块结合原分析对象和外部资源的行为进行分析检测.

外部资源的具体检测流程如下:

步骤1:通过关键系统函数检测,实现外部资源的定位和标识;

步骤2:继续运行分析对象,检测进程运行相关系统函数和函数调用、跳转等指令;

步骤3:如果检测到执行、跳转到外部资源,则结合原分析对象进行综合检测.

通过对外部资源的检测,系统能够更准确地检测出分离式恶意代码,并能够更全面地提取分离式恶意代码的恶意特征.

3实验与分析

为了证明本文方法的有效性,本节对原型系统进行实验.原型系统在一台DELLT610怎么写作器上运行,操作系统为Win7x64版本.Bochs中运行WindowsXP,在Wildlist中选择了一组样本进行测试.使用多款杀毒软件对一组样本进行一次检测,然后VXHeens[17]提供的多态变形工具对这组样本进行混淆处理,再进行一次检测,对比两次检测的结果如表1所示.

在未经过多态变形时,所有杀毒软件几乎都能够完全检测出这些恶意代码样本,原型系统测试也取得了较为理想的结果.然而经过多态变形工具处理之后,检测情况发生了显著变化.大部分杀毒软件漏报率上升到了50%左右,甚至小部分漏报率超过了50%.原型系统的漏报率上升不大,仅上升到了19.67%.这是由于多态变形后,样本的恶意特征被控制流混淆以及条件混淆隐藏很难被准确检测.因此所有被测试的安全防护软件的检测率都发生了下降.由于原型系统采取了Concolic测试方法来分析样本,路径覆盖率更高,同时能够定位并加载外部资源,更有效地实现对变形后的恶意代码的检测.4总结与展望

本文提出了一种路径条件驱动的混淆恶意代码检测方法,该方法能够有效地通过路径条件遍历,检测出经过混淆后被隐藏的恶意行为特征.经过分析和实验,该方法有如下特点:一是能够通过路径条件的分析与约束求解,驱动恶意代码执行更多的隐藏路径,从而提高路径覆盖率,减少漏报;二是检测系统I/O函数,自动加载外部资源,实现了更全面地定位、检测恶意代码;最终准确地挖掘系统调用序列作为恶意特征,形成特征库供恶意代码检测使用.原型系统的实验证明了该方法的有效性.相较于原有的恶意代码检测方法,本文的方法能够更准确地识别恶意代码特征.