APP下载

基于深度置信网络的恶意代码检测方法研究

2019-07-23郭亚兰田礼明

计算机技术与发展 2019年7期
关键词:特征向量样本深度

强 晗,郭亚兰,田礼明

(江南计算技术研究所,江苏 无锡 214000)

0 引 言

随着信息化的迅猛发展,互联网与计算机得到广泛普及和应用,给人类的生活带来巨大便利,社会工作效率得到显著提高。但与此同时,信息安全问题也日益严峻,不仅威胁到个人隐私和利益,企业信息安全甚至国家信息安全都面临着严峻挑战。由于恶意代码的传播和扩散而引起的案件数量正与日俱增,每年增幅达到50%以上[1]。爆炸性增长的海量恶意代码不仅对社会与个人造成巨大损失,也对恶意代码检测技术提出了更高的要求。

经典的恶意代码检测方法如基于特征库、基于逆向工程反汇编和基于启发式扫描的检测技术在性能和效率上已无法应对当前恶意代码的巨大挑战。

近年来,随着人工智能与机器学习技术的发展,有学者将这些技术应用到恶意代码的检测中,并且取得了不错的效果。Masud M[2]以字节n-gram序列、指令序列、系统调用函数组成多维特征,结合支持向量机算法,在检测准确率、错判率和漏报率上均有不错的表现。Igor Santos[3]以操作码出现的频率和选择执行文件的踪迹作为特征,利用KNN[4]、决策树[5]、SVM[6]、贝叶斯算法[7]训练分类器,也取得了很好的检测效果。

深度学习是近年来被广泛应用的一种机器学习技术。深度学习可以对多层深度结构实现非线性映射,将复杂函数用较少的参数来表示,具有从样本中学习到本质特征的强大能力,在图像识别、机器翻译等领域具有广泛的应用。文中基于恶意代码反汇编后指令序列的特征,利用深度置信网络实现恶意代码的检测。它的优点有两方面:其一,使用深度网络结构进行分类的结果比较准确;其二,深度置信网络是无监督学习,省去了大量对样本进行标注的时间,提高了效率。

1 数据预处理模块

1.1 查壳与脱壳

大部分恶意代码为了提高隐蔽性以躲避杀毒软件的查杀以及压缩体积来便于广泛传播,都会采取加壳处理。常用的加壳工具如ASPACK、PECOMPACT等。

为了避免壳对恶意代码检测的干扰,需要先进行查壳与脱壳。在查壳的技术思路上,主要有两个方向,一是根据壳的特征码,二是计算信息熵。常用的查壳工具有PEID、FILESCANNER。

脱壳是加壳的逆过程。为了使对恶意代码的分析不受干扰,首先要脱去保护壳,找到原程序的真正入口点。脱壳主要有单步跟踪法、ESP定律法、两次内存镜像法、直达OEP法和模拟跟踪法。目前常用的脱壳软件有VMUNPACKER、WASPACK、UNDBPE、UNFSG、EUNPACJER等。

1.2 反汇编

通常,获取恶意代码源码是很困难的,多数情况下,分析者只能得到其PE文件。对于PE文件,无法对其直接进行分析,因此需要反汇编,通过分析恶意程序的汇编代码来理解恶意程序的原理和真实目的。

目前,主流的反汇编工具有IDA Pro、W32Dasm、C32Asm等。图1为一个样本经过IDA pro反汇编后的效果图。

2 特征提取模块

2.1 特征提取

n-gram技术最早应用在语音和模式识别中,后来在文本分类中也有应用,并且取得了很好的效果。文中方案采取n-gram[8]方法提取样本的操作码序列,其中滑动窗口的长度n的选择尤为重要,n取值过小则无法提取出较长、较复杂的汇编指令码序列的特征,n取值过大则会受到冗余代码的干扰和影响。Moskovitch[9]的实验结果表明,使用n>4的滑动窗口构造特征序列时,模型的分类准确率并没有明显提升,n值取3或4时模型分类效果最佳。

图1 IDA Pro反汇编效果

2.2 特征选择方法

2.2.1 信息增益

信息增益(information gain,IG)为信息熵的差。信息熵[10]的概念由香农于1948年提出,借助了热力学的“熵”一词,是用来衡量信息量大小的物理量。其物理含义可以这样理解:如果小概率的事件发生了,则产生的信息量大;如果大概率的事件发生了,则产生的信息量小。

熵的计算公式如下:

(1)

在随机变量Y发生的情况下,X的信息熵如下:

(2)

信息增益为两者之差:

IG(X,Y)=H(X)-H(X|Y)

(3)

信息增益值越大的特征,对应的分类能力越强,越应该保留,而信息增益值小的特征,分类能力弱,可能会降低分类的效果。

2.2.2 文档频率

文档频率(TF-IDF)是文本挖掘中常见的特征选择方法。它的基本思想是如果某一特征在某一类中出现频率很高且在其他类中出现频率很低,则该特征的分类能力强,应当保留。具体的计算公式为:

(4)

