一种针对恶意软件变种的高效识别算法的制作方法

文档序号:13073003阅读:480来源:国知局
一种针对恶意软件变种的高效识别算法的制作方法与工艺

本发明属于信息安全技术领域,涉及一种针对恶意软件变种的高效识别算法。



背景技术:

在信息安全领域,对计算机恶意行为的自动分析是一个重要研究领域,同时也是一个相当有难度的问题。如果自动分析能够做到实用化,将大大提升人们对抗恶意软件的效率。目前的分析技术大多数是基于机器学习的。但是,传统的机器学习算法需要相当多的样本进行训练,换言之,其算法设计的前提假设是样本数目无穷大,而且数据的规律性很强。而在我们的实际工作中,在恶意行为检测领域获取的数据很难满足这一要求,因此自动分类的准确性还不尽如人意。另一方面,目前常用的分类算法不仅训练时间长,而且在实际使用中,分类时间也比较长。在做大规模的在线自动分析时,其性能也将成为瓶颈。为了部分解决这一问题,我们引入了时间序列分析技术。

虽然时间序列技术在恶意行为分析领域中的应用研究取得了一些进展,但暂时还达不到实用效果。我们认为主要是因为以下几个原因:

(1)传统的分类算法过于复杂,时空开销大,不适用于在线实时分析这样对性能要求高的场合。

(2)分类的准确性不如人工分类,暂达不到实用要求。比如knn算法,在对恶意进程进行分类时错误率比较高,这是因为某些程序可能同时属于两个类别,为了分类的唯一性,需要为每个类别确定一个阈值,而阈值的确定并没有什么理论指导,只能通过实验反复测试调整获得,这极大地增加了工作量,而且不能保证通用性。n-gram模型的问题在于序列长度的选择无法给出好的方案,而检测性能又依赖于序列长度的选择。

(3)时间序列中数据的选取方法存在偏差。无论是以指令序列还是以api调用序列作为原始数据,都无法准确表示程序的行为。指令序列的可变性在前面两章已经有较多的叙述,而api调用的多变性也远远超出许多研究者的预计。比如程序要实现一个简单的创建文件功能,系统提供的api就有如下几种:createfile、openfile、ntcreatefile、ntopenfile、ntcreateprofile、ntcreatesection、ntopensection、ntcreateiocomplection以及ntcreateiocomplection等。只要研究者忽略了其中任何一个api函数,而被分析的程序刚好又调用了此函数来完成预定功能,则分析结果很有可能出错。在很多情况下,恶意软件为了逃避分析,编制者还会故意调用极为生僻或者已经被淘汰的api函数,这就更增加了分析出错的可能性。

(4)传统的分类算法要求训练样本充分大,如果实际数据无法满足这一要求,则仿真产生的数据也应满足这一要求。在研究中,大多数研究人员是通过仿真数据来进行实验的。但在恶意行为分析领域,获取真实的软件行为数据是一项非常消耗人力和时间的工作,研究者很难获取大量的实际数据。而仿真数据与恶意代码的实际行为往往有着较大的差异,不能完全模拟程序行为。



技术实现要素:

本发明的目的在于针对现有技术中存在的不足,提供一种针对恶意软件变种的高效识别算法。首先对所有要进入分类器进行分析的程序行为进行一次基于时间序列分析的预处理,该处理的结果能够保证对恶意软件的误判率为0,即被系统判定为恶意软件的程序一定是恶意软件;而未被判定为恶意软件的程序才进入分类器做进一步的判断。尽管增加了一次判断过程,但由于能够过滤掉那些具备显著恶意行为特征的程序,降低了分类器的工作量,整个系统的效率反而能够提高。

其具体技术方案为:

一种针对恶意软件变种的高效识别算法,包括以下步骤:

输入:恶意行为时间序列t={t1,t2,……,tm}和待匹配的行为时间序列s={s1,s2,……,sn};

输出:lcs(tm,sn)的长度,lcs(ti,sj)的长度用len(i,j)来表示;

(1)初始化,l(i,0)=0,l(0,j)=0,0≤i≤m-1,0≤j≤n-1;令i←1;

(2)分别计算s1,s2,……,sn的simhash值;

(3)分别计算t1,t2,……,tm中不含通配符元素的simhash值;

(4)j←1;

(5)如果ti含有通配符,则根据sj进行特例化处理,然后计算ti的simhash值;

(6)如果simequal(ti,sj)=1,则len(i,j)=len(i-1,j-1)+1,然后转(9);

(7)如果len(i-1,j)≥len(i,j-1)则len(i,j)=len(i-1,j),然后转(9);

(8)len(i,j)=len(i,j-1);

(9)j←j+1,如果j<n则转(5);否则转(10);

(10)i←i+1,如果i≤m则转(4);否则转(11);

(11)返回len(m,n)。

进一步,所述算法求出待判断的行为序列s与恶意行为序列t的最长公共子串的长度len(s,t),按照以下公式计算s对于t的相似度:

其中|t|表示t的长度,similar(s,t)的值一定介于[0,1]之间,越接近1,表示s与t之间的相似度越高。

进一步,当s与t的相似度超过该阈值时,即断定s是t的变种;这里没有任何经验可供参考,利用实验将阈值从1开始逐步往下调整,到第一次出现误判时,将该阈值定为底线。

与现有技术相比,本发明的有益效果:

本发明既利用了simhash匹配效率高的特点,又利用了lcs能够略过时间序列中大量噪音的特点,同时还保留了原始数据中的细节,实验表明设计出的算法能够判断出恶意软件的变种,满足了预期目标,比传统的时间序列分析算法效果都要好。

附图说明

图1是生成的hash值示意图;

图2是字符串特例化算法;

图3是阈值与误报数、漏报数关系图。

具体实施方式

下面结合附图和具体实施方案对本发明的技术方案作进一步详细地说明。

分类算法的基本思想

将时间序列分析技术用于恶意代码行为领域的主要目的是为了分类。该目的可描述如下:设a是恶意软件集合,b是非恶意软件集合,c是所有软件的集合,且a∩b=φ,a∪b=c。f是用于分类的算法,x∈c是被分析的程序,f(x)是对x的分类结果,若有f(x)=1,则称x是恶意软件;若有f(x)=0,则称x是非恶意软件。

实际上由于技术上的限制,分类算法f的设计往往存在一些缺陷,导致分类结果不够准确,为了描述方便,引入下面的定义:

定义漏报与漏报集

有x∈a,但f(x)=0,称x被算法f漏报。集合q={xi|i=1,2,……n,xi均被算法f漏报}被称为漏报集。若被算法f漏报,均有xi∈q,则称q为漏报全集。

定义误报与误报集

有x∈b,但f(x)=1,称x被算法f误报。集合p={xi|i=1,2,……n,xi均被算法f误报}被称为误报集。若被算法f误报,均有xi∈p,则称p为误报全集。

定义漏报率

s={xi|i=1,2,……n}是包含恶意软件和非恶意软件的测试样本集,集合sa={xi|i=1,2,……m,xi∈s∩a}是其中恶意软件的集合,集合sb={xi|i=1,2,……k,xi∈s∩b}是其中非恶意软件的集合,且sa∪sb=s。集合q是算法f的漏报全集,则称为算法f的漏报率。

定义误报率

s={xi|i=1,2,……n}是包含恶意软件和非恶意软件的测试样本集,集合sa={xi|i=1,2,……m,xi∈s∩a}是其中恶意软件的集合,集合sb={xi|i=1,2,……k,xi∈s∩b}是其中非恶意软件的集合,且sa∪sb=s。集合p是算法f的误报全集,则称为算法f的误报率。

定义完美分类算法

若存在分类算法f对测试样本集s的漏报率和误报率均为0,则称算法f是s上的完美分类算法。

目前大多数学者努力的方向是找到这样的完美分类算法,或者近似完美分类算法。但由于各种条件的限制,目标的实现还显得非常遥远。在实际工作中发现,误报率和漏报率是反向相关的,误报率低的必定漏报率高,反之亦然。

