姜倩玉,王凤英,贾立鹏
(山东理工大学计算机科学与技术学院,山东淄博 255022)
互联网的高速发展促进了社会的发展与进步,但开放式的互联网也具有较大的安全隐患。互联网中存在的恶意代码对国家安全、社会稳定以及经济都有严重的危害,因此研究出高效快捷的恶意代码检测方法刻不容缓。
检测恶意代码的技术在不断进步,恶意代码对抗技术也处于发展的过程中。为了应对各类恶意代码检测工具,恶意代码开发者开始通过对抗学习[1]等方法对恶意代码进行混淆,恶意代码分析的难度逐渐变大。因此基于特征码[2]、改进主动学习[3]、深度学习[4-5]以及恶意代码可视化[6-9]等恶意代码检测方法被不断提出,其中,恶意代码可视化方法逐渐被广大研究学者所采用。但是以往提取的恶意代码灰度图特征较片面,无法全面描述恶意代码,且现存的方法在处理海量恶意代码时往往需要花费较多时间。为解决单一特征和方法存在的准确率和效率低的问题,本文提出了一种基于感知哈希算法和特征融合的恶意代码检测方法。将感知哈希算法用于恶意代码分类检测的优势是速度快,且恶意代码家族间相似性越高判断越精确,而家族间差异性较大时则分类精度不明显,因此将感知哈希与机器学习算法结合起来,能够快速且准确地完成对恶意代码的分类检测。
本文的主要工作如下:
1)将感知哈希算法用于恶意代码分类检测,对各类恶意代码家族进行感知哈希相似度对比,并根据结果设置阈值进行家族快速分类检测,大约有67%的恶意代码样本能够通过感知哈希算法检测出来。
2)对于无法通过感知哈希算法检测的恶意代码,进一步提取其全局特征Gist 与局部二值模式(Local Binary Pattern,LBP)特征,并进行融合处理,采用机器学习算法分类检测;
3)在malimg 数据集上分别对检测准确率和速度进行测试,分析实验结果表明,本文所提方法检测效率更高。
与本文相关的研究工作主要有两个方面:恶意代码灰度图像检测以及感知哈希在图像相似性检测方面的应用。
近几年,恶意代码可视化的检测方法逐渐被研究者广泛采用。将恶意代码可视化为灰度图像之后可以通过提取图像的纹理特征来检测恶意代码。2011 年,文献[8]首次将二进制文本转化为灰度图像的思想应用到恶意代码分类中,实验证明,同一家族的灰度图像的纹理特征相似性较高,非同一家族的灰度图像的纹理特征差异性较大,通过提取的图像的Gist 特征,实现对恶意代码的分类,但是Gist 特征忽略局部细节特征,导致若某些家族内部相似度过高而准确率会下降的问题。2018 年文献[9]提取恶意代码灰度图像的LBP 特征,实验准确率有了明显的提高;但是如果恶意代码样本中包含干扰信息,会影响恶意代码灰度图像的局部纹理特征。文献[10]将恶意代码灰度图像的全局特征与局部特征融合后进行检测,对检测含有混淆干扰信息的恶意代码效果较好;但是在针对大量恶意代码检测时速度较低。为有效提高分类检测速度,本文将感知哈希算法用于恶意代码检测。
为能实现快速有效识别图像的目标,图像哈希技术应运而生。感知哈希作为哈希算法的一类,被许多研究学者用来检测相似图片[11]。感知哈希的作用在于生成每张图像的“指纹”,通过比较不同图像的指纹信息来判断图像的相似性,结果越接近就说明图片越相似。本文主要采用感知哈希中的差异哈希(Difference Hash,DHash)来完成恶意代码灰度图像的匹配。通过感知哈希算法计算图像的DHash,并与DHash 库中的恶意代码样本进行对比,设置阈值判断样本所属的恶意代码家族种类,对于无法通过感知哈希检测模块判断家族的恶意代码,进一步采用机器学习算法进行检测,得到恶意代码所属的家族种类。
感知哈希算法包括均值哈希算法、基于离散余弦变换(Discrete Cosine Transform,DCT)的感知哈希算法和差异哈希算法。三者在速度和准确率方面各有优劣,其中DHash 相较于其他两种算法,在速度和准确率上比较均衡。本文将DHash 算法用于恶意代码灰度图家族的检测。哈希编码的二进制形式能够很好地节省内存空间,并加快检测速度[12]。在感知哈希检测阶段通过哈希相似度算法,比较未知恶意代码家族检测样本的哈希编码与数据集中25 类恶意代码家族哈希编码之间的差异,设置阈值返回与待分类样本的相似图集,根据相似图集内的家族对该样本进行分类。
Gist 是用于场景识别的图像描述符。它基于低维特征即空间包络。灰度图像通过强度和局部缩放对比度进行归一化,然后在多个尺度上分割成网格。Gist 为每个单元计算一系列Gabor滤波器,并融合所有单元响应来创建特征向量。
Gist 描述符首先通过将图像过滤到多个低层视觉通道中来提取特征。每个子通道内的中心环绕操作在不同尺度s的滤波器输出映射Oi(s)之间进行,并生成特征映射Mi(c,s),其中c和s分别是中心和环绕尺度。Gabor 滤波器在四个空间中心尺度(c=1,2,3,4)和四个不同角度(γi=0°,45°,90°,135°)上从方向通道应用于灰度图像。然后为每个方向计算特征,如式(1)所示:
本文采用4 × 4 规则的网格划分图像,4 尺度8 方向的Gabor滤波器,可以获得512维Gist特征。
LBP 是一种用来描述图像局部纹理特征的算子。它首先由Ojala 等[13]在1994 年提出。本文采用原始的LBP 算子定义,区域内特征值计算方法如式(2)所示:
其中:(xo,yo)为该区域内中心点o的坐标;it是区域内第t个像素点的灰度值,p为区域内像素点的个数。式(2)表示将区域中心点o的像素值分别与该邻域内其他点的像素值进行比较,由s(x)进行判断:若o的像素值小,s(x)值为1;否则为0,将产生的8 位二进制数转化为十进制即为该区域中心像素的LBP值。s(x)函数定义如式(3)所示:
通过直方图得到图像的LBP特征v,如式(4)所示。
其中:i=1,2,…,T,T是像素点总数;LBPi为像素点i的LBP 特征表示;hist表示求解直方图。
本文提出的基于感知哈希算法和特征融合的恶意代码检测系统总体设计结构如图1所示。
图1 恶意代码检测系统总体设计结构Fig.1 Overall design structure of malware detection system
特征信息库建立模块中,将数据集中全部恶意代码灰度图样本通过感知哈希算法,计算DHash并存入DHash库;此外提取恶意代码样本的Gist 特征与LBP 特征,并分别存入Gist库与LBP 库。样本信息提取模块过程中,提取待分类检测的样本的DHash、Gist特征和LBP特征。家族分类检测模块以特征信息库为依据,对待分类样本分别进行感知哈希检测和机器学习检测,并输出最终分类检测结果。
恶意代码检测的系统整体流程如图2所示。
对待分类样本通过感知哈希算法提取DHash 值,在DHash 库中根据相似性判断公式检索与之相似的恶意代码,并通过设置阈值返回相似样本,根据返回样本所属的家族对该样本进行恶意代码家族分类,感知哈希检测阈值的设置如4.2 节所示。当返回样本为空时则判定感知哈希检测模块不能确定样本性质,继续采用机器学习检测模块对该样本进一步检测,提取样本的Gist 特征与LBP 特征,并进行融合,通过随机森林(Random Forest,RF)算法进行检测分类。
图2 恶意代码检测系统流程Fig.2 Flow of malware detection system
基于感知哈希与特征融合的恶意代码分类算法步骤如下:
步骤1 通过感知哈希算法计算待分类恶意代码灰度图的DHash;
步骤2 通过相似性判断公式筛选与检测样本相似的恶意代码图像;
步骤3 若能通过阈值判断出检测样本的家族类别则结束,否则继续步骤4;
步骤4 提取恶意代码图像Gist特征;
步骤5 提取恶意代码图像LBP特征;
步骤6 选取LBP比例参数r,得到融合特征;
步骤7 训练随机森林分类器,优化参数;
步骤8 通过RF对恶意代码进行分类。
3.2.1 感知哈希检测模块
通过感知哈希算法将灰度图转化成哈希序列,通过将恶意代码待分类样本与DHash 库中的25 类家族样本进行图像的哈希序列对比,并通过设置阈值对待分类样本进行判断。
感知哈希算法的步骤如下:
步骤1 缩小图片。将图片缩小为9×8的像素。
步骤2 计算相邻像素间的差异值。
步骤3 比较差异值。若前一个像素的颜色强度大于第二个像素,那么差异值就设置为“True”,即1;如果不大于第二个像素,就设置“False”,即0。
步骤4:构造hash值。生成16位DHash值。
感知哈希算法的伪代码如下。
输入:图像image;
输出:DHash值。
对于待分类恶意代码灰度图像,通过感知哈希算法计算出该图像的DHash,并与其他恶意代码灰度图像的DHash 进行相似性判断,判断公式如式(5)所示:
对于待检测样本通过感知哈希检测模块返回相似恶意代码灰度图集,根据返回的图集内样本所属的恶意代码家族,将待检测样本归属于此类家族。若返回的图集为空,认定感知哈希检测模块不能检测该样本,则进入机器学习检测模块。
3.2.2 机器学习检测模块
由于恶意代码家族是指具有较明显的相同特征的恶意代码种类,同一家族个体间的差异较小,不同家族个体间的差异性明显。恶意代码开发者通过伪装或混淆恶意程序以应对病毒检测工具,但这些恶意程序在一些特征上仍保留着原本的特点,仍和其他变异体属于同一家族。恶意代码所属的家族不同,经过可视化后形成的灰度图像也不相同,但同一家族可视化后的图像具有比较明显的共同特征。以三类恶意代码家族的灰度图像为例,每个家族分别展示了其中的3 张图片,如图3所示。
图3 三类恶意代码家族的灰度图像Fig.3 Grayscale images of three malware families
从以上三类恶意代码家族灰度图像的展示可看出,属于同一家族的恶意代码图像纹理特征相似性较高,不同家族的图像纹理特征差异性明显,并且同一家族的纹理特征总体上较相似,差异性主要体现在局部。因此,为了避免在相似性或者差异性都较高的恶意代码家族分类准确率不稳定的情况,本文将恶意代码灰度图像的全局特征与局部特征进行融合,能够更全面地体现恶意代码家族的特征,保证检测的准确率。
对于未能通过感知哈希检测模块判断出家族类别的样本,进一步提取图像的全局特征Gist 与局部特征LBP 进行融合,融合公式如式(6)所示:
其中:merge为融合函数;LBPr表示选取比例为r的LBP 特征,例如LBP0.5表示随机选择恶意代码灰度图像中50%的LBP 特征与Gist 融合。对融合后的特征采用随机森林(Random Forest,RF)进行检测,输出检测分类结果。
实验环境为Intel Core i5-8265U 1.60 GHz 的CPU,8 GB RAM,Windows 10、64 位的操作系统。采用Python3.5 编程实现,机器学习框架选择Scikit-learn。
本实验数据集来自文献[14]提供的数据集malimg,数据集中包含25 个家族,共9 339 个样本。每个家族的数据集都是恶意代码的灰度图像。
在实验过程中,对于待分类恶意代码灰度图像,通过感知哈希算法计算出该图像的DHash,并与DHash 库中其他家族恶意代码灰度图像的DHash进行对比判断,通过式(5)得到待分类样本图像与其他图像的相似性对比结果。
为验证不同家族内的感知哈希相似性对比情况,实验对25 个家族分别进行了测试。以Adialer.C 家族与其他24 个家族的对比情况为例,选取Dialplatform.B 家族和Alueron.gen!J 家族中的50 张图片,感知哈希相似性对比情况如图4 所示。实验得知不同家族的相似性大部分集中在0.45 以上,极少数分布于0.4 附近。实验所测不同家族相似度最小值为0.397。
图4 不同家族相似性对比Fig.4 Comparison of similarities between different families
为验证同一家族内的感知哈希相似性对比情况,对25 类家族分别进行测试,以Adialer.C家族和Agent.FYI家族为例,同一家族内相似性对比情况如图5 所示。实验得知同一家族内的相似性集中在0~0.45,且部分家族的相似性在0.2~0.45。
考虑感知哈希检测模块的准确性和有效性,实验测试了当阈值为0.3 和0.35 下的检测效果。当阈值为0.3 时能够通过感知哈希模块检测的恶意代码比例大约为50%,其余50%的样本会通过机器学习模块进行检测。当阈值为0.35 时能够通过感知哈希模块检测的恶意代码比例大约为67%,其余33%的样本会通过机器学习模块进行检测。在保证准确性和效率的基础上,为能有效地扩大检测比例,本文选择0.35 为判断阈值进行分类检测(由于本实验的局限性,实验选择0.35作为感知哈希检测的阈值,留有0.397-0.35=0.047的余地)。对于待检测样本通过感知哈希检测模块返回相似恶意代码灰度图集,根据返回的图集内样本所属的恶意代码家族,将待检测样本归属于此类家族。这也说明同一恶意代码家族的DHash较为接近,不同家族的DHash的差异性比较明显,通过感知哈希检测模块能够准确地判断出恶意代码所属的家族类别。
图5 同一家族相似性对比Fig.5 Comparison of similarities in the same family
按照感知哈希与特征融合分类算法,将Gist 特征与不同比例的LBP 特征进行融合,LBP 的比例设置为0.1、0.3、0.5、0.7和1,分类方法为RF,优化RF中的estimators参数为25。
4.4.1 实验准确率分析
实验分别在Gist、LBP以及Gist与不同比例的LBP融合特征下进行测试,实验对比结果如表1所示。
表1 本文方法不同特征实验准确率结果对比Tab.1 Comparison of experimental accuracy results of different features by the proposed method
为验证本文提出的方法能够提高恶意代码分类准确率,在本实验中,通过Gist 与不同比例的LBP 融合后的特征分别进行5次实验取平均值。由表1分析得,在Gist特征下准确率为90%,LBP 特征下准确率为92.1%,当Gist与100%LBP 融合后准确率最高为98.2%。这说明了相较于单一特征,Gist 与LBP 融合后特征效果更好,平均准确率可达98.2%。分析malimg 数据集可知,Autorun.K 家族与Yuner.A 家族之间以及Swizzor.gen!E 家族和Swizzor.gen!I 家族之间相似性较大,若仅采用全局特征Gist,会造成分类准确率下降的问题。对于恶意代码数据集中普遍存在的信息干扰问题,若只采用局部特征LBP 同样也会造成准确率低的问题,因此将Gist 特征与LBP特征融合后能避免此类问题,提高准确率。
实验还比较了在不同分类器下,Gist 与不同比例的LBP融合的检测结果,结果如表2、3所示。
分析表2、3可得,在K最近邻(K-Nearest Neighbors,KNN)算法和逻辑回归算法下,将Gist与全部比例的LBP 融合,得到的实验效果最好。这也证明了,全局特征与局部特征融合后的效果要优于单一特征下的效果。
表2 KNN下不同特征实验准确率结果对比Tab.2 Comparison of experimental accuracy results of different features by KNN
表3 逻辑回归下不同特征实验准确率结果对比Tab.3 Comparison of experimental accuracy results of different features by logistic regression
为进一步验证本文所提出的基于感知哈希算法和特征融合的恶意代码分类检测方法的有效性,在Microsoft 数据集上进行了Gist、LBP 以及Gist-LBP 融合特征的实验对比,此数据集来源于Microsoft 在Kaggle 上的项目Microsoft Malware Classification Challenge[15],数据集包括7 个家族的10 868 个样本,样本包括bytes 文件和asm 文件,通过二进制转矩阵(Binary to Matrix,B2M)算法将bytes 文件转成灰度图像后进行实验测试,数据集详细信息如表4所示。
表4 Microsoft数据集Tab.4 Microsoft dataset
对于该数据集,分别在Gist、LBP 和Gist-LBP 融合特征下进行测试,准确率分别为94.1%、96.7%、97.9%。由实验结果知,将Gist与LBP 融合后的特征对恶意代码进行测试,得到的效果最好,证明了将全局特征与局部特征融合后的效果要优于单一特征下的效果。
此外,与仅采用Gist 特征的文献[12]和仅采用LBP 特征的文献[13]进行对比,采用KNN方法,结果如表5所示。
表5 KNN下与采用单一特征的方法与本文方法的实验准确率结果对比 单位:%Tab.5 Comparison of experimental accuracy results of methods using a single feature and the proposed method by KNN unit:%
4.4.2 实验检测速度分析
为验证本文提出的方法能够提高恶意代码分类效率,实验对25 类恶意代码家族分别测试了在感知哈希检测模块和机器学习检测模块下的检测速度。每类家族分别进行了10次测试取平均检测速度,结果如表6所示。
表6 感知哈希模块和机器学习模块下检测时间对比 单位:sTab.6 Detection time comparison under perceptual hash module and machine learning module unit:s
在机器学习检测模块中,平均每个恶意代码样本的检测时间是4.32 s,而感知哈希检测模块中,平均每个恶意代码样本的检测时间是0.28 s,检测速度提高了93.5%,因此对于能够通过感知哈希检测模块检测的样本,将大大缩短检测时间。相较于仅采用机器学习检测,本文提出的基于感知哈希算法和特征融合的恶意代码检测方法分类检测效率更高。
为解决传统恶意代码灰度图特征的局限性并为进一步提高检测效率,本文提出了基于感知哈希算法和特征融合的恶意代码检测方法。首先,通过感知哈希检测模块判断恶意代码样本的所属家族,对于无法通过感知哈希模块判断的样本再进一步提取全局特征Gist与局部特征LBP,根据Gist与不同比例的LBP 融合后的特征进行测试。结果表明当Gist与全部比例的LBP融合后效果最好,准确率可达98.2%;此外本文提出的方法相较于机器学习检测,检测速度提高了93.5%。将本文实验结果也与其他采用单一特征的文献进行了对比,实验结果表明本文所采用的融合特征的准确率更高。在下一步的工作中,将继续研究恶意代码的方法与特征,进一步提高恶意代码的分类准确率。