它将某个特征在一个样本中出现的频率与这个特征在其他样本中出现频率的倒数相乘,乘积越大,则说明这个特征更能代表某一类样本。

3 深度置信网络模块

文中使用的分类算法是基于深度置信网络(deep belief network,DBN)实现的。它是由若干层由下往上的受限玻尔兹曼机(RBM)和一层逆向传播(back propagation,BP)神经网络构成的[11-13]。每层RBM的训练是非监督的,文中使用最上层RBM的输出向量作为BP神经网络的输入向量,随后对BP神经网络进行有监督的训练。

DBN网络的每一层的单元从之前一层的隐藏层单元获得高相关性隐式关联。DBN网络中相邻的层可以被分解为一个单独的受限RBM。每个低层的RBM作为输入数据作为训练下一个RBM的输入数据来使用,通过贪婪学习算法得到一组RBM。

深度置信网络的训练有以下三个步骤。第一步,用非监督的方法分别训练每层的受限玻尔兹曼机;第二步,对DBN网络进行无监督反馈调节,使整个网络的权值得到优化;第三步,对在深度置信网络最后一层的BP神经网络,使用最后一个RBM的输出向量作为BP神经网络的输入向量,然后使用监督学习的方法,训练实体关系分类器。DBN模型网络结构示意如图2所示。

图2 DBN模型网络结构示意

3.1 RBM预训练

受限玻尔兹曼机(RBM)由Hinton等提出,是深度置信网络的主要组成部分。一个受限玻尔兹曼机由两层神经网络组成,可见层(对应可见变量,即数据样本)和隐藏层(对应隐藏变量)。可见层和隐藏层内部节点之间均不相连[14-15]。每层间的连接矩阵和偏差通过非监督的贪婪算法得出。具体到训练过程中来说,第一步,将可视层单元映射到隐藏层单元;第二步,反过来用隐藏层单元重构出可视层单元;第三步,重复前两步,并更新连接矩阵和偏差的值,计算重构数据与原始数据的误差值,对误差值设定一个阈值,若误差值大于阈值,则还要继续做前两步的工作,若误差值在阈值内,则训练完成。隐含层单元和可视层单元间的相关差别是形成每次权重更新的基础。RBM结构如图3所示。

简言之,训练RBM的过程其实就是求一个最能产生输入数据的分布。通过不断计算重构数据与输入数据的误差,对权重和偏量进行调整,使误差降低到阈值之内。在误差的量化计算上,Hinton提出了对比散度(contrastive divergence,CD)的学习算法,基于KL(Kullback-Leibler)距离衡量两个概率分布之间的误差。KL距离是用来衡量两个概率分布差异的一种方法。KL距离的具体物理含义是:用P(x)表示某个事件的概率分布,当用概率分布Q(x)来编码时,计算平均编码长度改变了多少比特。这时的KL距离表示为D(P‖Q)。基于KL距离可以得出对比散度CD的计算公式:

CDn=KL(p0‖p∞)-KL(pn‖p∞)

(5)

图3 RBM结构

3.2 DBN无监督反馈调节过程

通过将已经进行过逐层大量学习的多个RBM按自底向上的方法连接起来,这样构造得到了一个初始DBN。这时,每个RBM都实现了局部最优,但是对于整个DBN网络,并不是最优。为了进一步提高模型精度,对于初始的DBN,再通过无监督反馈微调,使用最顶层RBM的输出特征向量重构出原始输入特征向量,通过不断降低重构出的特征向量与原始输入特征向量之间的误差,调整RBM的连接权重。其中,误差的量化计算通过KL距离实现。这样迭代多次后,当模型能够重构出与原始输入特征向量误差很低的特征向量时,说明模型的输出特征向量更能反映样本的本质特征,有助于提高检测精度。具体过程如下:首先输入n-gram指令序列特征向量v;设置反馈调节参数,迭代次数为iteration;获取RBM预训练后的各权值W1W2…WNWN-1…W2N;计算最顶层RBM的输出hk;有最顶层输出重构输入特征向量v;计算误差:Error=KL(v‖v');根据误差Error采用共轭梯度算法调整权值W1~W2N。这样迭代iteration次后,DBN无监督反馈调节完成。

3.3 BP反馈调节过程

在深度置信网络模块的最后,通过类似经典BP神经网络的方法从后往前微调整个深度置信网络,最终可以建立训练好的DBN模型。BP神经网络是有监督的学习,它使用的是标注好的训练集。对于输入数据x,设它的原始类标为y,令它的特征向量V0经过深度置信网络得到顶层输出向量hN,最后计算出输出类标y'。用KL距离计算y和y'的误差,将误差反向传播,以此来调整各层的权重WN…W2W1。

4 恶意代码检测分类器评价方法

恶意代码的检测在本质上属于一个二分类问题,因此,文中使用了一般分类算法的评价标准,主要有准确率、错判率FPR和漏报率FNR这三个量化指标。在一个二分类问题中,分类算法会将样本分为相应意义的正类和负类,这样便会产生四种情况:样本是正类并且被分类为正类;样本是正类但是被分类为负类;样本是负类但是被分类为正类;样本是负类并且被分类为负类。准确率、错判率及漏报率的计算公式如下:

(6)

(7)

(8)

评价一个恶意代码检测算法性能的好坏总的来说就是看其是否具有很高的检测精度与相对低的误报率与漏报率。

为了验证文中方法的性能,在Windows7 64位平台下,基于Visual Studio 2010和Matlab 7.0使用C++语言和Matlab脚本实现了恶意代码检测模型系统。系统由三个模块组成,分别为样本预处理模块、特征构造与约简模块、深度置信网络分类模块。样本预处理模块在win平台进行,使用PEID、VMUNPACKER对样本进行查壳、脱壳处理。特征提取模块首先利用IDA Pro 6.1反汇编生成后缀为.asm的文件,然后构造指令的n-gram序列,再使用信息增益提取特征。深度置信网络分类模块在win平台上使用Matlab实现,它由若干层RBM逐层堆叠再加上顶层的有监督的BP神经网络组成。整个恶意代码检测模型如图4所示。

图4 恶意代码检测模型

5 实验结果与分析

文中的实验样本数据集包括3 000个正常代码和3 000个恶意代码。恶意样本来源于相关安全论坛以及恶意代码研究网站,如vx netlux、vx heavens、VirusTotal等,包括木马、病毒、蠕虫、后门等。正常样本来源于Windows的系统文件和其他一些正常文件。所有样本均为PE格式文件。样本集的划分采用3重交叉验证的方式。按照这种样本划分方式,文中实验的训练集由2 000正常样本和2 000恶意样本组成,测试集由1 000正常样本和1 000恶意样本组成。

文中设计了两组实验,第一组实验控制其他变量统一,采用不同的隐藏层数和隐藏层节点数,从而得出最优的深度模型结构。第二组实验将文中方法与其他机器学习算法(支持向量机、K近邻、朴素贝叶斯)进行对比,验证文中方法相较于传统的机器学习方法具有更好的检测性能。

第一组实验中,通过设计几组对比实验找出最优的深度模型结构,即最优的隐藏层数和隐藏层节点数。层数和节点数过少会导致学习能力不足造成欠拟合的情况,而层数和节点数过多则会导致学习到冗余特征,造成过拟合。实验使用4-gram算法构造指令序列特征并用信息增益法选择IG值前120个的特征。实验的DBN网络分别采用单隐藏层、双隐藏层、三隐藏层,隐藏层节点数分别为140,160,180。输入层节点数为120,输出层为2个节点,学习速率设置为0.05。实验的结果如表1所示。

表1 不同DBN网络结构的检测结果

可以得出实验结论:当DBN网络采用双隐藏层,隐藏层节点数为160时,整个模型系统的分类准确率最高,达到96.11%,同时误判率与漏报率也较低,分别为4.27%、3.77%。

第二组实验中,将文中方法与四种传统的机器学习模型进行了比较,包括K近邻、朴素贝叶斯算法、支持向量机、决策树算法。对于这四种学习算法,使用相同的测试集、相同的特征提取方法进行实验,检测结果如表2所示。

表2 不同机器学习算法的检测结果

从表2可以看出,在测试条件相同的情况下,DBN算法的准确率比K近邻算法高出2.33%,比朴素贝叶斯算法高出5.75%,比支持向量机算法高出9.89%,比决策树算法高出4.23%。可以得出结论,采用DBN算法的模型的检测性能优于传统的机器学习模型的检测性能。

6 结束语

通过提取恶意代码反汇编后得到的操作码序列特征,使用信息增益(IG)选择特征,再使用深度置信网络(DBN)对提取的特征进行分析识别,提出了基于深度学习算法的恶意代码检测方法。深度学习是目前机器学习领域研究的重点,相比于传统机器学习算法,深度学习通过神经网络可以学得输入数据更本质的特征,因此提高了分类性能。文中详细论述了深度置信网络算法的理论基础,并将算法应用到恶意代码检测中。实验结果表明,相较于传统的恶意代码检测方法,提出的恶意代码检测方法在检测精度和效率上有明显改进和提高。

该方案也存在一些不足和需要改进的地方。比如可以从更多的角度提取恶意代码特征,对于一些加密与压缩的恶意代码,需要在运行时才能获得其特征,所以对动静态特征融合做进一步研究也是有意义的。此外,文中只是将待检样本分类为恶意和正常两类,下一步可以考虑对样本进行更加细致的分类,通过检测能够知道恶意代码的具体种类,这样对恶意代码检测也是有积极意义的。

猜你喜欢

特征向量样本深度
四增四减 深度推进
深度思考之不等式
克罗内克积的特征向量
高中数学特征值和特征向量解题策略
简约教学 深度学习
三个高阶微分方程的解法研究
规划·样本
人大专题询问之“方城样本”
随机微分方程的样本Lyapunov二次型估计
“官员写作”的四个样本