为了实际工作的需要,换了一种思路:与其追求一个完美的分类算法而不可得,不如设计一个更适合实际工作需要的算法。可以将基于时间序列的分类算法看成是一个预处理过程,它的分类结果只需要部分可信,而剩余的部分则作为其它分类算法的输入数据,做进一步的分类处理,这样做可以降低后续分类处理的工作量。

针对恶意软件行为分析的实际情况,需要设计一个这样的分类算法f:当f(x)=1时,则x必定是恶意软件;当f(x)≠1时,则x的类别不确定,需要进一步采用其他分类算法确定。也就是说,分类算法f的漏报率可以处于比较高的状态,但误报率一定是0。同时,作为预处理过程,该算法的效率必须要远高于传统的分类算法,这样才能提升整个系统的效率。

之所以制定误报率为0的目标,是基于这样一种实际情况:尽管目前的恶意软件数以百万甚至千万计,但其中大多数恶意软件都是其他恶意软件的变种。以著名病毒熊猫烧香为例(该病毒实际上也是尼姆亚病毒的变种,不过由于其核心代码部分有变化且造成的实际影响远远大于尼姆亚病毒,所以业界为其单独命名),据瑞星统计,该病毒的变种被捕获的就有90种之多。这些变种相对于原型而言,多数采用了加壳、加密、插花等代码变形技术来逃避安全软件的静态检测,也有部分加入了一些新的功能,但其基本功能(行为)变化很小。也就是说,这些变种和原型的行为时间序列之间存在很大的相似性。另外,还有相当一部分恶意软件是由其他一些恶意软件拼装而成,于是其行为的时间序列部分片段也和其组成成分的时间序列存在相似性。

基于以上情况,可以人工分析一些典型性的恶意软件,分别记录这些软件的恶意行为时间序列。在对可疑程序进行分析时,如果其行为序列与这些典型行为序列中的某一个有足够高的相似度,就可判定其为这个程序是某个恶意软件的变种,无需再进行其他分类;如果它的行为不与任何一个已知的恶意行为时间序列相似,则其类型未定,还需进行下一步的分类判断。

simhash-lcs算法的描述和实现

利用前面的基本思路来设计合适的分类算法。首先需要记录下恶意软件行为,并将其转换成算法能够处理的数据,然后才能进行相似性计算。

行为特征描述

恶意软件行为多种多样,要进行统一的描述有很大的困难。前面已经分析过,如果直接记录行为本身,无论是指令序列还是api调用序列,都存在明显的不足,因此采用记录行为结果的方法。

早在2005年,朱国强等人就提出了一种类似于行为结果记录的方式,他将某蠕虫程序发动攻击时所表现的行为记录如下:

open,write,close,socket,bind,listen,accept,read,fork

这种只记录行为类别的方式清晰明了,也易于程序处理,但问题是这种记录方式显得过于粗糙,容易发生误判,因为正常程序的网络行为也很可能是这个序列。观察了foxmail程序的收信动作,与该序列也完全匹配。再如,同样用write写一个文件,写在系统目录下和写在用户目录下,对系统造成的潜在威胁完全不可同日而语。还有,findwindow函数查找普通窗口和查找杀毒软件窗口,其潜在的威胁性也相差甚大。因此,在记录行为时,不仅要记录行为的种类,还需要更精确地记录行为的相关参数。

以熊猫烧香为例,它的恶意行为按照以下顺序执行:

(实际上该病毒的程序行为很多,只需记录其中的恶意行为):

1、将自己复制到系统驱动程序目录下,生成spoclsv.exe文件;

2、在注册表中为自己添加自启动项,然后循环执行下面的操作:

3、寻找其他进程窗口,并关闭窗口标题中含有反病毒相关信息的程序;

4、查找并中止系统中知名的杀毒软件进程;

5、自动链接到病毒作者指定的网址;

6、检查系统中是否存在admin$共享,如果共享存在则调用系统中的net命令关闭该共享;

7、在后台偷偷下载病毒作者指定的远程文件;

8、删除安全软件在注册表自启动项,使得这些杀毒软件下次无法启动;

