基于API关联性的恶意行为层次化分析方法
2014-12-20李政廉赵亚新
李政廉,舒 辉,康 绯,赵亚新
(数学工程与先进计算国家重点实验室,河南 郑州450000)
0 引 言
传统的恶意软件检测方法主要是基于特征码的检测,特征码由特定长度的特征字段或者指令段构成,通过静态扫描恶意可执行程序,对特征码进行匹配,其优点是效率高,误报率低。特征码检测对于已经识别的恶意代码,具有非常好的检测效果,但是往往恶意代码的编写者通过改变病毒的特征来逃避检测,这也就决定了特征码检测对于未知恶意代码的检测效果很差。
利用API调用信息对恶意代码进行分析是当前的热点方向之一。文献 [1]中,文章提出了一种基于API调用频率的检测方式,通过对敏感API的调用频率进行分析,对行为的性质进行判断,能够达到较好的检测效果。但是,对于正常代码中的重复循环调用,往往会影响检测的结果。文献 [2]中使用API序列作为分析目标,去除序列中与正常代码重合的正确序列,提取出恶意代码的自有特征序列作为判断标准,也能够达到较好的检测效果。这种方法的不足是通过序列进行匹配,没有分析参数对函数功能的影响,具有一定的局限性。还有很多人进行了类似的工作,如许敏、赵天福等[3]建立的攻击树模型、Kyoung-Soo Han[4]的API调用序列图、章文等[5]的基于关联规则的检测方法,他们都没有从API调用关系的角度深入分析调用关系,并不能全面准确地反映恶意代码的执行过程。
本文对传统的API序列分析方法加以拓展,采用基于API关联性的行为分析方法,抽取恶意代码的行为,并用层次化的恶意行为分析模型,提供多维度的分析结果,最终对恶意代码的行为目标和行为性质进行判断。
1 基于API关联性的层次化分析模型
1.1 系统分析框架
文章通过建立层次化的行为模型实现对行为的分析。层次化分析模型由3个层次组成,分别是基本行为层、对象层以及进程层。基本行为层主要是针对动态二进制记录的数据,抽取基本的行为信息,对象行为层是分析可执行程序对每一个操作目标所进行的行为操作。进程层主要分析可执行程序每个进程所进行的行为操作。从3个层次对行为进行分析,提供多维度行为分析视角。系统层次化分析如图1所示。
图1 系统层次化分析
1.2 基于关联性的基本行为层分析
1.2.1 API定义
API是windows提供的实现系统特定功能的函数接口。通过对大量的windows API调用进行总结和抽象,得出API的核心特征由三部分组成,首先是API的功能范畴,即该API可以实现的功能,其次是API的对象信息,即API功能的实施对象,最后是API的特征数据信息,即API实现功能的辅助数据信息。此外,在实际执行过程中,由于API执行的先后顺序不同,因此API还有时间属性。
据此,可以定义API如下:APIApiName×Object-Information×FeatureData×TimeInformation,那么,对于特定api= (n,o,f,t)∈API,n∈ApiName,o∈ObjectInformation,f ∈FeatureData,t∈TimeInformation,该定义表示名称为n的API参数对象信息是o,特征数据是f,在代码执行过程中的时间序列信息是t。
1.2.2 API间关联性定义
API间关联性是指API之间存在逻辑联系。一般而言,一组连续的API调用之间,通过特定的核心数据结构传递信息,该核心数据结构即为API的对象信息。对象信息在形式上表现为句柄、对象名称字符串以及上下文数据结构等等。因此,API之间的关联性可以定义为具有相同含义的对象信息。
对于API集合S,对于任意的m1= (n1,o1,f1,t1)∈S和m2=(n2,o2,f2,t2)∈S,如果m1与m2所表示的操作对象相同,那么认为o2=o2。因此,可以定义关联关系R,R={(m1,m2)|o1=o2,m1∈S,m2∈S},表示m1和m2具有相同含义的对象信息,m1和m2存在关联性。
1.2.3 行为的定义
行为是指完成特定功能的一组API的集合。完成特定功能的一组API之间并不是孤立的,而是存在关联性。因此,可以将行为定义为从API信息到行为信息之间的映射,即
其中m1,m2…mn的定义域为代码运行的API函数信息,action为这些API对应的行为信息,那么,该函数就表示出了API序列与行为之间的联系,只有当特定的API函数序列以及参数满足对应的行为特征时,才能识别该序列对应的行为信息。
action的核心特征由三部分组成,分别为API序列、行为操作的目标以及行为的特征数据信息,以上信息都是从对应的序列m1,m2…mn中抽取得到。API序列表示该行为的完整API序列。行为操作的目标指行为为实现功能而进行的逻辑操作对象。特征数据是指表现相同类型行为之间区别的数据信息。据此,可以将行为定义为一个四元组action= (ApiSeqeunce,ObjectInformation,Feature-Data,ProcessInfo),其 中,ApiSequence 表 示 该 行 为 的API序列,ObjectInfomation表示该行为操作的,Feature-Data表示行为的特征数据信息,ProcessInfo表示行为的进程信息。
1.2.4 基本行为抽取
恶意代码是实现特定恶意目标的一组API序列,实现该目标由若干基本的行为完成。行为抽取的目标,就是从恶意代码执行的API序列中,抽取出这些基本的行为信息。行为抽取的过程,可以分为两步,首先是对API集合进行划分,然后是对每个子集进行行为抽取。
对API集合进行划分就是将进行一个基本行为的API序列划分到一个子集中。划分的目的是将对特定对象操作的API划分到一个集合中,便于提取。根据以上对API的定义以及关联性的分析,可以通过关联关系对全部的API序列进行划分。
对于API集合S,从关联关系的定义可知,关联性关系R 满足自反性、传递性以及对称性,因此关联关系R 为等价关系。依据该等价关系,可以对API集合S进行完全划分为S1、S2、S3…Sn,即S=S1∪S2∪S3…∪Sn,且Si∩Sj=空集,i,j=1,2…n。S1、S2、S3…Sn即为基本行为单元的API集合。
对于划分出的集合Si,i∈1,2…n,根据其中的API序列m1,m2...mj的TimeInfo 进行排序,就可以得到有序的基本行为单元。然后可以将每个基本行为单元转化为一个API向量,即
最终可执行程序的全部API形成API矩阵,即
每种行为对应的行为识别函数分别为f1,f2,f3…fk,那么行为识别函数f的识别矩阵可以定义如下即
然后进行运算,即可得出行为信息
经过运算得到行为信息矩阵,每一个ActionSeti表示基本行为单元Si对应的行为信息。
在此基础上,对子集中元素的对象信息和特征数据信息,以及API的功能进行提取,作为行为的目标和功能信息,完成构建了行为的数据信息。
1.2.5 基本行为关联树模型以及算法设计
由于不同的API所包含的对象信息数量不同,按数据输入输出方向区分,可以分为引用对象信息与创建对象信息。根据API的定义,可以把ObjectInformation 定义为对象信息集合,那么对于一个API的对象信息集合ObjInfo=ObjInfo_in∪ObjInfo_out,其中ObjInfo_in 表示该API引用对象的集合,ObjInfo_out表示该API输出的对象集合。那么API的对象信息就可以分为以下5种情况。
表1 API类型
创建型API是创建了某个对象信息,会被后续的API进行引用,完成一组行为。引用创建型是一种过渡创建型API,在引用某个对象信息的同时,以此为基础进一步创建新的逻辑对象信息。引用型是最常见的API,使用对象信息进行操作,不创建新的对象信息。结束型API表示当前的对象操作结束。独立型API不涉及对象信息,能够独立完成某项功能。因此在建立API关联树时,需要将4种情况分别处理,对应不同的处理情况。
对API引用类型进行分类之后,还需要对进行API关联的对象信息进行划分,通过总结常见的API,主要把对象信息划分为如下几类,见表2。
根据划分的API类型以及关联对象类型,文章拟采用建立关联信息树的方法构建API的关联结构。关联信息树,是结合程序执行的流程特征设计的关联数据结构,关联树的根节点代表当前的可执行程序,根节点的儿子节点是可执行程序处理的对象信息,对象信息节点下的儿子节点若为引用创建型节点,那么该节点的儿子节点可以包含对象信息节点,其余API节点下无儿子节点。如图2所示。
表2 关联对象类型
图2 关联树
API关联树的建立算法如下:
步骤1 读取API数据,提取对象信息,若数据处理结束,转到步骤4;否则转到步骤2。
步骤2 根据API类型,执行对应操作:若为引用型,则首先搜索对象信息节点并判断是否具有结束标记,搜索到,添加作为儿子节点;搜索不到或者对象有结束标记,则在根节点下添加对象节点,同时将API作为儿子节点添加到该节点下。
若为创建型,则将对象信息添加到根节点下,同时将API作为儿子节点添加到该节点下。若为引用创建型,则搜索对应的对象信息节点,添加到该节点下作为儿子节点。如果没有搜索到,那么在根节点下添加对象信息节点,然后将API作为儿子节点插入到该节点下。若为结束型,则搜索对象的对象信息节点,添加到该节点下作为儿子节点,同时将为该对象添加操作结束标志。若为独立型,则将API直接添加到另外独立API关联树下,单独处理。
步骤3 转到步骤1继续读取数据。
步骤4 抽取每个对象的API信息,建立行为矩阵进行行为识别。
步骤5 抽取每个行为对应的特征数据信息。
步骤6 处理结束。
通过以上步骤,就可以建立了可执行程序的行为关联树模型,并完成行为信息抽取。最终的行为结果表示为ActionView (Object)= {api|objinfo=Object}。
1.2.6 相关数据结构
关联树的核心数据结构是对象节点的数据结构,用于存放该节点下子树所包含的行为信息。关联树中的对象节点中,存放处理过程中的对象信息、行为信息以及额外信息节点,具体节点信息如下:
其中ObjInfo是存放被节点的对象信息,vecActionInfo容器用来存放行为信息,对于行为中存在的非对象类型的重要数据信息,存放在pData中,pData的类型用dwData-Type表示,例如枚举进程行为中获取的进程信息、文件搜索行为的文件信息等,或者其他某些行为所需额外的特定信息。
2 对象层分析
2.1 对象关联
根据行为的定义可知,行为的特征包括对象信息、API序列以及特征数据3部分。其中,对象信息是决定行为划分的核心特征。因此,对于不同行为之间的关联,也需要分析不同行为间对象的联系。
对象关联是指不同的行为的对象信息都指向相同的实体对象或者逻辑对象。一般而言,对象关联产生的原因主要有两方面,一方面是是由于对同一实体对象的不同表述方式,另一方面是由于使用特定方式对原来的对象进行复制移动之后产生新的对象。对于第一种情况,是由于对象描述的多样性,一个对象信息可以有多个属性,包括名称、句柄等等,不同的行为操作可以通过操作不同的属性信息,达到操作对象的目的,而本质上行为都是发生在同一对象上的。第2种情形,是发生在对象进行移动复制,导致原有的对象属性信息发生变化,但是对象内容是相同的,例如被移动的文件等,另外,对对象的某个属性信息进行复制,也可以达到复制对象的效果,例如DuplicateHandle实现Handle属性的复制。
在实际分析过程中,由于对象数据信息不同,因此直接进行数据分析是不能提取出对象关联信息的,所以分析对象关联,需要对具有对象复制或者移动功能的函数进行分析追踪。对象关联如图3所示。
对于任 意 的2 个 基 本 行 为action1= (sequence1,objinfo1,feadata1,procinfo1)以 及action2= (sequence2,objinfo2,feadata2,procinfo2),如果2 个行为之间存在对象关联,那么定义为objinfo1≈objinfo2。
图3 对象关联
2.2 数据关联
数据关联是指不同的行为之间存在重要数据引用关系。数据关联产生的主要原因是由于在不同的API中数据属性不相同造成的。对于API本身而言,所有的数据都是统一处理,但是,在行为分析过中,需要将数据区分为对象信息数据与非对象信息数据进行处理,进而抽取行为。这样也就造成了在某一行为的API序列中的非对象信息数据,在其他行为中是对象信息数据,这样也就造成了2个行为之间的数据关联。常见的情况,例如文件搜索行为搜索到的结果信息,在文件读写行为中,就会作为对象信息进行读写操作。数据关联如图4所示。
图4 数据关联
对于任意 的2 个 基 本 行 为action1= (sequence1,objinfo1,feadata1,procinfo1)以 及action2= (sequence2,objinfo2,feadata2,procinfo2),如果action1中的特征数据中包含action2的对象信息,2个行为存在数据关联,那么定义为objinfo2∈feadata1。
2.3 对象层分析结果的抽取
对于分析的基本行为,进行对象层抽象分析。对于任意的2个基本行为action1= (sequence1,objinfo1,feadata1,procinfo1) 以 及action2= (sequence2,objinfo2,feadata2,procinfo2),如果2 个行为之间存在对象关联,即objinfo1≈objinfo2,或者存在数据关联,即objinfo1∈feadata2,或者objinfo2∈feadata1,则2个行为的操作对象具有关联性,那么针对Object对象的对象层结果如下:
ActionObjectView (Object)= {action|objinfo=Object或objinfo≈Object或Object∈feadata}。
3 进程层行为分析
由于大多数恶意代码在运行过程中,有可能会释放出很多可执行程序,不同的可执行程序完成不同的功能。为进一步分析恶意代码不同模块之间的关联,需要进行进程级行为分析。进程层分析,是通过将不同进程下的行为进行抽象提取,抽取出进程的行为信息,为进程级的行为分析提供基础。
进程级行为描述,主要包括进程的操作对象以及操作行 为, 即 ProcActionView = (ProcObjSet,ProcAction Set)。提取进程的行为主要分两部分进行,第1 步是收集进程的操作对象,第2步是收集进程的行为信息。
对于进程exe收集其对象信息,任意行为action= (sequence,objinfo,feadata,procinfo),如 果procinfo=exe,那么就将objinfo 添加到进程对象集合ProcObjSet中,收集所有行为的对象信息后,最终的ProcObjSet即为该进程的对象信息。
对于进程的行为信息ProcActionSet,就是要将属于进程exe的行为添加到其中,即ProcActionSet= {Action|procinfo=exe}。
通过以上步骤,即可提取到进程级的行为信息,提供了进程的操作对象以及进程内的行为信息,便于在进程的角度分析进程间行为。
4 系统实现结构
本文的恶意代码行为分析原型系统,主要由动态二进制平台、API关联与行为分析模块、行为间关联性分析模块以及结果分析模块四部分构称,具体如图5所示。
本系统通过在硬件模拟平台上运行虚拟操作系统windows XP,然后将动态二进制跟踪平台部署其中,相信跟踪记录恶意代码执行过程中的API序列以及数据信息。
基本行为分析模块,首先是对记录的API数据进行时间序列分析,确保执行序列的逻辑有序。然后通过API描述文件对每一个API以及其数据信息进行解析,提出对象参数以及特征数据,然后通过关联算法,建立API关联树,并抽取基本行为信息。
深度行为分析模块,首先对基本行为进行数据关联和对象关联性分析,从对象层和进程层对行为进行抽取,对基本行为进行进一步关联和综合。
结果分析模块,结果分析模块主要是对以上步骤的分析结果进行整理分析,同时通过基本行为信息与深度行为信息,对行为的性质做出判断。
图5 系统设计与实现
5 实验结果
为了验证系统对恶意行为的分析结果,从国内知名病毒论坛选取了最新收集的样本包。通过实际分析表明,系统能够实现对恶意代码的行为分析,并做出行为性质判定,具有较高准确率。
样本测试过程,选取了521 个恶意样本与473 个正常软件来验证实验结果。
下面以其中一例的分析结果来说明,如图6 所示。从关联的结果中可以看出,结果中列举了进程1.exe的行为,行为的类型包括FileAction、RegAction、ProcessAction、ServAction以及OtherAction五类,分别表示文件行为、注册表行为、进程行为、服务行为以及其他行为。具体行为如图6所示。
图6 行为抽取结果
经手工动态调试分析,结果正确。说明系统基本能够实现行为抽取分析功能。
6 结束语
本文提出了一种基于API关联性分析的层次化恶意行为分析方法。相对于传统的API分析方法,结合了API调用参数的分析,实现了对恶意代码行为和功能的抽取和分析,弥补了传统序列分析中对参数分析的不足,同时提供了层次化的分析结果,便于理解和分析恶意代码的功能,可以很大程度缩减恶意代码的分析周期,为分析人员提供重要参考,具有较强的实践意义。
[1]BAI Jinrong,WANG Junfeng,ZHAO Zongqu,et al.Malware detection method based on sensitive Native API [J].Computer Engineering,2012,38 (13):9-12 (in Chinese).[白金荣,王俊峰,赵宗渠,等.基于敏感Native API的恶意软件检测方法 [J].计算机工程,2012,38 (13):9-12.]
[2]Kyoung-Soo Han,In-Kyoung Kim,Eul Gyu Im.Malware classification methods using API sequence characteristics[C]//Proceedings of the International Conference on IT Convergence and Security,2011:613-626.
[3]XU Min,ZHAO Tianfu.Malicious code detection method based on behavior character [J].Network & Information,2009,23 (6):14-16 (in Chinese).[许敏,赵天福.基于行为特征的恶意代码检测方法 [J].网络与信息,2009,23(6):14-16.]
[4]Kyoung-Soo Han,In-Kyoung Kim,Eul Gyu Im.Detection methods for malware variant using API call related graphs[C]//Proceedings of the International Conference on IT Convergence and Security,2011:608-611.
[5]ZHANG Wen,ZHENG Quan,SHUAI Jianmei,et al.New malicious executables detection based on association rules[J].Computer Engineering,2008,34 (24):172-174 (in Chinese).[章文,郑烇,帅建梅,等.基于关联规则的位置恶意程序检测技术[J].计算机工程,2008,34 (24):172-174.]
[6]YAO Xinlei,PANG Jianmin,YUE Feng,et al.Code similarity analysis based on API dependence relation [J].Computer Engineering,2013,39 (1):80-84 (in Chinese). [姚新磊,庞建民,岳峰,等.基于API依赖关系的代码相似度分析[J].计算机工程,2013,39 (1):80-84.]
[7]LIU Shuai,WU Yanxia,MA Chunguang,et al.Method of unknown virus detection based on analysis of Win32API behaviors[J].Computer Engineering and Applications,2011,47(27):119-122 (in Chinese). [刘帅,吴艳霞,马春光,等.采用Win32API相关行为分析的未知病毒检测方法 [J].计算机工程与应用,2011,47 (27):119-122.]
[8]HAN Lansheng,GAO Kunlun,ZHAO Baohua,et al.Behavior detection of malware based on combination of API function and its parameters[J].Computer Application and Research,2013,30(11):3407-3410(in Chinese).[韩兰胜,高昆仑,赵保华,等.基于API函数及其参数相结合的恶意软件行为检测 [J].计算机应用研究,2013,30 (11):3407-3410.]
[9]Han Lansheng,Fu Cai,Zou Deqing,et al.Task-based behavior detection of illegal codes [J].Mathematical and Computer Modelling,2012,55 (1):80-86.
[10]Seifert C,Welch I,Komisarczuk P.Identification of malicious web pages with static heuristics [C]//Proceedings of the Australasian Telecommunication Networks and Applications Conference,2008:91-96.