使用Python中的卷积神经网络进行恶意软件检测
导言
在这篇文章中,我们将学习人工网络架构以及如何使用其中一个(卷积神经网络)来帮助恶意软件分析师和信息安全专业人员检测和分类恶意代码。
恶意软件是每个现代组织的噩梦。攻击者和网络犯罪分子总是想出新的恶意软件来攻击目标。安全厂商正在尽最大努力防范恶意软件攻击,但遗憾的是,每月发现的数百万恶意软件无法实现这一点。因此,需要诸如深度学习的新方法。
在深入研究DL方法的技术细节和实际实施步骤之前,必须学习和发现人工神经网络的其他不同架构。现在讨论主要的人工神经网络。
本摘录摘自Packt Publishing出版的“ Mastering Machine Learning for Penetration Testing ”一书。本书教您使用Python进行机器学习,从而成为渗透测试大师的丰富技能。
卷积神经网络(CNN)
卷积神经网络(CNN)是解决图像分类问题或者说是计算机视觉问题的深度学习方法,因为经典计算机程序面临非常多的挑战和困难,包括:光照、变形和分割等。CNN具有宽度、高度和深度三维结构的特征。
首先分享我准备的python学习资料,给那些正在学习python的同学,或者准备学习python的同学,关注,转发,私信小编“01”即可免费获取!
想要构建CNN,我们需要三种主要类型的层:
卷积层:卷积运算是指从输入图像中提取特征并将滤波器中的值与原始像素相乘;
池化层:池化操作减少了每个要素图的维度;
全连接层:全连接层是经典的多层感知器,在输出层具有softmax激活功能要使用Python实现CNN,你可以使用以下Python脚本:
1import numpy from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import Flatten from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D from keras.utils import np_utils from keras import backend backend.set_image_dim_ordering('th') model = Sequential() model.add(Conv2D(32, (5, 5), input_shape = (1, 28, 28), )) model.add(MaxPooling2D(pool_size = (2, 2))) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, )) model.add(Dense(num_classes, )) model.compile(, , metrics = ['accuracy'])
递归神经网络(RNN)
RNN对序列的每个元素执行相同的任务,输出取决于先前的计算。它广泛应用于语言建模和文本生成(机器翻译、语音识别和许多其他应用程序)。
长短期记忆网络
长短期记忆(LSTM)通过构建内存块解决了递归神经网络中短暂内存问题,该块有时成为存储器单元。
Hopfield网络
Hopfield网络由John Hopfield于1982年开发。这个网络的主要目标是自动关联和优化,分为两类:离散和连续。
Boltzmann机器网络
它使用循环结构,只使用本地可用信息,它是由Geoffrey Hinton和Terry Sejnowski于1985年开发的,它的目标是优化解决方案。
使用CNN进行恶意软件检测
对于这个新模型,我们将发现如何使用CNN构建恶意软件分类器。你一定想知道如何在CNN将图像作为输入,其实答案并不难,我们将恶意软件转换为图像。这样可能吗?完全可能!恶意软件可视化是过去几年中众多研究课题之一。所提出的解决方案之一是来自加利福尼亚大学圣巴巴拉分校视觉研究实验室的Lakshmanan Nataraj所谓的恶意软件图像:可视化和自动分类的研究。
下图详细说明了如何将恶意软件转换为图像:
以下是Alueron.gen!J 恶意软件的图片:
此技术还是我们能够以详细的方式可视化恶意软件部分:
通过解决如何通过图像提供使用CNN的恶意软件机器学习分类器的问题,信息安全专业人员可以使用CNN的功能来训练模型。Malimg数据集是最常用于提供CNN的恶意软件数据集之一。此恶意软件数据集包含来自25个不同恶意软件系列的9339个恶意软件样本。你可以从Kaggle下载。
这些是恶意软件系列:
Allaple.L
Allaple.A
Yuner.A
Lolyda.AA 1
Lolyda.AA 2
Lolyda.AA 3
C2Lop.P
C2Lop.gen!G
Instant access
Swizzor.gen!I
Swizzor.gen!E
VB.AT
Fakerean
Alueron.gen!J
Malex.gen!J
Lolyda.AT
Adialer.C
Wintrim.BX
Dialplatform.B
Dontovo.A
Obfuscator.AD
Agent.FYI
Autorun.K
Rbot!gen
Skintrim.N
将恶意软件转换为灰度图像后,可以获得以下恶意软件表示,以便稍后使用它们来提供机器学习模型:
可以使用以下Python脚本将每个恶意软件转换为灰度图像:
1import os 2import scipy 3import array 4filename = '<Malware_File_Name_Here>'; 5f = open(filename,'rb'); 6ln = os.path.getsize(filename); 7width = 256; 8rem = ln%width; 9a = array.array("B"); 10a.fromfile(f,ln-rem); 11f.close(); 12g = numpy.reshape(a,(len(a)/width,width)); 13g = numpy.uint8(g); 14scipy.misc.imsave('<Malware_File_Name_Here>.png',g);
对于特征选择,可以使用不同的技术(如平均值和标准差等)提取或使用任何图像特征,例如纹理图案、图像中的频率、强度或颜色特征,以生成特征向量。在我们的例子中,可以使用诸如颜色布局描述符、同构纹理描述符或全局图像描述符(GIST)之类的算法。我们假设选择了使用GIST, pyleargist是一个非常不错的Python库来计算它。要安装它,像往常一样使用PIP:
1# pip install pyleargist=.0.1
计算GIST可以使用以下Python脚本:
1import Image 2Import leargist 3image = Image.open('<Image_Name_Here>.png'); 4New_im = image.resize((64,64)); 5des = leargist.color_gist(New_im); 6Feature_Vector = des[0:320];
这里的320指的是我们使用灰度图像时的前320个值。不要忘记将它们保存为NumPy数组,以便以后使用它们来训练模型。
获得特征向量后,我们可以训练许多不同的模型,包括SVM、K-maeans和人工神经网络。
当完成特征选择和工程设计后,可以构建CNN。例如,对于我们的模型,将构建一个带有两个卷积层的卷积网络,具有32*32个输入。要使用Python库构建模型,可以使用以前安装的TensorFlow和utils库来实现它。
因此,整体CNN架构如下图所示:
这个CNN架构并不是构建模型的唯一提议,但目前我们将把它用于实现。
为了建立模型和CNN,推荐Kearas,需要导入如下内容:
1import keras 2from keras.models 3import Sequential, Input, Model 4from keras.layers 5import Dense, Dropout, Flatten 6from keras.layers 7import Conv2D, MaxPooling2D 8from keras.layers.normalization 9import BatchNormalization 10from keras.layers.advanced_activations 11import LeakyReLU
如前所述,灰度图像的像素值范围为0到255,因此需要为网络提供32*32*1维的图像:
1train_X = train_X.reshape(-1, 32,32, 1) 2test_X = test_X.reshape(-1, 32,32, 1)
将使用以下参数训练网络:
1batch_size = 64 2epochs = 20 3num_classes = 25
要构建体系结构,请考虑一下它的格式,使用以下命令:
1Malware_Model = Sequential() 2Malware_Model.add(Conv2D(32, kernel_size=(3,3),,input_shape=(32,32,1),)) 3Malware_Model.add(LeakyReLU(.1)) 4Malware_model.add(MaxPooling2D(pool_size=(2, 2),)) 5Malware_Model.add(Conv2D(64, (3, 3), ,)) 6Malware_Model.add(LeakyReLU(.1)) 7Malware_Model.add(Dense(1024, )) 8Malware_Model.add(LeakyReLU(.1)) 9Malware_Model.add(Dropout(0.4)) 10Malware_Model.add(Dense(num_classes, ))
编译模型,使用以下命令:
1Malware_Model.compile(.losses.categorical_crossentropy, .optimizers.Adam(),metrics=['accuracy'])
适合并训练模型:
1Malware_Model.fit(train_X, train_label, ,,,validation_data=(valid_X, valid_label))
评估模型,可以使用以下代码:
1Malware_Model.evaluate(test_X, test_Y_one_hot, ) 2print('The accuracy of the Test is:', test_eval[1])
将深度学习应用于恶意软件检测的承诺与挑战
机器学习从业者和恶意软件分析师提出可许多不同的深层网络架构来检测已知和未知的恶意软件。
但是在使用深度学习网络检测恶意软件时,恶意软件分析师面临许多挑战,特别是在分析PE文件时,因为分析PE文件,我们将每个字节作为输入单元,因此除了处理数百万个分类序列步骤之外,还需要由于函数调用和跳转命令而在函数之间保持复杂的空间相关性。