9、修改注册表中关于显示隐藏文件的项目值,使得系统无法显示隐藏文件,并且不能通过正常方式改回;

10、删除安全相关服务;

11、染扩展名为exe和com的文件,把自己附加到pe文件的头部;

12、修改扩展名为htm、html的文件,在其后面添加病毒作者指定的网址;

13、删除扩展名为gho的文件。

对于进程的每一条行为,采用下面的3元组来进行描述:

v3=(t,a,p)

其中,t表示该行为所属的大类,其类别就是本文第二章所介绍的行为类别;a表示该行为的所属大类的具体动作;p是描述该行为的参数。

对于熊猫烧香的上述行为,用3元组描述如下:

1、(file,create,c:\windows\system32\drivers\spoclsv.exe)

2、(register,create,hkey_local_machine\software\microsoft\windows\currentversion\run\-c:\windows\system32\drivers\spoclsv.exe)

3、(function,findwindow,病毒,)

4、(process,terminate,*)

5、(network,linkout,http://www.whboy.com.cn.,)

6、(process,create,net)

7、(network,linkin,*.exe)

8、(register,delete,hkey_local_machine\software\microsoft\windows\currentversion\run-*)

9、(register,modify,hkey_local_machine\software\microsoft\windows\currentversion\explorer\advanced\folder\hidden\showall-checkedvalue)

10、(service,delete,kpfwsvc)

11、(file,modify,*.exe)

12、(file,modify,*.com)

13、(file,modify,*.html)

14、(file,delete,*.gho)

3元组中出现的*表示该项可匹配任何字符串。上面的3元组中不需要记录时间信息,因为其在序列中的位序已经包含了相互间的时间关系。

数据变换算法

对于被分析的程序,可以利用前面两章介绍的方法捕获其行为,然后也按照上述3元组的方式进行记录,现在的问题就变成了如何比较两个3元组序列之间的相似性。将这个问题抽象描述如下:

已知模式序列t={xi|i=1,2,3……n,xi∈v3}和正文序列s={yi|i=1,2,3……m,yi∈v3},一般情况下有n<<m,求t与s之间的相似度。

要求t与s之间的相似度,传统的的方法是求t与s之间的欧氏距离,然后利用knn、svm等算法进行分类。但是基于欧式距离的算法在这里存在两个问题:(1)要求序列之间等长,(2)采用移位方式会对匹配结果造成很大影响。这里不仅t与s不等长,xi与yj之间的各个分量也不等长。如果直接利用传统分类算法,必须将数据转换成等长向量,但同时还需要保持尽量多的时间序列信息,这两个要求是相悖的,处理起来难度比较大。

先来解决第一个问题,就是如何将数据元素转换成等长值的问题。只要在转换过程中不改变元素的位序,则时间序列信息仍然会保留,对它的处理留给匹配算法去解决。

前面定义的3元组,各个分量是长度不相同的字符串。一种简单的处理方法是将这3个字符串合并成1个,就只需要解决将字符串转换成一个向量或者标量的问题。这类转换最常用的方法是设计hash函数,自行设计的hash函数如公式1所示:

其中,n是字符串s的长度,si是其中的每个字符,k在此处为24。

这个hash函数能够将任意长度的字符串转换成为一个[0,232-1]的整数。该hash函数设计简单,效率很高,对于长度为n的字符串,其计算的时间复杂度为o(n)。但是这个hash函数与传统的hash函数一样存在一个问题:雪崩效应。比如两个字符串s1和s2,只要其中有一个字符不相同,就会导致hash(s1)和hash(s2)的值差距很大。换言之,两个欧氏距离很小的字符串,其hash值差距可能很大,这一特性对于其他存储、查找数据的场合不会有什么影响,但对于做两个字符串的相似性检测是非常不利的。

要解决这个问题,有两种思路。一是修改程序行为的记录方式,使得它满足下面三个条件:当两个行为完全一致时,记录的字符串完全相等;当两个行为的差异较大时,记录的字符串不相等;当两个行为的差异较小时,记录的字符串也完全相等。

要同时满足这三个条件并不难,回顾记录行为的3元组(t,a,p),其中t是行为的大类,a是该大类中的具体行为,p是行为参数。如果两个行为完全一致,那么t、a和p的值是完全相同的;如果行为的差异较小,那么t和a的值相同,而p的值不同。

例如熊猫烧香复制自己的行为是这样记录的:(file,create,c:\windows\system32\drivers\spoclsv.exe);如果是它的变种,那么该行为最可能变化的就是最后的行为参数p,比如变为(file,create,c:\windows\system32\drivers\other.exe),而前面的行为类型和具体行为并不会发生变化。

通过上面的分析,要避免hash函数的雪崩效应,只需要对t和a进行计算就行了,亦即hash(t+a)。不过,这种完全抛弃p的方法尽管可以满足行为差异较小时,hash值完全相同的条件,但又陷入了记录行为过于粗糙的陷阱中,容易发生误判。

更为理想的办法是改进hash函数的设计,使得:

|hash(s1)-hash(s2)|∝euclidean(s1,s2)

亦即两个原始数据的hash值之差与其欧式距离成正比,当两个原始数据完全相同时,其hash值完全相同。

这种hash函数的设计与传统hash函数的设计思路完全不同,其方法于2007年由谷歌公司的研究人员gurmeetsinghmanku等人提出,被称为simhash算法。simhash算法的基本思路可由下面的公式2描述:

其中s=(s1,s2,……,sn),fi是为每一个分量设计的hash函数,wi是每个分量的权值,g是fi(si)与wi的计算函数,函数fi和g都要根据具体情况自行设计。

gurmeetsinghmanku等人针对网页去重的目标,给出了一个具体的simhash算法,其最终输出值的长度为64位二进制数。具体算法描述如下:

simhash算法

输入:n维向量s=(s1,s2,……,sn),以及对应的权重向量w=(w1,w2,……,wn)。

输出:长度为l位的二进制值sh。

(1)h←0,q←0(q是一个l维的向量);

(2)i←1;

(3)计算hi=hash(si);

(4)j←1;

(5)如果hi的第j位为1,则qi=qi+wi;否则qi=qi-wi;

(6)j←j+1,如果j≤l,转至(5);否则转至(7);

(7)i←i+1,如果i≤n,转至(3);否则转至(8);

(8)i←1;

(9)如果qi>0,则shi=1,否则shi=0;

(10)i←i+1,如果i≤l,转至(9);否则转至(11)

(11)返回sh的值。

gurmeetsinghmanku等人证明了利用simhash算法计算出的sh之间的海明距离与原始数据之间的欧氏距离成正相关关系。不过由于该算法是针对的网页去重目标的,无法直接使用,需要做出一些改进。

设计的基本思路是:如果表示行为的大类的t和表示具体行为的a有任何不同,则其hash值应有显著不同;行为参数p的hash值则应满足前述simhash的要求。考虑到目前的系统均为64位,故最终生成的hash值也应为64位,这样既可以更多地保存原始信息,也可以提高比较效率。最终的hash值如图1所示。

其中t和a均是预先定义好的类别,而且种类均不超过16种,为每个种类给定一个唯一的序号,并以该序号作为其hash值。下面详细介绍对行为参数p的计算。

改进的simhash算法

输入:长度为n的字符串p。

输出:长度为l位的二进制值sh,(此例中l=56)

(1)h←0,q←0(q是一个l维的向量),m=7

(2)令p=t1t2……tk,|ti|=m,1≤i≤k,若|tk|<m则末尾添0补齐。

(3)i←1;

(4)计算

(5)j←1;

(6)如果hi的第j位为1,则qi=qi+1;否则qi=qi-1;

(7)j←j+1,如果j≤l,转至(6);否则转至(8);

(8)i←i+1,如果i≤k,转至(4);否则转至(9);

(9)i←1;

(10)如果qi>0,则shi=1,否则shi=0;

(11)i←i+1,如果i≤l,转至(10);否则转至(12)

(12)返回sh的值。

上述算法实现了其中的hash函数,以及将权值wi均设为1。将sh的高8位填上hash(t)和hash(a)的值,就成为了一个如图1所示的完整的64位simhash值。

不过以上算法有一个问题,它无法处理带有通配符“*”的字符串p,如果直接将带有“*”的字符串代入hash函数中计算,“*”将变为普通字符,失去其通配作用。为解决这个问题,需要对其进行特例化处理。在的实际问题中,一个字符串最多只含有一个通配符。其处理算法如下所示。

对含有通配符的字符串特例化处理算法

输入:长度为n的带通配符的模式串p=p1p2……pk*pk+2pk+3……pn,长度为m的不带通配符的正文串s=s1s2……sm。

输出:长度为max(m,n)不带通配符的模式串q。

(1)若n>m,q=p1p2……pkpk+2pk+3……pn,转到(5);

(2)复制q1q2……qk=p1p2……pk;

(3)令t=m-n+k-2,复制qtqt+1……qm-1qm=pk+2pk+3……pn-1pn;

(4)复制qk+1qk+2……qt-2qt-1=sk+1sk+2……st-2st-1;

(5)返回串q。

上述算法的思想可以用图2来描述:

由于特例化与要匹配的正文串相关,所以带有通配符的行为参数p不能预先计算simhash值,需要在匹配的时候进行。

时间序列匹配算法

通过前面对数据的预处理,现在可以开始设计匹配算法。目的是对模式序列t={ti|i=1,2,3……n}和正文序列s={si|i=1,2,3……m}(一般情况下有n<<m)进行处理,求t与s之间的相似度。

由于t和s是不等长的时间序列,考虑到不能破坏各元素之间的先后关系,可以使用移位匹配的方式,这需要采用采用动态规划。下面分别介绍两种可选的算法。

1、dtw算法

早在1994年,berndt和clifford就提出了动态时间变形算法(dynamictimewarping,简称dtw)。该算法的目标是寻找t和s之间的最优匹配α,使得匹配后的局部距离之和最小。

该算法的基本思路如下:令α=(αt,αs),其中t和s的dtw距离按如下定义:

dtw(t,s)=min(dα(t,s))

其中,mj是第j个局部匹配的权值。

dtw是基于动态规划实现的,算法匹配一个模板的时间复杂度是o(mn),如果有k个模板,则时间复杂度是o(kmn),由于要找到最优匹配,所以它不能提前结束匹配过程。

2、编辑距离

编辑距离(editdistance)最早由俄罗斯学者vladimirlevenshtein提出,所以又称levenshtein距离。编辑距离是指两个字符串s和t之间,由s转为t所需的最少操作次数。这里的操作包括替换、插入和删除。编辑距离可以用下列动态规划方法来求:

有字符串s=s1s2……sn和字符串t=t1t2……tm,函数edit(i,j)表示子串si与子串tj之间的编辑距离。可用公式3来描述edit(i,j)的取值:

其中f(i,j)由公4确定:

该算法的时间复杂度与dtw相同。尽管编辑距离是按照字符串匹配的要求设计出来的,但当将原始数据利用上一节的hash算法转换之后,仍然可以使用编辑距离算法。

尽管dtw和编辑距离算法已经被广泛应用于时间序列分析领域,但在恶意行为的时间序列分析上,它们都存在着一个共同的不足:无法过滤掉恶意软件作者故意加入的噪声。

比如有某恶意软件x,其恶意行为序列t=t1t2……tn,y是它的变种,为了逃避检测,其作者可能会选取一个完全无关的序列s1s2……sm将其随机插入到t中,最后形成的行为序列s=t1s1s2t2s3s4t3……tnsm,而且其长度m+n>>n。由于dtw和编辑距离都无法过滤掉其中的无关序列,导致最后计算t和s之间的差值会相当大,根本看不出两者之间有相似性。

要解决这一问题,需要匹配算法本身具有过滤无关序列的能力。想到了最长公共子序列。

定义最长公共子序列(longestcommonsubsequence,lcs)

对给定的两个序列t={t1,t2,……,tm}和s={s1,s2,……,sn},若存在单调递增的序列:i1<i2<……<il和j1<j2<……<jl使得子序列{ti1,ti2,……,til}和{sj1,sj2,……sjl}有tik=sjk=ck,k=1,2,……,l,计这个子序列为c={c1,c2,……cl}。使l值达到最大的公共子序列,称为序列t和s的最长公共子序列,用符号lcs(t,s)表示。

根据定义容易看出lcs符合公式5:

通过以上定义可以看到,lcs在判断两个序列相似性的时候,只要求元素之间的先后顺序固定,并不要求元素之间要连续,因此可以滤掉那些故意加入的无关元素,完全符合的要求。

从公式5的描述可以看出,lcs具有有重叠子问题和最优子结构性质,需要用动态规划来求解。

在lcs算法的原始定义中,元素ti和sj之间只有相等和不相等两种情况,而在的行为序列中,元素是用simhash算法计算出来的一个64位二进制数值,除了相等与不相等,还有相似信息在其中。

为了描述其相似性,定义了4个函数high、low、hammdist和simequal,现介绍如下:

若s和t均是一个根据以上算法计算出的64位simhash值,high(s,h)表示取其高h位的值;low(s,l)表示取其低l位的值;hammdist(s,t)表示s与t的海明距离。

函数simequal的计算如公式6所示。

此处h=8,m=56。

大多数研究者认为两个simhash值之间的海明距离如果小于等于3,即表示两个数据间具有较高的相似度。这里将其值取为2,这是一种较为保守的做法,主要是为了降低误报率。

根据以上知识,设计出了完整的simhash-lcs算法,描述如下:

simhash-lcs算法

输入:恶意行为时间序列t={t1,t2,……,tm}和待匹配的行为时间序列s={s1,s2,……,sn}。

输出:lcs(tm,sn)的长度。为简便起见,lcs(ti,sj)的长度用len(i,j)来表示。

(1)初始化,l(i,0)=0,l(0,j)=0,0≤i≤m-1,0≤j≤n-1;令i←1;

(2)分别计算s1,s2,……,sn的simhash值;

(3)分别计算t1,t2,……,tm中不含通配符元素的simhash值;

(4)j←1;

(5)如果ti含有通配符,则根据sj进行特例化处理,然后计算ti的simhash值;

(6)如果simequal(ti,sj)=1,则len(i,j)=len(i-1,j-1)+1,然后转(9);

(7)如果len(i-1,j)≥len(i,j-1)则len(i,j)=len(i-1,j),然后转(9);

(8)len(i,j)=len(i,j-1);

(9)j←j+1,如果j<n则转(5);否则转(10);

(10)i←i+1,如果i≤m则转(4);否则转(11);

(11)返回len(m,n)。

相似度与阈值

上面的simhash-lcs算法可以求出待判断的行为序列s与恶意行为序列t的最长公共子串的长度len(s,t),但它只是一个绝对数值,还不能直接描述s与t之间的相似度,按照公式7计算s对于t的相似度:

其中|t|表示t的长度。很明显,similar(s,t)的值一定介于[0,1]之间,越接近1,表示s与t之间的相似度越高。

最后还有一个问题,即相似度达到多少才能断定s是t的一个变种?换言之,该如何确定一个阈值,当s与t的相似度超过该阈值时,即断定s是t的变种。这里没有任何经验可供参考,利用实验将阈值从1开始逐步往下调整,到第一次出现误判时,将该阈值定为底线。为保险起见,实际使用的阈值高于此底线。

算法性能分析

整个simhash-lcs算法由两部分组成:一部分是对行为序列s和t的预处理,计算其simhash值;另外一部分是进行利用动态规划求最长公共子串的长度。

设行为序列s的长度为n,t的长度为m,s和t中的元素si和ti均是字符串,设其平均长度为k。先来计算simhash算法的时间复杂度。在设计的simhash算法中,先将字符串按56位进行分组,再对每一组计算一个hash值。总计有组,因此对一个元素si或者ti需要总共计算次hash值。接下来计算一个元素的simhash值,这是一个双重循环:内层循环对一组中的每一位填入wi值,外层循环对组进行累加求和,所需操作的次数为约为8k。其中计算hash值的时间复杂度是o(1),所以计算一个元素的simhash值的时间复杂度为o(8k);s和t中总计有n+m个元素,故计算s和t的simhash值的时间复杂度为o(8k(n+m))。

再来看lcs算法的时间复杂度。传统lcs算法时间复杂度是o(nm),在的算法实现中,比较两个元素相等用到了海明距离,需要对56个位依次进行比较操作,因此时间复杂度为o(56nm)。另外,由于模板t中的元素可能含有通配符,这类元素需要在比较过程中特例化再计算simhash值。在最坏情况下,假定所有元素均含有通配符,且需要与s中的每一个元素进行比较,这一操作总计需要进行8km×n次,于是lcs的时间复杂度成为了o(56nm+8knm)。

于是整个simhash-lcs的最坏时间复杂度为o(8k(n+m)+8knm+56nm),一般情况k>>7,n×m>>n+m,故它的时间复杂度可以简记为o(knm)。其算法的时间效率满足实际应用的需求。

除了算法的时间效率,更为重要的指标是误判率和漏判率,通过实验来验证。

实验结果及分析

为了验证算法的有效性,以及确定阈值,设计了一个实验系统。该系统中的数据分为两部分:一部分是恶意行为序列模板库,该库由手工分析建成,由国家计算机病毒应急处理中心近年发布的27个传播最为广泛的恶意软件(包括熊猫烧香、灰鸽子、代理木马、av终结者、u盘杀手、hack_kido、1kb病毒等)的行为序列组成。另外从cvc下载了314个恶意软件样本,利用行为监控系统对其行为进行捕获,然后与224个正常软件的行为序列混合在一起作为测试样本。行为监控系统为通用的行为监控工具,包括:filemon、procexp、regsnap、sandboxie、smartsniff、sreng、wsyscheck、xuetr等。

首先实现了simhash-lcs算法,并且利用测试样本来确定阈值。用于测试的阈值是一个从1.0开始到0.5结束的等差数列,公差为0.05。除阈值外,其它条件均不改变。实验结果如图3所示。

从实验结果可以看出,在阈值为0.75时,误报率已经达到0,但为了保险起见,将阈值定为0.8,尽管会增加漏报率,但并不会影响后续的分类。

除了simhash-lcs算法,还实现了hash-lcs算法、dtw算法和最小编辑距离算法与其作为对比。hash-lcs算法中的hash函数就是公式1,并且只计算参数t,a,阈值同样采用0.8。dtw算法和最小编辑距离算法都是将三元组拼接成一个字符串来处理,其中所有字符全部转换成小写。dtw算法中元素之间的距离采用字符编码的差值,其阈值(即最优匹配的距离和值)设定为100。最小编辑距离算法的阈值设定为10。

用于测试系统为windows7.0,cpu为intelcorei3550,2gb的内存。用于测试的恶意软件样本314个,正常软件样本224个,二者行为总数217312条。恶意行为模板库中行为序列27个,行为总数304条。运行结果如表1所示。

表1四种算法运行情况比较

从表1中可以看出,尽管simhash-lcs算法的处理效率是最低的,但仍然在可以接受的范围内;但是它的误报率和漏报率综合看来比其他三个算法要强得多,达到了预期设计目标。其中hash-lcs算法是因为抛弃了具体的行为参数,导致误报率较高;dtw和最小编辑距离都是因为无法过滤掉行为序列中的噪声而导致误报率和漏报率居高不下。

本发明的算法设计既利用了simhash匹配效率快的特点,又利用了lcs能够略过时间序列中大量噪音的特点,同时还保留了原始数据中的细节。实验表明设计出的算法满足了预期目标,该算法可以将误报率降到0,而且漏报率也不算太高,可以满足作为预分类器的实际需要。

以上所述,仅为本发明较佳的具体实施方式,本发明的保护范围不限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可显而易见地得到的技术方案的简单变化或等效替换均落入本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1