恶意软件样本由NTT Secure Platform Laboratory收集,共26个恶意软件,使用Symantec(赛门铁克)将其标记为11个家族。算法
在Ubuntu上使用VirtualBox搭建windows环境,使用Process Monitor、INetSim二、Cuckoo Sandbox等工具生成恶意和良性软件的日志。共生成81个恶意软件、69个良性软件日志文件。windows
日志数据生成环境以下图:安全
使用Process Monitor来记录ReadFile,RegSetValue,Thread Start等行为;
经过Process Monitor记录的行为(Operation)数据以下表所示。网络
字段 | 说明 |
---|---|
Time | Operation执行时间 |
Process Name | Process名 |
PID | Operation的PID |
Event | Operation名 |
Path | Operation执行时所在路径 |
Result | 执行结果状态 |
Detail | 参数等信息 |
Result记录了Operation的结果,如SUCCESS,ACCESS DENIED,FILE NOT FOUND等;
Detail记录了参数等信息。函数
算法的主要思路为:将Process行为日志转化为向量,使用RNN转换为特征图像,在用CNN对这些特征图像进行分类。
流程图以下:工具
Step1: 监视Process的行为,并生成日志文件。
Step2: 将日志数据转为one-hot向量,按Operation执行输入RNN训练,获取trained RNN模型。
Step3: 用trained RNN从日志文件中提取特征,并将特征转换为特征图像。
Step4: 使用标有恶意、良性标签的特征图像数据,训练CNN模型。
Step5: 训练结束后,由训练的RNN模型将Process行为日志文件转化为特征图像,再由训练的CNN模型进行分类,最后输出Process为恶意软件的几率。学习
将日志文件的Operation数据基于Operation Name转为one-hot向量做为输入,隐藏层\(h^1\)的神经元为普通神经元,\(h^2\)、\(h^3\)层为LSTM神经元。
网络结构以下:spa
用trained RNN提取Process的特征并生成特征图像。
特征提取流程以下图所示:日志
将日志文件中的Operation转换为one-hot向量,而后依次将它们输入到trained RNN中。 获取每一个输入的第三隐藏层\(h^3\)的值,获得集合{\(h^3_1\),\(h^3_2\),...,\(h^3_L\)}。 CNN模型输入图像矩阵为固定大小,故需将每一个Process日志文件转为相同大小的特征图像矩阵。
用了如下等式将Operation特征向量集转为Process特征图像矩阵\(F\):orm
\(f_k\):固定大小的特征图像矩阵的元素
\(N\):集合{\(h^3_1\),\(h^3_2\),...,\(h^3_L\)}分为N组并计算每组的平均值,\(N\)也就是特征图像矩阵\(F\)的行数。
\(p_k\):第\(k\)个矢量集的最后一个数。
\(W\):设为第3隐藏层的维数,则固定向量序列能够描述为矩阵F.
经过sigmoid函数将矩阵F的每一个元素映射到[0,1]空间,并乘以255来造成256级灰度图像。 最后,输出矩阵\(F\)做为特征图像矩阵。
使用带有恶意、良性标记的特征图像矩阵做为输入训练CNN网络。CNN网络结构以下图:
输出\(y_0\)、\(y_1\)分别为为良性软件、恶意软件的几率。可用sigmoid函数\(Sig\)(\(y_1\))计算出为恶意软件的几率。
做者尝试了不一样的RNN的隐含层维度、CNN输入矩阵大小、CNN卷积层池化层参数\(w\)。使用5折交叉验证,最佳结果为在下表中Cond2条件时,AUC为0.96。
在恶意程序检测方向,将程序的动静态数据转为图像,再套用CNN对图像分类,这是一个常见的思路。