本发明属于网络安全的技术领域,具体涉及一种恶意代码检测方法及系统。
背景技术:
恶意代码检测一直是网络安全领域关注的焦点之一,木马病毒、蠕虫病毒、挖矿病毒、勒索病毒等恶意程序通过隐匿地注入和运行恶意代码,入侵系统、篡改文件、窃取信息等,对政府、企业、个人的隐私安全和财产安全有巨大威胁。随着恶意代码攻防技术之间不断对抗和升级,恶意代码的发展逐渐趋向多变种、高隐蔽性、数量多、更新快。目前对与恶意代码的分析技术可分为静态分析和动态分析,其中动态分析技术注重代码运行过程中的行为特征,较静态分析不受加壳、多态等影响,在恶意代码检测中被普遍应用。不同类型的恶意代码因其原理机制或获取权限的路径不同,代码特征呈现出多样化的特点,而部分隶属于同一家族的恶意代码及其变种则在代码特征上通常具有相似之处。基于上述特点,要利用机器学习从规模大、分布结构复杂、特征多样化的代码中检测出恶意代码,简单的分类算法已经不能满足需求,人们倾向于使用性能更高的智能检测模型来处理这一问题。
现有技术中,tian等人通过研究运行程序时的windowsapi调用日志来统计api调用的数量及特定的api调用频率提取代码特征,从而识别恶意程序和正常程序。shifuhou、lifeichen等人提出了一个基于聚类的恶意软件分类模型,该模型首先将数据集按不同的特征子集划分为多个基学习器,在每个学习器中利用k-means聚类算法将数据集划分为多个单一类别的类簇和一个混合类别的类簇并对混合类别类簇的数据训练相应的svm分类器,最后将多个学习器用简单投票的方式进行集成。
但是,tian等人提出的模型只关注了windowsapi的数量和频率,而没有考虑api调用序列中包含的上下文关系,丢失了数据的部分特征。shifuhou等人提出的模型将聚类后包含多种类别数据的类簇合并为一个大的混合类簇,这些类簇中有一部分是由于数据分布为非球状簇或类别边界模糊而导致类簇之间掺杂了彼此的部分数据点,但也有一部分类簇是由于包含少量异常点或噪音点而导致纯度降低。对于后者,混合类簇对应的数据子集往往数据分布高度不平衡,且在类簇合并后并无明显改善,在这种情况下,小样本数据分类易导致过拟合,并且这些在采集过程中产生的噪音点也有可能影响分类的准确度。因此,应根据不同的情况对这类混合类簇进行过滤等不同操作。
技术实现要素:
本发明的主要目的在于克服现有技术的缺点与不足,提供一种恶意代码检测方法及系统,本发明采用了tf-idf和doc2vec结合的方法,并基于聚类的分类方法进一步提高恶意代码检测的准确性。
为了达到上述目的,本发明采用以下技术方案:
一种恶意代码检测方法,包括下述步骤:
s1、将每个恶意代码运行过程中的windowsapi动作序列视作一个具有上下文关系的文本,分别使用tf-idf和doc2vec进行特征抽取;tf-idf是用来评估特定词语在语料库中重要程度,其中tf计算词语出现的频率,idf用以衡量词语对于文本类型的区分度;tf-idf算法流程具体为:
s11、计算每个windowsapi函数在动作序列中出现的频率tf以及包含该windowsapi的动作序列所占总数据集的比例idf;
s12、根据tf和idf计算windowsapi函数在动作序列中的tf-idf,将动作序列向量化;
doc2vec是word2vec的扩展,通过训练神经网络学习文本的特定长度向量表示,文本向量不仅包含了上下文信息,还包含了文本整体的语义信息;doc2vec算法流程具体为:
s13、构建doc2vec模型结构,并设置模型参数,
s14、训练doc2vec模型,利用随机梯度下降和反向传播从已知的训练数据中学习词向量、模型参数以及文本向量;
s15、推断过程,按照设置的参数和步骤更新文本矩阵d,学习新文本的向量表示;
s2、在分别获得tf-idf和doc2vec特征矩阵后,将tf-idf和doc2vec抽取到的特征进行拼接,降维后获得恶意代码的特征矩阵;
s3、构造基于聚类的集成分类改进模型,该集成分类改进模型基于集成学习的思想,分别采用多个基学习器对数据集进行分类,并在最后采用投票的方式获得最终分类结果,所述集成分类改进模型训练,在每个基学习器中采用基于聚类的分块分类方法进行训练,具体流程如下:
s31、用k-means算法将数据划分为k个数据子集,k个类簇中有一部分类簇只含有一种类别ci的数据,将这种这种类簇视为单一类别类簇,标记类簇类别为ci;
s32、对噪音点进行过滤,过滤掉类簇中其他数据类别不同且数量在簇中占比极小的点;
s33、将过滤后仍然含有多个类别数据的类簇合并为一个大的混合类簇,数据被划分为m个类簇,其中{c1,c2,…,cm-1}为单一类簇,cm为混合类簇,类簇向量用簇内向量的均值表示:
s34、训练svm分类器,对于混合类簇cm,训练对应的svm分类器sm用于预测数据类别;
s4、对模型进行预测,在模型预测阶段,将输入的数据分别输入各基学习器,在基学习器中,数据被划分到最近的类簇c中,如c为只含一种类别数据的单一类簇,则基学习器输出的预测类别为c类簇数据的类别;如c为混合类别类簇,则基学习器输出的预测为svm分类器的输出类别,最后根据投票原则,基学习器输出类别中占多数的类别为最终预测类别。
作为优选的技术方案,tf-idf具体为:
给定文本j中的一个词i,设ni,j为文本j中词i的数量,则该词的tf公式为:
设n为语料库中的文本总数,n(i)为包含词i的文本的数量,则该词的idf公式为:
根据tf和idf值,文本j中词i的tf-idf计算公式为:
tf-idfi,j=tfi,j*idfi。
作为优选的技术方案,步骤s11中,所述构建doc2vec模型结构共分为三层:输入层、投影层、输出层,
输入层包括2k个词的词向量w(t-k),…,w(t-1),w(t+1),…,w(t+k)和1个文本向量w(d),其中k为给定的滑动窗口大小;
投影层将输入的2k+1个词向量做求和平均处理:
输出层对应一棵huffman树,huffman树的每个叶子节点对应一个词,词频高的词在huffman树中的深度比词频低的词更小。
作为优选的技术方案,步骤s11中,模型参数设置如下:
pt:从根节点出发到词t对应的的叶子节点的路径;
lt:路径pt中包含节点的个数;
对于词典中任意词t,huffman树中必然存在唯一一条从根节点到t对应叶子节点的路径pt,路径pt上存在lt-1个分支,将每个分支看作一次二分类,则每一次分类对应一个概率,将这些概率连乘得到p(t|context(t)):
其中
和word2vec一样,doc2vec极大化目标函数使用的算法是随机梯度上升法,
则
事实上w(t)表示的是输入层中2k+1个词/文本向量的叠加,在doc2vec中根据
作为优选的技术方案,步骤s12中,训练doc2vec模型的步骤为:
(1)初始化词向量矩阵{w(t1),w(t2),…,w(tn)}、文本向量矩阵{w(d1),w(d2),…,w(dm)}、非叶节点向量θ、梯度参数η、滑动窗口大小k;
(2)从t=1,2…,n迭代循环(3)-(4);
(3)
(4)从j=2,3,…,lt迭代循环(5)-(9);
(5)
(6)
(7)
(8)
(9)更新t的2k+1个上下文词向量/文本向量w(i)=w(i)+e。
作为优选的技术方案,步骤s31中,k-means算法步骤如下:
s311、随机选定k个数据样本作为聚类中心点;
s312、根据数据与聚类中心点的聚类,将每个数据分配至离自己最近的类簇;
s313、计算每个类簇中所有对象的均值作为该类簇的新聚类中心点;
s314、判断聚类中心是否变化,如果是转至步骤s312,如果否,聚类结束。
作为优选的技术方案,步骤s32中,噪音点的判别标准如下:
其中{c1,c2,...,cm}为k-means划分后含有混合类别数据的类簇集合,ci(x)为类簇ci中与数据点x同类别的的数据集合,ε为阈值参数。
作为优选的技术方案,步骤s34中,训练svm分类器的过程如下:
s341、支持向量机的建模过程;
分类超平面为ωtx+b=0,支持向量所在超平面与分类超平面的几何间隔为d,则可以求出支持向量所在的超平面方程
对任意数据点(x(i),y(i))根据点到平面的距离关系有如下式子成立
不等式的两边同时除以距离d,并令
所以支持向量所在的超平面可记为
s342、支持向量机的目标函数;
训练支持向量机模型也就是求解下列二次规划问题,其中x(j)为支持向量
根据支持向量所在的超平面方程可知|ωtx(j)+b|=1故上述模型可以写成
s.ty(i)(ωtx(i)+b)≥1
即
s.ty(i)(ωtx(i)+b)≥1
支持向量机的目标函数一般写为对偶形式下的二次优化模型,为了不失一般性引入核函数,即求解下述问题
作为优选的技术方案,步骤s34中,svm算法的具体过程为:
假设输入空间是x∈rn,y∈{+1,-1},不妨假设含有m个样本数据(x(1),y(1))、(x(2),y(2))、…、(x(m),y(m)),其中x(i)∈x、y(i)∈y,精度为ε,输出近似解为
(1)取初值α0=0,令k=0;
(2)选取待优化变量
(3)更新
(4)利用
(5)计算bk+1和ei;
(6)在精度ε范围内检查是否满足如下的终止条件,其中
若满足则转(7);否则令k=k+1转到步骤(2);
(7)取
一种恶意代码检测系统,包括特征抽取模块、特征矩阵获取模块、集成分类改进模型构造模块以及模型预测模块;
所述特征抽取模块,用于将每个恶意代码运行过程中的windowsapi动作序列视作一个具有上下文关系的文本,分别使用tf-idf和doc2vec进行特征抽取;tf-idf是用来评估特定词语在语料库中重要程度,其中tf计算词语出现的频率,idf用以衡量词语对于文本类型的区分度;
所述特征获取模块,用于在分别获得tf-idf和doc2vec特征矩阵后,将tf-idf和doc2vec抽取到的特征进行拼接,降维后获得恶意代码的特征矩阵;
所述集成分类改进模型构造模块,基于集成学习的思想,分别采用多个基学习器对数据集进行分类,并在最后采用投票的方式获得最终分类结果;
所述模型预测模块,用于对模型进行预测,在模型预测阶段,将输入的数据分别输入各基学习器,在基学习器中,数据被划分到最近的类簇c中,如c为只含一种类别数据的单一类簇,则基学习器输出的预测类别为c类簇数据的类别;如c为混合类别类簇,则基学习器输出的预测为svm分类器的输出类别,最后根据投票原则,基学习器输出类别中占多数的类别为最终预测类别。
本发明与现有技术相比,具有如下优点和有益效果:
本专利在恶意代码特征抽取过程中采用了tf-idf和doc2vec结合的方法,其中tf-idf考虑了恶意代码动作序列中api出现的概率和频率,doc2vec考虑了动作序列的语义上下文关联,将二者结合起来有利于从恶意代码动作序列中获得更多特征信息,提高代码特征的完备性;采用基于聚类的分类方法减小了用于训练分类器的数据集复杂度,有助于提高分类器的准确率,本专利通过对噪点进行过滤,避免因分类器的训练数据不平衡而导致过拟合,并进一步降低训练数据的复杂度,从而提高恶意代码检测的准确性。
附图说明
图1是本发明恶意代码检测方法的流程图;
图2是本发明doc2vec模型结构的示意图;
图3是本发明k-means算法的流程图;
图4是本发明分类超平面的示意图;
图5是本发明分类超平面方程和支持向量所在的超平面方程示意图。
具体实施方式
下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
实施例
本实施例一种恶意代码检测方法,设计了一个基于特征集成和数据分区的恶意代码检测模型,模型主要分为两部分,第一部分利用tf-idf(termfrequency-inversedocumentfrequency,词频-逆文本频率)和doc2vec算法对恶意代码的动作序列进行特征抽取,第二部分在第一部分的基础上,使用基于聚类的集成分类改进模型对恶意代码进行分类。如图1所示,本实施例的具体内容如下:
s1、tf-idf和doc2vec抽取恶意代码家族特征融合
将每个恶意代码运行过程中的windowsapi动作序列视作一个具有上下文关系的文本,分别使用tf-idf和doc2vec进行特征抽取;
tf-idf是用来评估特定词语在语料库中重要程度的一种统计方法,其中tf计算词语出现的频率,idf用以衡量词语对于文本类型的区分度。给定文本j中的一个词i,设ni,j为文本j中词i的数量,则该词的tf公式为:
设n为语料库中的文本总数,n(i)为包含词i的文本的数量,则该词的idf公式为:
根据tf和idf值,文本j中词i的tf-idf计算公式为:
tf-idfi,j=tfi,j*idfi
doc2vec是word2vec的扩展,通过训练神经网络学习文本的特定长度向量表示,文本向量不仅包含了上下文信息,还包含了文本整体的语义信息;doc2vec的训练方法分为pv-dm(thedistributedmemorymodelofparagraphvectors,文本向量的分布式记忆模型)和pv-dbow(thedistributedbagofwordsversionofparagraphvector,文本向量的分布式词袋模型)两种,对于大多数任务,pv-dm的表现良好,因此本申请选用pv-dm作为训练方法。
设d为文本矩阵,其中每个列向量对应一个文本的向量表示;w为词矩阵,其中每个列向量对应一个词的向量表示。
doc2vec算法流程具体为:
s11、构建doc2vec模型结构,并设置模型参数;
如图2所示,doc2vec模型结构和word2vec相似,共分为三层:输入层、投影层、输出层;
输入层包括2k个词的词向量w(t-k),…,w(t-1),w(t+1),…,w(t+k)和1个文本向量w(d),其中k为给定的滑动窗口大小。
投影层将输入的2k+1个词向量做求和平均处理:
输出层对应一棵huffman树,huffman树的每个叶子节点对应一个词,词频高的词在huffman树中的深度比词频低的词更小。
模型参数设置如下:pt:从根节点出发到词t对应的的叶子节点的路径;
lt:路径pt中包含节点的个数;
对于词典中任意词t,huffman树中必然存在唯一一条从根节点到t对应叶子节点的路径pt,路径pt上存在lt-1个分支,将每个分支看作一次二分类,则每一次分类对应一个概率,将这些概率连乘得到p(t|context(t)):
其中
和word2vec一样,doc2vec极大化目标函数使用的算法是随机梯度上升法,
则
事实上w(t)表示的是输入层中2k+1个词/文本向量的叠加,在doc2vec中根据
s12、训练doc2vec模型,利用随机梯度下降和反向传播从已知的训练数据中学习词向量、模型参数以及文本向量;
训练doc2vec模型的步骤为:
(1)初始化词向量矩阵{w(t1),w(t2),…,w(tn)}、文本向量矩阵{w(d1),w(d2),…,w(dm)}、非叶节点向量θ、梯度参数η、滑动窗口大小k;
(2)从t=1,2…,n迭代循环(3)-(4);
(3)
(4)从j=2,3,…,lt迭代循环(5)-(9);
(5)
(6)
(7)
(8)
(9)更新t的2k+1个上下文词向量/文本向量w(i)=w(i)+e。
最后,在分别获得tf-idf和doc2vec特征矩阵后,将tf-idf和doc2vec抽取到的特征进行拼接,降维后获得恶意代码的特征矩阵。
s13、推断过程,按照设置的参数和步骤更新文本矩阵d,学习新文本的向量表示;
s2、在分别获得tf-idf和doc2vec特征矩阵后,将tf-idf和doc2vec抽取到的特征进行拼接,降维后获得恶意代码的特征矩阵;
s3、构造基于聚类的集成分类改进模型,该集成分类改进模型基于集成学习的思想,分别采用多个基学习器对数据集进行分类,并在最后采用投票的方式获得最终分类结果,具体为:
集成分类改进模型训练,在每个基学习器中采用基于聚类的分块分类方法进行训练,流程如下:
s31、用k-means算法将数据划分为k个数据子集,k个类簇中有一部分类簇只含有一种类别ci的数据,将这种这种类簇视为单一类别类簇,标记类簇类别为ci;如图3所示,k-means算法步骤如下:
s311、随机选定k个数据样本作为聚类中心点;
s312、根据数据与聚类中心点的聚类,将每个数据分配至离自己最近的类簇;
s313、计算每个类簇中所有对象的均值作为该类簇的新聚类中心点;
s314、判断聚类中心是否变化,如果是转至步骤s312,如果否,聚类结束。
s32、对噪音点进行过滤,数据集中可能会存在部分因数据采集或数据处理过程不当而产生的噪音点,这些噪音点的数据特征与所标记类别的数据的特征有很大差异,在类簇中体现为与簇中其他数据类别不同且数量在簇中占比极小。由于这些噪音点无法准确体现类别特征,影响分类精度,因此本发明对这些噪音点进行过滤;
值得注意的是,由于数据的分布结构各异,部分处于类别边界的数据点可能会被划分到其他类簇中,这部分数据在混合类簇中的表现和噪音点是相似的。
为了区分上述两种数据,噪音点的判别标准如下:
其中{c1,c2,...,cm}为k-means划分后含有混合类别数据的类簇集合,ci(x)为类簇ci中与数据点x同类别的的数据集合,ε为阈值参数。
我们忽略噪音点对类簇性质的影响,将只含有某一个类别ci的数据和噪音点的混合类别类簇视为单一类别类簇,类簇的对应类别标记为ci。
s33、将过滤后仍然含有多个类别数据的类簇合并为一个大的混合类簇,数据被划分为m个类簇,其中{c1,c2,…,cm-1}为单一类簇,cm为混合类簇,类簇向量用簇内向量的均值表示:
s34、训练svm分类器,对于混合类簇cm,训练对应的svm分类器sm用于预测数据类别;对于混合类簇cm,训练对应的svm(supportvectormachine,支持向量机)分类器sm用于预测数据类别。
支持向量机算法有很多优势,它通过引入核函数巧妙的解决了对于原始数据线性不可分这一难题。支持向量机的基本思想是在样本数据中训练出一个间隔最大化的线性分类器,其学习策略为间隔最大化,最终转化为求解一个凸二次规划问题。
训练svm分类器的过程如下:
s341、支持向量机的建模过程;
如图4所示,分类超平面为ωtx+b=0,支持向量所在超平面与分类超平面的几何间隔为,则可以求出支持向量所在的超平面方程
对任意数据点(x(i),y(i))根据点到平面的距离关系有如下式子成立
不等式的两边同时除以距离d,并令
所以支持向量所在的超平面可记为
由于分类超平面方程为ωtx+b=0在等式的两端同时除以‖ω‖2·d则可以写成
s342、支持向量机的目标函数;
训练支持向量机模型也就是求解下列二次规划问题,其中x(j)为支持向量
根据支持向量所在的超平面方程可知|ωtx(j)+b|=1故上述模型可以写成
s.ty(i)(ωtx(i)+b)≥1
即
s.ty(i)(ωtx(i)+b)≥1
支持向量机的目标函数一般写为对偶形式下的二次优化模型,为了不失一般性引入核函数,即求解下述问题
svm算法的具体过程为:
假设输入空间是x∈rn,y∈{+1,-1},不妨假设含有m个样本数据(x(1),y(1))、(x(2),y(2))、…、(x(m),y(m)),其中x(i)∈x、y(i)∈y,精度为ε,输出近似解为
(1)取初值α0=0,令k=0;
(2)选取待优化变量
(3)更新
(4)利用
(5)计算bk+1和ei;
(6)在精度ε范围内检查是否满足如下的终止条件,其中
s4、对模型进行预测,在模型预测阶段,将输入的数据分别输入各基学习器,在基学习器中,数据被划分到最近的类簇c中,如c为只含一种类别数据的单一类簇,则基学习器输出的预测类别为c类簇数据的类别;如c为混合类别类簇,则基学习器输出的预测为svm分类器的输出类别,最后根据投票原则,基学习器输出类别中占多数的类别为最终预测类别。
综上所述,本申请提出的一个恶意代码检测方法,目的在于提高恶意代码分类的准确度,主要分为两步:
第一步:针对传统的恶意代码检测的特征抽取只关注windowsapi出现的频率或api序列的上下文信息,本发明通过矩阵拼接的方式将二者进行结合,从而获取恶意代码动作序列的更多特征信息,提高了恶意代码特征的完备性,可以提高分类的准确度。
第二步:为了降低数据集的规模和复杂度,并考虑到噪音点对分类模型造成的过拟合等影响,本发明采用基于聚类的分类模型,在该模型中增加了过滤噪音点的步骤,进一步简化了分类数据集,提高了分类的准确率。
本实施例还提供了一种恶意代码检测系统,系统运行上述恶意代码检测方法,系统包括:特征抽取模块、特征矩阵获取模块、集成分类改进模型构造模块以及模型预测模块;
所述特征抽取模块,用于将每个恶意代码运行过程中的windowsapi动作序列视作一个具有上下文关系的文本,分别使用tf-idf和doc2vec进行特征抽取;tf-idf是用来评估特定词语在语料库中重要程度,其中tf计算词语出现的频率,idf用以衡量词语对于文本类型的区分度;
所述特征获取模块,用于在分别获得tf-idf和doc2vec特征矩阵后,将tf-idf和doc2vec抽取到的特征进行拼接,降维后获得恶意代码的特征矩阵;
所述集成分类改进模型构造模块,基于集成学习的思想,分别采用多个基学习器对数据集进行分类,并在最后采用投票的方式获得最终分类结果;
所述模型预测模块,用于对模型进行预测,在模型预测阶段,将输入的数据分别输入各基学习器,在基学习器中,数据被划分到最近的类簇c中,如c为只含一种类别数据的单一类簇,则基学习器输出的预测类别为c类簇数据的类别;如c为混合类别类簇,则基学习器输出的预测为svm分类器的输出类别,最后根据投票原则,基学习器输出类别中占多数的类别为最终预测类别。
上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。