通过将程序的16进制序列按照一定的规则转换为灰度图作为输入数据,随后使用VGG16深度卷积神经网络作为模型,利用深度卷积神经网络在图像识别上的准确性来 来构建恶意程序分类器。该实验将会在两个公开数据集上进行测试,两个公开数据集的数据分别属于不同的恶意程序家族。因此,构建的分类器要解决的问题将是一个多分类问题。
Python版本: 3.6.13
Pytorch版本: 1.8.1
CUDA版本 : 11.4
最初提出将程序的16进制序列转换为灰度图作为输入数据的是由2011年发表的一篇论文中阐述的,该论文的链接是:Malware Images: Visualization and Automatic Classification ,感兴趣的,可以将论文下载下来,下面讲一下转换思路。
当程序被编译器编译完成以后,将会以二进制的形式保存在磁盘中。但是程序解析的时候,都是按照一个字节(8比特)来解析,所以解析器一般是按照16进制形式展现一个程序的二进制文件,如下图所示:
而每个字节的大小在0-255的范围内,这个范围和像素点的范围是一样的。因此,可以考虑将程序的每个字节当成一个像素点,转换成一个二维的数组,然后生成相应的灰度图,过程如下图所示:
这里就有一个问题,每个程序的字节数是不同的。因此,需要按照一定的规则来指定生成的图像的宽和高,作者在论文中给出的参考如下:
根据文件大小的不同来固定生成的图像的宽度,剩余的字节就填充到高度去,以此,来生成相应的灰度图来表征程序。此外,作者认为,生成灰度图的时候,应当把程序的PE头部分删除,只留下节区,因为节区中的内容才保存了程序要执行的指令,使用到的数据等到。如下图所示,可以看到不同节区生成的灰度图的纹理存在着明显的不同:
最终生成的灰度图如下图所示,其中上面三张图是其中一个类别的恶意程序生成的灰度图,而下面的三张图则是另一类别恶意程序生成的灰度图。从中可以看到,不同家族的恶意程序所生成的灰度图的纹理存在非常明显的差异,这就给模型的训练带来的便利。
上述论文作者按照其思路,将如下所示的25个家族的恶意程序转换成数据集供给大家实验。其中,最后一列代表的是该家族恶意程序的数量,可以看出,数据集存在明显的类别不均衡的问题,事实上,这也是该领域的一大问题。
该数据集一共有九千多条数据,其中的百分之90(8000多条)用来作为训练数据,百分之10(900多条)用来作为测试数据。训练数据和测试数据的形式如下图所示:
每种家族的恶意程序都被保存到了一个文件夹中,文件夹的名称就是程序所属的家族,文件夹中则保存了每个家族的恶意软件生成的灰度图,如下图所示:
该数据集提供了测试集的标签,因此使用准确率来判断模型性能,如下是该数据集的数据类代码 :
该数据集是微软2015年在kaggle举行的恶意软件分类比赛上提供的数据集,该比赛的网址是:Microsoft Malware Classification Challenge 。该数据集的训练集样本的测试集样本数量差不多,都是1W出头的数量。trainLabels.csv文件保存了训练集中的恶意程序类别,其中ID是软件的名称,Class是所属的类别,如下图所示:
对于每个恶意软件,数据集都给出了其16进制序列和汇编指令,分别保存在.bytes和.asm文件中。
其中,.bytes文件保存的软件的16进制序列去除了PE头,如下图所示:
.asm文件中的汇编指令则是使用IDA生成的,如下图所示:
这个数据集特别的大,所以解压的时候最好使用py7zr用来解压,下面是参考代码:
在本实验中,只使用到了.bytes文件。由于.bytes文件中保存的是程序的16进制序列,因此,需要将其按照上述规则转换为对应的灰度图像。下面给出相应的参考代码:
该数据集没有提供测试集的标签,想要测试分类器的性能需要将测试结果上传到以上的数据集官网中。官网按照以下的公式计算损失,来对测试结果进行评分,验证分类器的精度:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-4-12 16:56
被1900编辑
,原因: