论文网
首页 理科毕业电气毕业正文

污点标记技术在恶意代码分析中的应用

  • 投稿杨纳
  • 更新时间2015-09-11
  • 阅读量279次
  • 评分4
  • 51
  • 0

杨思燕,归达伟,杨元柱

(陕西广播电视大学计算机与信息管理系,陕西西安710119)

摘要:利用虚拟机技术对恶意代码进行动态分析的方法成为目前安全领域研究的重点,国内外相关的研究大部分集中于理论方面,而相关的应用较少。提出以基于全系统模拟器QEMU作为监控平台,通过编写远程控制模块,对目标程序进行动态的实时分析,提取出目标程序的API调用序列以及对应的参数信息,并利用污点标记技术对产生的数据进行关联,有效地提取出目标代码的行为特征,给判断未知程序是否为恶意代码提供了依据。实验表明,相比同类工具,自动分析平台具有更好的分析结果。

教育期刊网 http://www.jyqkw.com
关键词 :恶意代码;行为监控;QEMU;动态污点标记

中图分类号:TN915.08?34 文献标识码:A 文章编号:1004?373X(2015)13?0076?05

收稿日期:2015?02?19

基金项目:陕西工商职业学院课题(13G?08?B22);陕西省教育科学“十二五”规划课题(SGH140851)

0 引言

Windows 操作系统上运行的用户态程序,包括病毒、木马等常见恶意代码,一般都通过调用Win32环境提供的Win32 API接口来完成各项操作。借助逆向工程和调试技术,反病毒工程师可以分析可疑程序API及参数的调用情况,从而判断上报的可疑是否为恶意代码。如何将这种人工分析的方法自动化,并最终实现自动化检测恶意代码,已成为反恶意代码研究领域的一个热点。

伴随计算机系统发展而发展的虚拟机技术,则提供了很好的隔离机制。在虚拟机制下,一个系统可以被模拟出来,被模拟出来的系统可以完全不了解另外的系统。样本在虚拟机中运行对客户操作系统造成的损害,完全可以通过快照,重新还原,重启虚拟机等方式,对宿主操作系统不造成任何实质上的危险,所以基于虚拟机的恶意代码自动分析平台成为解决上述难题的关键。

德国曼海姆大学可靠性分布式系统实验室的CWSandbox,在虚拟机软件VMware 中分析样本[1],采用API Hook 技术跟踪程序行为,自动化产生分析报告。

Norman Sandbox是Norman公司推出的在线病毒分析服务[2],通过重新实现内核Windows系统,仿真了整个计算机和一个连接的网络环境,仿真环境下不需要恶意进程的干预、感染、更改其他运行的进程,因为没有其他的进程运行在仿真环境下,很多相互干涉的重要信息也会丢失。Chas Tomlin的Litterbox与之前的分析系统不同[3],这种分析方法是让恶意软件执行在一个真实的Window系统上,而不是模拟或仿真的系统,每过60 s系统被强制从一个Linux镜像文件中重启,重启后,Litterbox加载Windows分区并提取出Windows注册表和文件列表,这样分区就回到了干净的状态。在恶意代码执行期间,Windows主机通过虚拟网络连接到一个正在运行的IRC服务器,它能够应答所有到IRC的连接请求,这个工具能捕捉到所有要到其他网络的数据包。Litterbox 只是做了一个被感染的系统的镜像,它并不能监视像新进程创建这样的动态行为。

针对以上工具存在的问题,本文提出利用开源模拟器QEMU[4]做监控平台,并对产生的分析结果,采用污点标记技术进行关联,能够更好地提供恶意代码的行为特征。

1 系统框架

整个体系架构的最终目标是通过用户在客户机提交Windows PE 文件样本,网络传输到服务器端上已安装的定制虚拟环境中,获取到目标文件的各种信息,然后通过行为抽象,对API数据报告进行处理,从而构建样本的行为特征,通过对比数据库中的行为库,产生分类报告,最后通过网络反馈给客户机,完成一次未知程序的分析过程。

本文主要工作集中在数据的获取部分,在系统中作为前端平台,图1是前端平台的框架图。

由图1 可以看出,系统主要由四部分构成:客户端(Client),服务器端(Sever),中间件(Coodinator),模拟器(WinQEMU)。这四部分构成了前端数据获取平台的主要功能模块。

首先启动客户操作系统(Guest OS),运行其中的服务器端程序;然后在宿主操作系统(Host OS)上启动客户端程序,选择目标程序,上传到客户操作系统中,并挂起;在WinQEMU里设置相关数据,若完成,则运行目标程序,开始动态监控,对获取到的数据,通过中间件传送到宿主操作中,从而完成一次分析过程。

