实验内容来源于:Deep learning based Sequential model for malware analysis using Windows exe API Calls。虽然这只是一篇3区的论文,但是我觉得作者做的工作挺好的。在这篇论文中,作者提出了一个方法从公网上收集8种不同类型的恶意软件,并将其API调用序列保存下来。接下来,作者将获取的不同恶意软件的API调用序列作为输入数据,通过不同的机器学习算法作为模型来构建分类器。数据集以及相关代码作者也都放在github上,链接为:Windows Malware Dataset with PE API Calls。链接中的代码是基于Keras框架编写了一系列的分类器,其实最终的实验是表明通过SVM算法构建的分类器性能最优。
本文基于Pytorch框架实现了基于LSTM的分类器,至于基于其他算法构建的分类器,感兴趣还是去看看作者的论文和代码。在论文中,作者还是做了很多的实验,其中也包括了二分类的实验。
Python版本:3.6.13
Pytorch版本:1.8.1
CUDA版本:11.4
数据集的生成过程如下图所示,首先作者从github上下载一些恶意软件,接着分别通过VirusTotal和恶意软件的哈希值来获取恶意软件的类别,通过Cuckoo来获取恶意软件的API调用序列,最终将每个恶意软件的API调用序列和它所属的类别都保存起来构成数据集。
不过此时的数据集还不能用,因为输入数据都是如下图所示的调用的API名称:
所以作者给每一个API都指定了一个整型数字,将每个恶意软件的API调用序列都转换成一串数字:
最终作者共收集了8个类别,总计7107个恶意软件,数据样本分布如下:
以下是数据类的参考代码,由于会用10折交叉验证来验证分类器精度,所以数据的读取是在get_data函数中完成的:
下图是一个典型的神经网络示意图,虽然神经网络已经可以拟合出很复杂的曲线了,可是同一层隐藏层中的神经元直接并没有联系,也就是说同一层隐藏层中的神经元的信息并不能传递给同一层隐藏层中另一个神经元。
可是对于一些任务来说,数据的顺序是非常重要的,如手写识别,语音识别,语音翻译和时间序列分析等。在安全领域,则是如网络流量分析,行为检测和静态文件分析这些问题相关。举一个例子说明,比如一个软件API调用序列为FindFirstFile,DeleteFile,FindNextFile,DeleteFile,FindNextFile...。如果是普通的神经网络,它很有可能认为该软件只是在删除一些文件,因为它没有考虑到调用的调用DeleteFile前后调用了什么函数。
为了更好地处理这些具有序列特征地数据,就有了循环神经网络(RNN),下图为RNN的一个示意图,此时每一层隐藏层(绿色长方形)神经元的输出信息除了会传递给下一层神经元之外,还会传递给同一层隐藏层的下一个神经元,也就是说神经元的输出会影响到同一层的隐藏层中下一个神经元的输出,这样当神经元在处理DeleteFile的时候,会考虑到调用DeleteFile前调用的函数,就很有可能会得出,此时软件正在进行格盘操作。
RNN网络中引入的每个时间步长类似于前馈神经网络中的一整个额外层,在后向传播期间,由于梯度消失将会导致前面神经元的信息传递到到后面的神经元的时候,信号变得非常微弱,因此,有了长短期记忆网络(LSTM)。
LSTM是一种特殊类型的RNN网络,示意图如下,和普通的RNN网络不同的是,该网络中包含了记忆细胞和特殊神经元,它们试图决定记住哪些信息以及忘记哪些信息。剔除大部分信息极大地限制了梯度消失问题,因为这样减少了路径爆炸。
接下来看一下论文作者给出的用于构建分类的基于LSTM的示意图:
模型还是简单的,经过embedding层后,紧接着就是LSTM,最后通过全连接层将结果输出,以下是参考代码:
基于作者的论文和代码,本文构建的分类器的参数信息如下:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-4-13 19:54
被1900编辑
,原因: