蠕虫病毒的可视化与分类

摘要

  本文描述了一种使用图像分类技术对蠕虫病毒进行识别的方法。将蠕虫病毒的可执行二进制文件转化为灰度图像,同类蠕虫的灰度图像在纹理与布局上存在着很高的相似性,其特有的纹理与布局是该类蠕虫特有的模式。鉴于机器学习在图像分类与识别上的优秀表现,我们使用机器学习的方式进行对蠕虫图像进行分类,达到蠕虫病毒检测的效果。最终使用VGG-SVM 的方法使准确率达到98.37%。

传统分类方式的缺陷

基于标签的检测:
通过识别特殊字符序列的方式发现蠕虫。这种方式对于零日漏洞与新的蠕虫识别效果并不好,因为签名还没有存入数据库,无法识别。

基于行为的检测:
属于异常检测。扫描系统,将不正常的的系统行为标为恶意软件,而不是检测恶意软件。启发式检测在检测未知蠕虫上有着不错的表现,但是误报率较高,需要较高的系统性能。

恶意软件的可视化

目的

  将恶意软件进行可视化表达,寻找同类恶意软件所表现出的特征,将问题转化为模式识别问题。使用机器学习在图像识别上较为成熟的方法对恶意软件进行分类与检测。

背景介绍

  恶意软件可视化是UCSB下属的Vision Research Lab所负责的Signal Processing for Malware Analysis的项目。他们提出了将恶意软件可视化用于检测与分类的方法。2012年,该团队制作了一个名为SARVAM(Search And RetrieVAl of Malware)的系统,用于可视化恶意软件,并可以根据恶意软件的图像对恶意软件进行分类。目前,该系统中已经有超过700万个恶意软件的数据。
  2011年,该团队制作了Malimg数据集,信息安全工作者可对其进行研究。2011之后,该团队一直在尝试使用各类分类方法对Malimg数据集进行分类。目前该项目组成员所发表的论文中已经尝试了聚类,CNN,CNN-SVM,随机森林等方法。其中CNN达到了98%的准确率。

相关链接:
Signal Processing for Malware Analysis项目主页)
SARVAM主页)

可视化流程

1、读取将恶意软件可执行文件的二进制代码
2、每8位无符号整数作为一个向量,转位[0,255]之间的数字
3、将恶意软件的所有8位向量转化为灰度图像
图像的宽度确定,高度根据文件大小确定。

图像宽度的选择与文件大小见的关系如图所示:

同类恶意软件图像所表现出的相似性

上方图像为恶意软件Fakerean的三个变种
下方图像为恶意软件Dontovo.A的三个变种
从上图,我们可以看到同类恶意软件图像在纹理与布局上具有很高的相似性,不同类恶意软件图像见存在较大区别。
在恶意软件的开发过程中,通常恶意软件的变种都是基于前一个版本的恶意软件进行开发,其代码结构具有较高的相似性,这种相似性使得其灰度图像也具有较高的相似性。恶意软件图像的相似性促使我们使用计算机视觉技术来对其进行分类与检测,机器学习,神经网络等方法在图像分类上有着非常出色的表现。

图像纹理说明

该图为Dontovo.A(一种木马病毒)的图像
.text:包含可执行代码。.text部分的第一部分代码图像具有较高的细粒度, 其余部分是黑色,其为程序段末尾填充的0。
.data:黑色部分为未初始化的数据,细粒度高的部分未初始化的数据
.rsrc部分,包含模块的所有资源,其可以包括应用程序可以使用的图标。

图像纹理

  图像纹理并没有一个明确的定义,一般人们认为图像纹理是一种重复出现的模式。
  纹理研究一般分为三个方向:
  纹理分类:对不同的纹理进行分类。其中也包括对纹理分割,即对边界进行识别。
  纹理分析:计算机视觉的重要研究方向。分析纹理的所指向的意义。常常用于医学影像分析,遥感图像分析等等。
  纹理合成:纹理合成方法用于合成纹理图像。 它们经常用于计算机图形学。
  恶意软件图像虽然不完全是重复的模式,但其中也表现出了大量的纹理信息,这些纹理用于分类。

Malimg数据集

