基于函数调用图指纹的恶意软件检测方法转让专利

申请号 : CN201510442809.4

文献号 : CN105046152B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王俊峰白金荣

申请人 : 四川大学

摘要 :

本发明提供了一种基于函数调用图指纹的恶意软件检测方法,包括:判断已知恶意软件样本是否加壳;进行反汇编处理,得到恶意软件样本的汇编代码;以函数为结点,函数间的调用为边,生成函数调用图;函数调用图作为该样本的指纹,加入图指纹库;判断待检测样本是否加壳;进行反汇编处理,得到待检测样本的汇编代码;基于汇编代码生成待检测样本的函数调用图,该图作为检测样本的指纹;将待检测样本的函数调用图指纹和图指纹库中每一个图都进行同构判断等步骤。本发明使用函数调用图作为软件的指纹,充分利用函数调用图是一种特殊的图的性质来识别大部分恶意软件及其变种,识别时间短、效率高。

权利要求 :

1.一种基于函数调用图指纹的恶意软件检测方法,其特征在于,包括生成函数调用图指纹库和检测恶意软件两部分;

生成函数调用图指纹库:

步骤1,判断已知恶意软件样本是否加壳,若加壳,进行脱壳处理,若未加壳,进行后续步骤;步骤2,进行反汇编处理,得到样本的汇编代码;步骤3,以函数为结点,函数间的调用为边,生成函数调用图;步骤4,函数调用图作为该样本的指纹,加入图指纹库;

检测恶意软件:

步骤5,判断待检测样本是否加壳,若加壳,进行脱壳处理,若未加壳,进行后续步骤;

步骤6,进行反汇编处理,得到待检测样本的汇编代码;步骤7,基于汇编代码生成待检测样本的函数调用图,该图作为检测样本的指纹;步骤8,将待检测样本的函数调用图指纹和图指纹库中每一个图都进行同构判断,若同构,则该样本为恶意软件,若和图指纹库中的所有图都不同构,则为良性软件;在所述步骤8中,同构判断的方法如下所示,称之为FCGiso图同构判断,具体为:STEP1:对于待判断是否同构的两个有向图G1(V1,E1)和G2(V2,E2),判断G1的结点数和G2的结点数是否相等,若不相等,则图G1和图G2不同构;若相等,再判断有向图的边数;

STEP2:判断G1的边数和G2的边数是否相等,若不相等,则图G1和图G2不同构;若相等,进行后续判断;

STEP3:对于图G1的任意一个结点v,获取图G1中v的直接后继结点集合outnodes1,基于v的结点唯一标记,从图G2中查找得到与v结点标记相同的结点v',获取图G2中v'的直接后继结点集合outnodes2,若outnodes1集合和outnodes2集合的结点数和结点的标记不相同,则图G1和图G2不同构;若相同,则继续STEP3的判断方法判断下一个结点,直到判断完所有结点;

STEP4:若从STEP1到STEP3都没有判断图G1和图G2不同构,则图G1和图G2同构。

2.如权利要求1所述的基于函数调用图指纹的恶意软件检测方法,其特征在于,在所述步骤1和步骤5中,使用PEID判断是否加壳,采用动态通用脱壳工具Ether进行脱壳。

3.如权利要求1或2所述的基于函数调用图指纹的恶意软件检测方法,其特征在于,若有不成功的样本脱壳,则使用加壳工具的逆向工具进行手动脱壳。

4.如权利要求1所述的基于函数调用图指纹的恶意软件检测方法,其特征在于,所述步骤2和步骤6中的反汇编处理使用IDA Pro。

5.如权利要求1所述的基于函数调用图指纹的恶意软件检测方法,其特征在于,在所述步骤3中,还包括使用正整数命名函数。

说明书 :

基于函数调用图指纹的恶意软件检测方法

技术领域

[0001] 本发明涉及网络安全中恶意软件检测领域,特别涉及一种基于函数调用图指纹的恶意软件检测方法。

背景技术