通过上述四个模块的相互协调,可以对目标程序进行API调用序列以及参数信息的获取。下面是简单的测试,验证其结果的准确性以及有效性。

测试程序主要是一个实现exe注入的恶意代码,目的是将自身代码注入到傀儡进程,不需要DLL 文件支持。工作原理如下:

(1)CreateProcess创建一个挂起的IE进程;

(2)得到装载基址,使用函数ZwUnmapViewOfSec?tion卸载这个基址内存空间的数据;

(3) 用VirtualAllocEx 为IE 进程重新分配内存空间,大小为要注入程序的大小;

(4) 使用WriteProcessMemory 重新写IE 进程的基址,就是刚才分配的内存空间地址;(5) 用WriteProcessMemory 将自己的代码注入IE的内存空间,用SetThreadContext设置进程状态;

(6)使用ResumeThread继续运行IE进程。

图2是这个恶意代码在工具中运行得到的报告。

通过图2 可以看出,本系统实现的监控平台,能较好地提取出目标程序的API调用序列以及对应的参数信息。然而数据之间并无关联,在恶意代码检测中,难以具有实际的应用,如何去掉冗余的API调用以及挖掘数据内在的关联关系,更好地表现出恶意代码的行为特征,是恶意代码分析技术中研究的关键。

2 污点标记的应用

基于以上需求,提出采用污点标记技术完成基于参数规则的函数依赖关系的建立。在本文框架中,污点标记技术在两个方面起主要作用。

(1) 在构建系统的特征行为库中起到预处理作用。特征库的构建一直是基于行为特征检测恶意程序技术中的难点,大部分文献成果基本采用人工构建的经验分析法,这种方法强烈依赖于相关研究人员的专业素质,从而无法客观地保证行为库的有效性以及准确性。通过动态污点传播分析技术,提取恶意程序的关键API信息,自动去掉冗余和混淆API调用,清晰地表达出API相互之间的依赖关系,从而对特征库进行扩充,因此较好的克服了这个难点;

(2)将目标样本送入到分析平台中,进行信息获取并采取污点传播分析技术,提取出典型特征,然后通过特征匹配算法,与已经构建的行为特征库中的基本行为进行匹配,层次化的匹配过程中,当满足一定的条件,必然呈现出目标样本的高级行为,从而完成对样本高层语义行为的理解,最终完成检测结果。

2.1 污点标记的原理

通过对不信任的输入数据做标记,动态跟踪程序运行过程中污点数据的传播路径,检测使用污点数据的内存区域以及操作方式,用这种方法可以检测到敏感数据(如字符串参数)被改写而造成的缓冲区溢出、不可靠数据的非法使用等问题。当来自内存或者网络的数据被用到敏感操作中时,污点分析技术可以提供详细的操作路径,从而根据这种数据流的流向,完整地建立起操作不可靠数据的若干API函数之间的依赖关系[5]。

定理1:令(P,? )是任意的有限格。令( 2N , ?)为由N 的有限子集形成的满足关系的格。那么(P, ?)可以嵌入到(2N , ?)中,即存在映射φ:p → 2n,使得a ? b ? φ(a)∈ φ(b) 对于任意x ∈ p,φ(x) 是N 的有限子集。

对于形如函数调用语句return_value=api_cal(l src_1,src_2,…)

src_1对应于参数1;src_2对应于参数2;return_value表示返回值;api_call表示函数调用,可得参数与返回值之间的传播关系。

若src_1,src_2,return_value∈P,构造φ(src_1) ={1},φ(src_2) ={2},φ(return_value) ={1,2},那么由{1}∈{1,2},{2}∈{1,2} 可得src_1 ? return_value,src_2 ? return_value。若不能构造满足包含关系的子集,那么函数参数到返回值未进行污点传播,其语义不反映污点作用。

2.2 API层技术实现

在API层实现污点标记技术,首先要考虑的是如何选取污点源以及制定传播规则。这里的污点源主要是针对函数的参数和返回值,函数的参数在传递方向上有传入参数[in]和传出参数[out]之分,传入的参数供函数内部使用,而传出的参数一般用作其他函数的传入参数,所以参数中的污点源标记部分只针对传出参数[out],因为这样可以记录数据的流向。同样,返回值的功能类似于传出参数,也需要作为污点源进行标记。但是,返回值如果是void或者bool等类型,则明显对后续数据操作无意义,所以返回值一般只关注句柄、指针、字符串和缓冲区等操纵资源或内存的类型。同样针对传出参数[out]而言,主要标记三种类型:字符串类型、句柄类型以及缓冲区类型。对于整型参数,则意义不大,而且重复性太强,没有典型特征[6]。