Malimg数据集介绍

  Malimg数据集是一个关于恶意软件的数据集。Malimg数据集中包括25种恶意软件,一共9339个样本。其数据集原始文件为二进制文件,其可视化结果将在后文展示。通常人们将二进制文件转换为32X32的图像进行识别与分类。

Malimg数据集中的恶意软件

其对应的图像

Malimg数据集的解析

Malimg使用npz格式进行存储,使用Python进行读取。

1
2
3
4
5
6
7
import numpy as np
malimg = np.load('malimg.npz')
malware=[]
label=[]
for data in malimg['arr']:
malware.append(data[0]) #data[0]为32x32的数据
label.append(data[1]) #data[1]为标签

使用Sklearn对Malimg数据集做分类

Sklearn简介

  Sklearn是机器学习中一个常用的python第三方模块,对常用的机器学习算法进行了封装。其中包括:分类(Classification)、回归(Regression)、聚类(Clustering)、数据降维(Dimensionality reduction)、常用模型(Model selection)、数据预处理(Preprocessing)。使用非常简单,

仅对蠕虫进行分类

  从数据集中取出Allaple.L、Allaple.A、Yuner.A、VB.AT四种蠕虫,共5748组数据。
  使用SVM、神经网络、朴素贝叶斯进行尝试,均采用十折交叉验证。其中SVM选取高斯核作为核函数,C设置为10。多层神经网络使用relu做激活函数,使用AdamOptimizer作为优化器,L2惩罚系数为0.001,自适应学习率,迭代500个epoch。朴素贝叶斯以高斯分布为模型。

效果:
输出十次训练的准确率。

1
2
3
SVM模型评价: [0.81423611 0.7773913 0.85043478 0.81913043 0.80347826 0.82434783 0.81565217 0.80869565 0.82752613 0.80104712]
神经网络模型评价: [0.83506944 0.77043478 0.81565217 0.8173913 0.76869565 0.80695652 0.81217391 0.79478261 0.81184669 0.80977312]
朴素贝叶斯(高斯分布)模型评价: [0.79166667 0.77217391 0.81217391 0.80695652 0.77565217 0.81217391 0.81913043 0.81217391 0.81881533 0.79406632]

对所有恶意软件进行分类

对数据集中25种恶意软件进行分类。

1
2
3
4
SVM模型评价: [0.82751323 0.8014862 0.84861407 0.83547009 0.81390374 0.83957219 0.84317938 0.83423036 0.84 0.81148429]
神经网络模型评价: [0.55767196 0.6433121 0.63219616 0.58226496 0.58930481 0.68877005 0.55853921 0.5489774 0.60864865 0.63163597]
朴素贝叶斯(高斯分布)模型评价: [0.8010582 0.78980892 0.82196162 0.82478632 0.79037433 0.81497326
0.8292159 0.81593111 0.8227027 0.80606717]

类别增加之后,SVM的表现效果还是不错的。

使用类VGG-SVM网络模型进行分类

数据集

  使用Malimg作为数据集,对25类,9339个样本进行分类。所有图像均为32 X 32 X 1。对数据进行随机抽取,80%用作训练集,20%用作测试集。

VGG网络

  VGG与传统的CNN并没有过大的区别。VGG是2014年被提出的,与之前的AlexNet的网络结构相比,错误率大幅下降,并取得了ILSVRC2014比赛分类项目的第二名和定位项目的第一名。同时,VGG的拓展性很强,迁移到其他图片数据上的泛化性非常好。VGG的结构简洁,整个网络都使用同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。到目前为止,VGG仍然被用来提取图像特征。

特点:
1.全部使用3x3的卷积核和2x2的池化核,通过不断加深网络结构来提升性能。
2.利用多个小卷积核卷积层的组合比一个大卷积核卷积层好,小的卷积核的连用可以让决策函数变得更有区分度,并且可以大大降低参数的数量,
3.拓展性很强,迁移到其他图像数据集的泛化性很好。

神经网络结构

仿照VGG构建了一个小的神经网络,并将VGG与SVM结合,将VGG的最后一层的输出作为SVM的输入,相当于使用SVM作为激活函数。

网络结构如下:

说明:
全部使用3x3的卷积核和2x2的池化核,多个小卷积层进行组合。
卷积层使用relu做激活函数,克服梯度消失的问题,加快训练速度。
相比VGG,将最后的全连接层改为一层,使用softmax做激活函数。
使用AdamOptimizer调节参数
使用类别交叉熵作为损失函数
Learing_rate = 0.0001
Batch_size = 32 或 64
Epoch = 100

实验效果

VGG 针对25个类,batch_size = 32:
准确率:93.99%,网络不够稳定

最后五个epoch:

1
2
3
4
5
6
7
8
9
10
Epoch 96/100
9s - loss: 0.0069 - acc: 0.9976 - val_loss: 0.2756 - val_acc: 0.9372
Epoch 97/100
9s - loss: 0.0183 - acc: 0.9941 - val_loss: 0.2640 - val_acc: 0.9439
Epoch 98/100
9s - loss: 0.0105 - acc: 0.9970 - val_loss: 0.2886 - val_acc: 0.9412
Epoch 99/100
9s - loss: 0.0080 - acc: 0.9973 - val_loss: 0.3149 - val_acc: 0.9398
Epoch 100/100
9s - loss: 0.0098 - acc: 0.9966 - val_loss: 0.3019 - val_acc: 0.9372

准确率随迭代次数的变化情况:

损失随迭代次数的变化情况

可以看到这个网络准确率还可以,但是抖动明显,还未达到收敛。由于batch-size较小,应该增加epoch的数量,使其达到收敛。

VGG-SVM :batch-size=32
将VGG最后的输出作为SVM的输入,使用SVM进行分类,准确率达到98.37%。

选取linear核,C对准确率的影响

使用线性核,C对准确率几乎没有影响

选取rbf核,C对准确率的影响,gamma自适应

使用高斯核,C对准确率几乎没有影响

最后选kernel = linear , C=10

1
2
十次训练的准确率:0.98518519, 0.97664544, 0.98720682, 0.98611111, 0.99144385, 0.98609626, 0.98066595, 0.98062433, 0.9827027 , 0.98049837
平均: 0.9837180016911671

针对25个类,batch_size = 64:
准确率:92.24%,网络不够稳定,可能因为batch size过小,网络还没收敛。

最后5个epoch:

1
2
3
4
5
6
7
8
9
10
Epoch 96/100
51s - loss: 0.0203 - acc: 0.9924 - val_loss: 0.2875 - val_acc: 0.9305
Epoch 97/100
51s - loss: 0.0208 - acc: 0.9938 - val_loss: 0.4102 - val_acc: 0.9024
Epoch 98/100
51s - loss: 0.0092 - acc: 0.9976 - val_loss: 0.3271 - val_acc: 0.9225
Epoch 99/100
54s - loss: 0.0110 - acc: 0.9966 - val_loss: 0.2922 - val_acc: 0.9318
Epoch 100/100
55s - loss: 0.0148 - acc: 0.9955 - val_loss: 0.3205 - val_acc: 0.9251

准确率随迭代次数的变化情况:

损失随迭代次数的变化情况

VGG-SVM :batch-size=64
将VGG最后的输出作为SVM的输入,使用SVM进行分类,准确率达到98.25%。

选取linear核,C对准确率的影响


使用线性核,C对准确率几乎没有影响

选取rbf核,C对准确率的影响,gamma自适应

使用高斯核,C对准确率几乎没有影响

最后选kernel = linear , C=10

1
2
十次训练的准确率:0.98624339, 0.97983015, 0.98614072, 0.98183761, 0.98395722, 0.98502674, 0.98711063, 0.97631862, 0.98054054, 0.97833153
平均: 0.9825337147936295

通过这两个例子,可以看到使用SVM作为激活函数,对于准确率有着明显的提升。

batch size对于性能的影响:

Batch size每一次训练的数据量大小,其对梯度下降有着很大的影响。
一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;batch size 如果过大,则可能会出现局部最优的情况。小的 bath size 引入的随机性更大,难以达到收敛,但有时可能会让效果变好。

两个极端:

batch_size为全数据集(Full Batch Learning):
好处:
1.由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
2.由于不同权重的梯度值差别巨大,因此选择一个全局的学习率很困难。Full Batch Learning可以使用Rprop只基于梯度符号并且针对性单独更新各权值。
坏处:
1.随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2.以Rprop的方式迭代,会由于各个Batch之间的采样差异性,各次梯度修正值相互抵消,无法修正。

Batch_size=1:
Batch_size=1,也就是每次只训练一个样本。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元,非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,难以达到收敛。

1.batch_size设的大一些,收敛得块,也就是需要训练的次数少,准确率上升的也很稳定,但是实际使用起来精度不高。
2.batch_size设的小一些,收敛得慢,可能准确率来回震荡,因此需要把基础学习速率降低一些,但是实际使用起来精度较高。

使用SVM代替Softmax

该方法由Yichuan Tang在2013年提出,其使用SVM代替Softmax作为CNN的激活函数,在MNIST、CIFAR-10等数据集上都有着良好的效果。 ICML 2013表征学习研讨会对这种方式表示认可。
具体的理论在Deep Learning using Linear Support Vector Machines 这篇文章中有详细说明,目前还在研究论文。

对论文的复现

  Towards Building an Intelligent Anti-Malware System: A Deep Learning Approach using Support Vector Machine (SVM) for Malware Classification一文中提出了了一种深度学习与SVM结合的分类方式。以CNN为例,其在最后一层使用linear作为激活函数,将数据提取出来后,放入SVM中进行分类。CNN在此过程中只用于特征提取,SVM用于分类。
除CNN-SVM之外,原文还给出了GRU-SVM、MLP-SVM这两种方式。并对三种方法做了评估,我们暂时先复现CNN-SVM。

网络结构

说明:
Batch_size = 256
SVM C =10
Epoch = 100
Learning rate = 1e-3
将fc1的输出提取出来作为SVM的输入

文中的参数选择:

实验结果

CNN-SVM:
准确率:95.77%

1
2
3
4
十次训练的准确率:
0.95873016, 0.96072187, 0.96481876, 0.95940171, 0.94545455,0.96042781, 0.96348013, 0.96017223, 0.95135135, 0.95341278
平均: 0.9577971345610535

CNN:使用softmax做最后一层的激活函数
准确率:85.08%

最后五个epoch

1
2
3
4
5
6
7
8
9
10
11
12
Epoch 95/100
30s - loss: 0.0144 - acc: 0.9964 - val_loss: 0.5229 - val_acc: 0.8449
Epoch 96/100
31s - loss: 0.0125 - acc: 0.9963 - val_loss: 0.5305 - val_acc: 0.8503
Epoch 97/100
30s - loss: 0.0122 - acc: 0.9975 - val_loss: 0.5798 - val_acc: 0.8516
Epoch 98/100
30s - loss: 0.0136 - acc: 0.9966 - val_loss: 0.5615 - val_acc: 0.8463
Epoch 99/100
29s - loss: 0.0111 - acc: 0.9969 - val_loss: 0.5705 - val_acc: 0.8596
Epoch 100/100
26s - loss: 0.0098 - acc: 0.9982 - val_loss: 0.5550 - val_acc: 0.8529

准确率随迭代次数的变化情况:

损失随迭代次数的变化情况

可以看到论文中的网络结构,使用Softmax做激活函数时,准确率不高,但是网络非常稳定。

文中结果

文中CNN-SVM准确率仅有77.23%,与实验复现结果差距较大。因文中仅给出网络结构,并未给出其具体参数。参数设置的不同,可能会对实验结果造成影响。

参考文献

[1].Abien, Fred, M, Agarap, Francis, John, Hill, Pepito. Towards Building an Intelligent Anti-Malware System: A Deep Learning Approach using Support Vector Machine (SVM) for Malware Classification[M]. Adamson University:Department of Computer Science, 2017.
[2].Felan, Carlo, C, Garcia, Felix, P, Muga, II, PhD. Random Forest for Malware Classification[M]. Ateneo de Manila University:Department of Electronics, Computer and Communications Engineering, 2016.
[3].L, Nataraj, S, Karthikeyan, G, Jacob, B, S, Manjunath. Malware Images: Visualization and Automatic Classification[M]. Electrical and Computer Engineering,:University of California, Santa Barbara, 2011.
[4].Espoir, K, Kabanga, Chang, Hoon, Kim. Malware Images Classification Using Convolutional Neural Network[M]. Department of Computer and Information Engineering:Daegu University,, 2018.
[5]Yichuan Tang. 2013. Deep learning using linear support vector machines. arXiv preprint arXiv:1306.0239 (2013).