[0002] 随着信息技术的发展,互联网正深刻地改变着人类的生产生活方式,人们越来越离不开网络,随之而来的是各种“安全”问题。人们深得网络发展之利,也深受网络攻击之害,网络空间安全问题已成为困扰世界的严峻挑战。根据中国互联网协会、国家互联网应急中心发布的《中国互联网站发展状况及其安全报告(2015)》统计显示,截至2014年12月,我国网民规模达6.49亿,全年共计新增网民3117万人,互联网普及率为47.9%。2014年,有46.3%的网民遭遇过网络安全问题,我国个人互联网使用的安全状况不容乐观。在安全事件中,账号和密码被盗情况最为严重,分别达到26.7%和25.9%。
[0003] 软件的安全性是网络安全的重要组成部分。软件内部存在缺陷、错误、故障、失效,软件外部存在病毒、木马、蠕虫等恶意软件,造成了安全性分析具有高度的复杂性。尽管研究人员已经做了大量工作,但是恶意软件的现有检测技术依然有很大的局限性。反病毒软件是利用恶意软件或被感染文件的特征码(即每种恶意软件所独有的十六进制代码串)进行扫描检测,这种传统方式几乎不能检测新的恶意软件种类,能检测的恶意软件经过简单加壳或混淆后又不能检测,特定恶意软件在被反病毒软件查杀之后很容易进行免杀处理。据Symantec公司发布的2015互联网安全威胁报告,基于特征码的方法仅能检测2014年捕获的所有恶意软件中的13.9%。
[0004] 恶意软件作者使用加壳和混淆技术对已有的恶意软件进行处理,产生了大量的恶意软件变种。据Symantec公司发布的2015互联网安全威胁报告,2014年十大恶意软件族类的样本数目占全年捕获所有恶意软件样本的33%。反病毒专家每天捕获大量的未知软件样本,需要迅速地判断未知样本是否为已知的恶意软件或已知恶意软件的变种。当前,反病毒专家主要使用样本的hash签名标识样本,但hash签名非常敏感,样本有一个字节的微小变化,都会产生不同的hash签名,该方法弹性较差。此外,反病毒专家需要对收集的所有恶意软件样本进行归类和索引,建立恶意软件的族群和族谱,以方便新样本的比对和查找。目前,这部分工作是基于反病毒专家的专业知识分析处理,还没有自动化的工具。
[0005] 李德毅院士在一篇报告中指出“软件应以网络结构表示”。也就是说,软件都具有网络的拓扑结构,一般可以用图表示。图可以在较高层次描述软件的结构,为研究者提供一个整体和全局的视角来唯一标识软件。研究人员对基于图的恶意软件检测方法已进行了初步研究,这些方法将软件表示成操作码有向图、控制流图、数据流图、系统调用图,然后通过相似性度量、数据挖掘和机器学习等方法实现恶意软件的检测。这些方法从不同的角度探索解决恶意软件检测问题,提出了不同思路的基于图的恶意软件检测方法,取得了许多富有建设性的成果,但仍存在以下几个问题:1)基于图相似性度量的检测方法效率不理想,对结点较多的图在有限时间内无法完成。2)部分图表示方法粒度较细,导致图的规模和复杂度较高。3)对混淆过的恶意软件,一些检测方法不能检测出。

发明内容

[0006] 本发明所要解决的技术问题是提供一种基于函数调用图指纹的恶意软件检测方法,采用了函数调用图作为软件的指纹来检测出恶意软件,识别率高。
[0007] 为解决上述技术问题,本发明采用的技术方案是:
[0008] 一种基于函数调用图指纹的恶意软件检测方法,包括生成函数调用图指纹库和检测恶意软件两部分;
[0009] 生成函数调用图指纹库:
[0010] 步骤1,判断已知恶意软件样本是否加壳,若加壳,进行脱壳处理,若未加壳,进行后续步骤;步骤2,进行反汇编处理,得到恶意软件样本的汇编代码;步骤3,以函数为结点,函数间的调用为边,生成函数调用图;步骤4,函数调用图作为该样本的指纹,加入图指纹库;
[0011] 检测恶意软件:
[0012] 步骤5,判断待检测样本是否加壳,若加壳,进行脱壳处理,若未加壳,进行后续步骤;步骤6,进行反汇编处理,得到待检测样本的汇编代码;步骤7,基于汇编代码生成待检测样本的函数调用图,该图作为检测样本的指纹;步骤8,将待检测样本的函数调用图指纹和图指纹库中每一个图都进行同构判断,若同构,则该样本为恶意软件,若和图指纹库中的所有图都不同构,则为良性软件。
[0013] 根据上述方案,在所述步骤8中,同构判断的方法为FCGiso图同构判断,具体为:
[0014] STEP1:对于待判断是否同构的两个有向图G1(V1,E1)和G2(V2,E2),判断G1的结点数和G2的结点数是否相等,若不相等,则图G1和图G2不同构;若相等,再判断有向图的边数;
[0015] STEP2:判断G1的边数和G2的边数是否相等,若不相等,则图G1和图G2不同构;若相等,进行后续判断;
[0016] STEP3:对于图G1的任意一个结点v,获取图G1中v的直接后继结点集合outnodes1,基于v的结点唯一标记,从图G2中查找得到与v结点标记相同的结点v',获取图G2中v'的直接后继结点集合outnodes2,若outnodes1集合和outnodes2集合的结点数和结点的标记不相同,则图G1和图G2不同构;若相同,则继续用STEP3的判断方法判断下一个结点,直到判断完所有结点;
[0017] STEP4:若从STEP1到STEP3都没有判断图G1和图G2不同构,则图G1和图G2同构。
[0018] 根据上述方案,在所述步骤1和步骤5中,使用PEID判断是否加壳,采用动态通用脱壳工具Ether进行脱壳。
[0019] 根据上述方案,若有不成功的样本脱壳,则使用加壳工具的逆向工具进行手动脱壳。
[0020] 根据上述方案,所述步骤2和步骤6中的反汇编处理使用IDA Pro。
[0021] 根据上述方案,在所述步骤3中,还包括使用正整数命名函数。
[0022] 与现有技术相比,本发明的有益效果是:1)使用函数调用图作为软件的指纹,充分利用函数调用图是一种特殊的图(图的结点带唯一标记),有较强的唯一标识性,又具备较好的弹性(加壳和混淆后的变种指纹不变)的特点来识别恶意软件变种,识别率高,能识别大部分恶意软件变种。2)函数调用图指纹自动产生,无需专业人员手动分析提取,函数调用图在较高层次描述软件的结构,粒度较粗,有效缩减了图的规模。3)可用于恶意软件的深度识别,大规模软件样本的索引和查找,恶意软件变种的分析归类。4)本发明提供的方法与操作系统平台无关,可用于Windows、Unix、Linux、Android等平台。

附图说明

[0023] 图1是本发明基于函数调用图指纹的恶意软件检测方法的检测流程示意图。
[0024] 图2是FCGiso图判断同构的方法的程序代码示意图。
[0025] 图3是Backdoor.Win32.Sepro样本的函数调用图(以函数名标识结点)。
[0026] 图4是Backdoor.Win32.Sepro样本的函数调用图(以正整数命名结点)。
[0027] 图5是使用FCGiso图同构判断方法对每个良性软件与图指纹库进行同构判断的时间。
[0028] 图6是使用FCGiso图同构判断方法对每个恶意软件与图指纹库进行同构判断的时间。
[0029] 图7是使用VF2图同构判断方法对每个良性软件与图指纹库进行同构判断的时间。
[0030] 图8是使用VF2图同构判断方法对每个恶意软件与图指纹库进行同构判断的时间。

具体实施方式

[0031] 本发明的目的是提供一种基于函数调用图指纹的恶意软件检测方法,通过建立恶意软件的函数调用图指纹库,将待检测文件的函数调用图指纹与指纹库中的指纹进行图同构判断,可有效地检测已知恶意软件,同时可检测大部分使用加壳或混淆技术产生的变种。此外,针对函数调用图是结点带唯一标记的特殊图,本发明提出一种图同构判断方法,该方法在检测结果和时间效率上优于经典的图同构方法。
[0032] 对二进制可执行文件反汇编后的汇编代码由许多函数组成,各个函数之间的关系主要表现为调用关系。一个函数调用其他的函数提供的功能来满足自身函数的需求,同时获取被调用函数的返回值。程序可表示为函数调用图,每个函数作为图的结点,函数间的调用作为图的边,该图的每个结点使用函数名或正整数作为结点的唯一标记。由于不同的两个程序函数调用图结构相同且图的每个结点标记相同的概率较小,函数调用图可以作为该程序的指纹,唯一标识该程序。本发明将程序表示为函数调用图,应用图同构方法判断未知程序是否为恶意软件。函数调用图粒度较粗,非常稀疏,且结点带唯一标记,利用结点标记的辅助可较短时间内判断两个图是否同构。
[0033] 如图1所示,本发明基于函数调用图指纹的恶意软件检测方法分为两部分:函数调用图指纹库的生成和恶意软件的检测。
[0034] 函数调用图指纹库的生成流程为:(1)对于已知的恶意软件样本,判断样本是否加壳,若加壳,进行脱壳处理;若未加壳,进行下一步处理;(2)进行反汇编处理,得到恶意软件样本的汇编代码;(3)汇编代码由多个函数组成,函数间存在调用关系,以函数为结点,函数间的调用为边,生成函数调用图,该图是有向图;(4)函数调用图作为该样本的指纹,加入图指纹库。
[0035] 恶意软件的检测流程为:(1)对于待检测样本,判断样本是否加壳,若加壳,进行脱壳处理;若未加壳,进行下一步处理;(2)进行反汇编处理,得到待检测样本的汇编代码;(3)基于汇编代码生成待检测样本的函数调用图,该图作为检测样本的指纹;(4)将待检测样本的函数调用图指纹和图指纹库中每一个图进行同构判断,若同构,则该样本为恶意软件;若和图指纹库中的所有图都不同构,则为良性软件。
[0036] 图同构问题可表述为检验看起来不相同的两个图是否实际上是结构相同的。该问题已经理论上证明是NP问题,但尚不能确定是否是P类问题或是NP完全问题。
[0037] 图同构的定义为:给定两个图G1=,G2=,图同构判断就是检验图G1和图G2的结点是否存在一一映射,同时映射后结点间的邻接关系保留。可用符号描述为:若存在双射函数f:V1→V2,对 则图G1和图G2同构。根据图同构的定义,同构的两个图需满足以下三个必要条件:(1)结点数相同;
(2)边数相同;(3)匹配的结点对的邻接结点也存在一一匹配。
[0038] 若待匹配的两个图的结点已经被标记,且同一图中每个结点的标记是唯一的,可使用结点标记将要进行图同构判断两个图的结点进行一对一的映射,若两个图的结点一一对应关系已经确定,以上三个必要条件也就变为充分必要条件。可执行文件经过反汇编后生成的函数调用图,结点已经被唯一的进行了标记,且每一次反汇编后生成的函数调用图的结点所带标记都相同,是一种结点带唯一标记的特殊图,可使用以上三个条件进行图同构的判断。基于以上的分析,本发明提出一种针对函数调用图的特殊图同构方法FCGiso,如图2所示,流程如下:
[0039] 对待判断是否同构的两个有向图G1(V1,E1)和G2(V2,E2)
[0040] (1)判断G1的结点数和G2的结点数是否相等,若不相等,则图G1和图G2不同构;若相等,则继续下一步;
[0041] (2)判断G1的边数和G2的边数是否相等,若不相等,则图G1和图G2不同构;若相等,则继续下一步;
[0042] (3)对于图G1的每一个结点v,重复步骤(4)到步骤(7)的处理过程;
[0043] (4)获取图G1中v的直接后继结点集合outnodes1;
[0044] (5)基于v的结点唯一标记,从图G2中查找得到与v结点标记相同的结点v';
[0045] (6)获取图G2中v'的直接后继结点集合outnodes2;
[0046] (7)若outnodes1集合和outnodes2集合的结点数和结点的标记不相同,则图G1和图G2不同构;若相同,转到步骤(3)继续判断下一个结点,直到判断完所有结点;
[0047] (8)若前面的步骤都没有判断图G1和图G2不同构,则图G1和图G2同构。
[0048] 本发明中,对于一个样本,使用PEID进行是否加壳的判断。若样本加了壳,使用动态通用脱壳工具Ether进行脱壳处理,有部分样本脱壳不能成功,使用加壳工具的逆向工具进行了手动脱壳处理。
[0049] 使用IDA Pro进行了反汇编处理,得到样本的汇编代码。对样本文件反汇编后的汇编代码中可以清晰地看出函数以及函数之间的调用关系,函数的定义以及参数情况以及相关的注释。在反汇编的过程中,IDA Pro根据指令的控制流来自动处理每一个函数的结构,若一段代码具有完整的函数结构,将该代码段当做一个函数处理。
[0050] 在反汇编处理后生成的汇编代码中,各个函数之间的关系主要表现为调用关系。一个函数调用其他的函数提供的功能来满足自身函数的需求,通过调用来间接地获取被调用函数返回值中需要的数据或者是某种功能。可用两种方式对函数结点命名:(a)将能识别的函数自动命名为签名库中的原始函数名,对于不能识别函数名的结构,使用该函数的起始地址命名,如图3所示。(b)使用唯一的正整数为每个函数命名,每次反汇编后命名一致,如图4所示。由于加壳或混淆处理后的样本部分函数的起始地址发生了变化,导致部分函数名发生了变化。若使用唯一的正整数命名函数,加壳或混淆过的恶意软件的函数名没有发生改变,且每次反汇编后命名一致。本发明使用唯一的正整数命名函数,以函数为结点,函数间的调用关系为边,生成函数调用图,以该函数调用图作为该软件的指纹。
[0051] 为了验证本发明基于函数调用图指纹的恶意软件检测方法的有益技术效果,特用三个具体的实施例进行说明。
[0052] 实施例1:
[0053] 本实施例主要评估本发明方法是否能有效地检测已知恶意软件。本实施例使用了4985个良性软件样本和5340个恶意软件样本,使用所有的恶意软件样本生成函数调用图指纹库,所有的良性软件和恶意软件作为测试样本评估检测方法的检测率、误报率、准确率。
为了和本发明提出的图同构方法FCGiso进行对比,经典的图同构方法VF2也被用于图同构判断。实验结果如表1所示,使用FCGiso图同构判断方法的检测时间如图5、图6所示,VF2图同构判断方法的检测时间如图7、图8所示。
[0054] 表1已知恶意软件的检测结果
[0055]图同构算法 检测率(%) 误报率(%) 准确率(%)
VF2 100 0.02 99.9
FCGiso 100 0 100
[0056] 如表1所示,本发明提供的图判断方法FCGiso取得了100%的检测率,0%的误报率。而经典的图同构方法VF2取得了100%的检测率,但存在0.02%的误报率。当样本数量较大时,不同的两个样本图结构存在相同的可能性,但图结构相同且图的每个结点标记相同的概率较小,除非两个样本有较紧密的联系,如恶意软件和加壳或混淆后的恶意软件变种。经典的图同构方法VF2只是基于图的结构判断两个图是否同构,样本量大时存在误报。本发明提供的图判断方法FCGiso基于图的结构和结点的标记进行图同构判断,存在误报的可能性非常小。
[0057] 从图5、图6的FCGiso方法的图同构判断时间可以看出,良性软件和恶意软件图指纹库进行同构判断的时间在0.02秒左右,因为大部分样本使用结点数和边数是否相等就可判断不同构,方法效率较高。恶意软件测试样本和恶意软件图指纹库进行同构判断的时间随结点的个数增加而稳步上升,这是因为待判断样本必然和图指纹库中的某一图指纹同构,需要遍历整个图进行图同构判断,随着图结点个数的增加,判断的时间也相应增加。即便如此,当图的结点数达到7300个时,也仅用了11.43秒就完成图同构的判断。从图7、图8的VF2方法的图同构判断时间可以看出,良性软件和恶意软件图指纹库进行图同构判断的时间也在0.02秒左右,但恶意软件测试样本和恶意软件图指纹库进行同构判断的时间随结点的个数增加而稳步上升,最大结点样本的判断时间是27.51秒。
[0058] 对比图5、图6的FCGiso和图7、图8的VF2两种方法图同构判断的时间,本发明提供的FCGiso方法明显优于VF2方法。
[0059] 实施例2:
[0060] 本实施例主要评估本发明方法是否能有效地检测加壳的已知样本。首先使用9种加壳工具对样本notepad.exe和calc.exe进行加壳,使用原始的两个样本生成函数调用图指纹库,用加壳过的18个样本作为测试样本,实验结果如表2所示。
[0061] 表2.加壳变种检测结果
[0062]
[0063] 从表2可以看出,本发明方法可以检测出大部分加壳的变种。ASProtect加壳过的样本不能检测,主要是该工具使用了压缩、加密、反调试、反汇编技术,从而导致通用的脱壳工具不能脱壳成功。此外,原始样本文件、加壳后的文件、脱壳后的文件大小都不相同,从而可以判断基于hash签名的方法对加壳过的样本无效。本发明方法主要受制于脱壳工具,若使用较理想的脱壳工具,应该可以检测所有的加壳恶意软件样本。
[0064] 实施例3:
[0065] 本实施例主要评估本发明方法是否能有效地检测恶意软件变种。本实施例选取了4个恶意软件家族,部分样本是混淆产生的变种,部分是对已知的恶意软件进行修改或功能扩充后的变种。首先选取每个家族的一个样本生成函数调用图指纹库,将每个家族的其它样本作为测试样本,检测结果如表3所示。
[0066] 表3恶意软件变种检测结果
[0067]
[0068] 从表3可以看出,本发明方法可以检测同一家族的大部分变种。常用的混淆技术主要有垃圾指令插入、等价指令替换、寄存器置换、指令顺序置换、指令控制流变换,前4种技术不会改变样本的函数调用图,本发明方法仍然有效,最后1种技术有可能改变样本的函数调用图,本发明方法对函数调用图发生改变的样本无效。对于修改或功能扩充原始样本后的变种,若只是局部的修改,样本的函数调用图没有发生改变,本发明方法仍然有效。但若是整体或大的功能修改产生的变种,本发明方法无效。总的来说,本发明方法对大部分变种是有效的,对于函数调用图发生改变的变种,可将该变种加入指纹库,则该变种分支就可被正确检测。