欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

基于深度学习的恶意样本行为检测(含源码)

来源:本站整理 作者:佚名 时间:2018-09-03 TAG: 我要投稿

0×01 前言
目前的恶意样本检测方法可以分为两大类:静态检测和动态检测。静态检测是指并不实际运行样本,而是直接根据二进制样本或相应的反汇编代码进行分析,此类方法容易受到变形、加壳、隐藏等方式的干扰。动态检测是指将样本在沙箱等环境中运行,根据样本对操作系统的资源调度情况进行分析。现有的动态行为检测都是基于规则对行为进行打分,分值的高低代表恶意程度的高低,但是无法给出类别定义。
本文采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类尝试,分别测试了二分类和多分类方法,效果还有不小提升空间,希望共同交流。
0×02 现有技术
在大数据环境背景下,使用机器学习算法成为选择的趋势。相比手工分析,机器学习算法更加高效。目前已经有不少采用机器学习算法对样本动态行为进行检测的研究。Malheur由Konrad Rieck等人提出并给出了相应的开源实现,以样本中API出现的相对顺序作为特征向量,利用原型和聚类算法进行检测分析,该方法的缺点是特征向量过于稀疏,在高达几万维的特征向量中往往只有几十到几百维的特征值非零。
Radu等人采用随机森林算法检测恶意动态行为,根据API调用信息提取了68维的特征向量,对四类恶意样本进行了分类。该研究没有考虑白样本,适合在对样本黑白分类后进行恶意类别细分。Ivan等人用KNN,朴素贝叶斯,SVM,J48,MLP这5种算法进行了比较分析,不过其用于实验的总样本数只有470个,其结果的可靠性不是很高。笔者也用这些算法进行了实验,其结果没有论文中的数据那么好。
上述研究方法都采用了传统机器学习算法,利用手工分析获取特征向量进行分类处理,其结果受特征向量选取的影响极大。本文采用卷积神经网络(CNN)算法,借助CNN在自然语言处理方面的研究成果,进行样本的恶意动态行为检测。特点是不需要人工提取特征向量,具体的特征是算法根据样本的动态行为信息自行学习的。
CNN即卷积神经网络,1998年Yann LeCun设计了用于手写数字识别的卷积神经网络LeNet-5,后经Hinton及其学生Alex Krizhevskyx修改,于2012年获得了ImageNet竞赛冠军。之后CNN就得到了广泛应用,检测结果十分优异。下图是经典卷积神经网络LeNet-5的网络结构,可以看到CNN主要包括卷积层,降采样层和全连接层等部分。本文采用CNN算法分别对样本的动态行为进行二分类和多分类。二分类表示只根据样本的动态行为判别样本是否为恶意的。多分类是指对于恶意样本还更详细的划分出恶意类别信息。后面给出具体的算法实现过程。

0×03 数据预处理
通过在沙箱运行样本,获取样本的动态行为报告。这里受限于两个条件:1)样本能跑出动态行为;2)该样本在VirtusTotal上能查询到对应结果。由于当前处于预研阶段,故先采用了部分样本进行试验。动态行为报告格式如下图。

在实验过程中一共使用了7类共15921个样本。样本的分布如下表:

对于每一个样本,其原始的动态行为报告是json结构数据。为了便于使用,将原始报告转为了如下图(a)所示的文本格式。每个样本的行为由一个txt文档表示,文档中的每一行表示一个api调用。每一行分为三个部分,由空格分隔。第一部分是api类型,对应原始report.json中的category字段;第二部分是调用的api名称;剩下部分是调用过程中的相关参数。在实际实验过程中发现,不考虑参数信息时算法效果更好,所以去除了动态行为的参数信息,如下图(b)。最终使用时对于相邻的重复api调用只考虑一次,相当于做了去重处理,如下图(c)。经过处理后每个样本的动态行为日志信息可以得到大幅度精简。

经过格式转换后,动态行为检测问题就变成了对文本的分类问题。因此可以采用CNN在自然语言处理方面的方法。
0×04 算法实现
1.  获取词库
在动态行为文本中的每一行表示一个动态行为,将一行视为一个整体,遍历所有的动态行为日志,获取所有出现过的动态行为,作为词库。用连续数字对词库中的每一个词进行标号,这样可以获取动态行为到标号id的映射。注意,除了出现过的动态行为外,还另外添加了一个“Unknown”动态行为,用于之后匹配不在词库中的未知行为。下图是一个简单的例子,表示在一共只有两个样本的情况下,获取到的词库信息。

2.  将样本转为矩阵表示
CNN最初用于图像处理。在使用CNN进行文本分类时首先需要将文本转为类似图片的二维矩阵。为了实现文本的矩阵表示,先将词库中的每一个词用一个长度为300的向量表示,这个向量长度是一个可以选择的参数。初始化向量时采用随机初始化,之后会随着训练不断更新词向量。对于每一个样本,将样本中的动态行为根据词库转换为对应的id序列。再根据此id序列以及词库中每个id的向量将样本转换为二维矩阵。整体过程如下图所示。注意,在转换过程中需要制定最大词长度,以保证所有样本转换后的矩阵有相同的维度。对于长度不足的样本需要在最后进行补0,对于超长的样本,笔者尝试过用tf-idf分析处理,但实际效果并没有提升,所以这里采用直接截断。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载