这里污点传播技术最终需要达到的目的是对上述两种情况——参数以及返回值进行污点标记,从而构建函数间调用的依赖关系,例如:

int a[6]={1,2,3,4,5,9};

HANDLE hFile;

hFile=CreateFile(“srcfile.txt”,0,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);

WriteFile(hFile,(LPCVOID)a,sizeof(a[0]*6),lpNumberOf?BytesWritten,NULL);

DeleteFile(“srcfile”);

首先是CreateFile 函数,创建了一个“srcfile.txt”文件,然后返回所创建文件的句柄hFile,下面有两个函数分别用到这两个地方:第一个是WriteFile函数,利用前面的函数返回值hFile文件句柄,查找创建的文件,写入数据;第二个是DeleteFile函数,利用参数“srcfile.txt”作为传入参数,查找名为“srcfile.txt”的文件,然后进行删除。

由此可以看出,CreateFile,WriteFile,DeleteFile 这三个函数,对同一个文件对象进行了相关操作,而这种操作关系构成了三者之间的依赖关系,表现出代码的软件行为特征。而这种对相同对象进行操作的关系则是三者之间进行关联的规则条件,如何体现这种规则以及构建这种依赖关系,则是污点传播技术完成的工作。

就本段代码而言,首先确定两个污点源——CreateFile函数中的字符串类型的函数名“srcfile.txt”以及句柄类型的返回值hFile,然后根据后面两个函数的传入参数是否对这两个污点源进行操作进行判断,最终形成依赖关系序列。判断的标准则基于污点传播的规则制定。

API层的传播规则制定比较复杂,不同的需求对应的规则设计不同,所以算法的设计没有统一标准,在本文中制定的规则为:

(1)构建两个双向链表,分别为地址链表以及API序列图链表。地址链表主要是用来保存每个函数以及函数的所有参数信息和对应的内存地址(包括返回值信息和对应的内存地址),而API序列图主要是保存具有依赖关系的API集合,双向链表的结构保证了对于数据的回溯查询,从而明确表现出传播的路径。

(2)对于QEMU 模拟的虚拟内存,在访问数据时,总会通过影子页表,转换到宿主机上的物理内存地址,所以对于污点传播里面重要的污点标签操作,这里采取利用参数的真实物理机地址作为标签。

下面是设计的具体规则:

(1)若目标程序运行过程中,指令寄存器里面的地址匹配到一条API函数,则保存函数的所有参数到地址链表数组中。然后对匹配到的API进行时序判断,是否属于第一个需要监控的API,如果是,转向第(2)步,如果不是,转向第(3)步;

(2)如果监控到的API 函数属于目标程序的第一个调用函数,此时污点传播尚未开始,所以将API函数名加入到API序列图中第一个位置中,加入时序信息,并且对函数中符合污点源的参数以及返回值进行污点标签标记,然后转向第(1)步;

(3)查看函数名是否属于终止类型函数,比如关闭进程,关闭句柄,关闭文件等,如果是,则将函数中的参数对比前面保存的打开进程,创建句柄和文件等参数,若相同,则结束本条污点传播路径;若不同,则转向第(4)步。

(4)根据函数名对应的参数数组,找出已经保存的参数序列,参数类型为前面介绍的APIParam 类型。取出第一个参数,判断其type的类型,主要分为三种:字符串类型,句柄类型,缓冲区类型(整型比较的意义不大,忽略);然后分别送到相应的处理函数中(分为三个处理函数:句柄类型handle_cmp(DWORD handle_addr),缓冲区类型buffer_cmp(char buff[],int length),字符串类型string_cmp(char*str)),与地址序列图中其他相同类型的参数或者返回值进行比较,如果相同,证明参数之间或者参数和返回值之间操纵了同一资源对象或者内存对象等,具有一定的依赖关系,转向第(5)步;若不同,则继续查找函数的第二个参数,做相同的操作,直到参数全部比较完毕。若此函数的参数与其他函数的参数并无关系,则属于单独节点,转向第(6)步;

(5)遍历链表,找出操作相同对象的参数所对应的API函数名,然后存入数组,作个函数标记。隶属于同一函数的参数在与其他函数参数进行比较的过程中,所有获取的关联API函数名,存入一个数组中,说明这个函数与其他若干个函数发生依赖关系;然后根据数组里面保存的API函数名对比API序列图中的函数名,利用函数name_cmp(const char* name)分别找出对应的序列号,然后将此函数的API函数名分别加入到相应序列号中的API 函数名的位置add_namelist(const char*name),跳向第(1)步;

(6)在API序列表中新加入节点,然后将此函数加入到新节点的API函数名位置,同时转向第(1)步,进行循环。

通过上面的规则,最终完成污点传播路径的标记,经测试,可以成功构建出函数在API层的依赖关系,如图3所示。

2.3 实验结果分析

从通过添加污点标记之后的测试结果图3 可以看出,API函数调用之间存在的参数依赖关系已经根据相应的规则归类到同一依赖关系序列中。例如图中所示的1,2,3这三个数字标记,API函数VirtualAllocEx的返回值是一个内存句柄类型,值是0x00400000,而后面的API 函数WriteProcessMemory 的第三个调用参数,方向是传入[in],参数类型也是地址指针类型,符合API层的污点传播规则,两者值进行比较,由于函数WritePro?cessMemory 的值也是0x00400000,所以函数WritePro?cessMemory 和VirtualAllocEx 则构成一定的依赖关系,其依赖序列采用VirtualAllocEx 的时序序号25。因此WriteProcessMemory的依赖关系序列中添加序号25。

观察标记在依赖关系序列10 上的三个梯形粗线。可以看出三个时序序号为24,25,26的三个函数ZwUn?mapViewOfSection,VirtualAllocEx 和WriteProcessMemo?ry均在参数调用中操作了具有相同句柄值0x0000007d0的对象,而这三个函数都归类于依赖关系10序列,说明时序序号为10的API函数的返回值或者传出参数产生了句柄值为0x0000007d0的对象,而后续的API函数对此进行了某种操作,因而它们之间构成依赖关系,如图3所示,在行为依赖关系中给予表现。

实验结果表明污点标记在函数依赖关系建立中具有重要的意义。通过对API层以及指令层的污点技术应用,可以看出,原本孤立毫无关系的单独API调用,由于参数之间的相互调用关系,结合污点标记的路径传播,若干个API函数之间构建起依赖关系,从而为后续工作——提取恶意代码的行为特征以及构建软件行为特征库提供了准确且完善的数据信息。

3 结语

本文的主要工作是实现了对恶意代码的动态监控,实时分析,并结合动态污点标记技术,对提取的信息进行管理,挖掘数据间的依赖关系,更好地表现出恶意代码的行为特征。但是由于全系统模拟器QEMU 的效率不高,运行较慢,且分析一次需要重新启动,较难大批量的分析恶意代码,构建恶意代码行为库,因此,后续的工作将集中在改进QEMU的执行效率,加快分析过程,从而更好地实际应用。

教育期刊网 http://www.jyqkw.com
参考文献

[1] WILLEMS C. CWSandbox: automatic behaviour analysis ofmalware [J/OL]. [2006?09?12]. http://www.cwsandbox.org/,2006.[2] Norman. Normal sandbox [EB/OL]. [2006?07?23]. http://sand?box.norman.no/.2006.

[3] TOMLIN C. LitterBox [EB/OL]. [2005?02?09]. http://www.wiul.org/.2005.

[4] BELLARD F. QEMU [EB/OL]. [2005?03?21]. http://fabrice.bel?lard.free.fr/qemu/.2005.

[5] 孔德光,郑烇,帅建梅,等.基于污点分析的源代码脆弱性检测技术[J].小型微型计算机系统,2009,30(1):78?83.

[6] BAYER U,KRUEGEL C,KIRDA E. TTAnalysz:a tool for an?alyzing malware [C]// Annual Conference of the 15th EuropeanInstitute for Computer Antivirus Research. Vienna: EICAR.2005,128?131.

[7] BELLARD F. Qemu,a fast and portable dynamic translator[C]// Proceedings of 2005 USENIX Conference on Annual Use?nix Technical. Marriott Anaheim,USA:USENIX,2005:41?46.

[8] 吴浩.二进制翻译系统QEMU 的优化技术[D].上海:上海交通大学,2007.

[9] 柏志文.基于动态二进制翻译的污点检测设计和实现[D].西安:西安电子科技大学,2008.

[10] 陈培,高维.恶意代码行为获取的研究与实现[J].计算机应用,2009(z2):76?78.

[11] 梁晓.恶意代码行为自动化分析的研究与实现[D].成都:电子科技大学,2008.

[12] 张斌,李孟君,吴波,等.基于动态污点分析的二进制程序导向性模糊测试方法[J].现代电子技术,2014,37(19):89?94.

作者简介:杨思燕(1976—),女,江西人,硕士,讲师。主要研究领域为智能图像处理与模式识别、嵌入式软件设计。归达伟(1975—),男,副教授,硕士,教研室主任。主要从事网络系统管理方向的研究。