本发明涉及android平台上恶意代码检测研究领域,尤其涉及一种结合权限和api调用序列特征的android恶意软件检测方法。
背景技术:
近些年来,随着移动设备的快速发展,移动应用软件在人们生活和工作中起到了越来越重要的作用。通常,用户期望使用的应用是安全的、可靠的,然而在种类繁多的应用软件中充斥着大量的恶意软件,不断威胁着用户的信息安全。恶意软件(俗称“流氓软件”)是指在未明确提示用户或未经用户许可的情况下,在用户计算机或其他终端上安装运行,侵犯用户合法权益的软件。在2017年第一季度,gdata研究人员发现了大约750,000个新的恶意软件。同样地,卡巴斯基官方报告显示,在2020年第一季度已检测出1,152,662个恶意软件安装包,同比上一年新增171,669个。因此,对于恶意软件的有效检测是恶意代码检测研究领域中的重要研究问题。
通常来说,恶意软件检测技术主要可以分为静态检测和动态检测这两类技术。静态检测技术是指在不运行代码的情况下,利用反编译技术,和代码控制流图分析、数据流分析等方法对软件代码进行检测。该方法具有安全性高、检测速度快、代码覆盖率高等优点,但检测的准确度较低。动态检测技术是指通过运行代码,并记录代码运行过程中的一系列程序行为,如函数调用顺序、文件访问、网络使用等等,并利用这些信息对软件代码进行检测。与静态检测技术相比,该方法优势在于检测恶意软件的准确度较高,但存在代码覆盖率低、检测效率低等缺点。
技术实现要素:
为了克服现有技术的不足,本发明提供一种结合权限和api调用序列特征的android恶意软件检测方法,可有效解决上述问题。
本发明具体采用的技术方案如下:
步骤(1)给定n个android应用软件安装包(apk)集合a=(a1,a2,…an),将其中每个apk表示成ai=<apkid,mainfest,dex,lable>,i=1,2…n,其中apkid表示apk编号,mainfest表示apk中的清单文件(包含应用程序的配置信息),dex表示apk中的.dex后缀文件(包含应用程序中所有的代码),label表示apk的类别,即恶意的或非恶意的。
步骤(2)对每个apk进行特征抽取。
首先,从mainfest文件中抽取所有的请求的权限信息,记作permission=<per1,per2,…perk>,其中k表示该apk请求权限的个数;然后,利用androguard逆向工程工具反编译dex文件,识别每个指令代码并抽取所有的api调用序列,记作sequence=<api1,api2,…apim>,每个api表示成apij=<packagename,classname,functionname>,j=1,2,…m,其中packagename表示该api的包名,classname表示该api的类名,functionname表示该api的函数名。通过特征抽取后,每个apk可以进一步表示为ai=<apkid,permission,sequence,lable>,i=1,2…n。
步骤(3)对于permission和sequence进行预处理。
根据官方文档定义的权限列表,过滤permission中第三方或自定义的权限;通过识别api中的packagename,过滤sequence中非官方的api。经过预处理后,每个apk可以表示为ai=<apkid,prepermission,presequence,lable>,i=1,2…n。
步骤(4)对权限特征进行向量化表示。
首先将数据集中所有样本(一个apk文件代表一个样本)请求的不同权限,构建一个权限字典;然后利用one-hot编码方法将prepermission用向量形式表示,记作vp=[x1,x2,…xc],其中c表示字典的大小,xi代表字典中的第i个权限,xi=0表示该prepermission中不包含该权限,xi=1则表示该prepermission中包含该权限。
步骤(5)对api调用序列特征进行向量化表示。
将每个api看作不同的单词,一个api序列则可以看作一个句子,因此在本发明中,参考了自然语言处理中的词嵌入技术,对每个api进行表示。
首先合并集合a上所有的presequence,生成一个语料库q=(presequence1,presequence2,…presequencen)。然后利用word2vec中的skip-gram模型对q中的单词进行训练,得到每个api的向量表示vapi=[v1,v2,…vd],其中d代表向量的维度。
步骤(6)数据集划分。将数据集划分为十折,其中九折作为训练集ξtrain,剩下一折作为测试集ξtest。
步骤(7)利用随机森林(randomforest,rf)模型训练一个基于权限的分类器mrf。随机森林算法会生成多颗决策树,并对数据进行分类预测,最后通过投票给出最后的分类结果,具体步骤如下:
7-1,设置模型参数:numberoftrees(决策树的数量)和leafmin(最小的叶子节点数量);
7-2,将训练集ζtrain所有权限的向量表示vp输入到rf模型;
7-3,有放回的随机抽样(bagging)生成每棵树的训练数据,未被抽取的样本形成oob数据集;
7-4,在每棵决策树分裂节点时,计算不同划分属性下的信息增益,选择最佳的分裂属性,进行划分,重复该过程直到不能够再分裂为止;
7-5,将oob数据集输入计算决策树集合中,根据其分类的正确率,以此作为每棵决策树的权重,生成随机森林模型mrf,即分类器模型mrf
7-6,将测试集ξtest输入到模型mrf中,得到每个apk的预测结果rrf。
步骤(8)利用卷积神经网络(convolutionalneuralnetworks,cnn)模型训练一个基于api调用序列的分类器mcnn,具体步骤如下:
8-1,设置模型参数:numberoftheconvolutionfilters(卷积核的数量)、convolutionfiltersizes(卷积核大小)、numberofepochs(cnn训练的迭代次数)、batchsize(批量大小)、embeddingsize(词向量维度)和dropoutrate;
8-2,将训练集ξtrain所有api的向量表示vapi输入到cnn模型;
8-3,对于训练集ξtrain中数据,首先利用三个不同尺寸的卷积核执行卷积操作,然后对每个卷积结果进行最大池化1-max操作,输出o1,o2,o3;
8-4,先对o1,o2,o3进行展平操作,转化为一维的向量,再输入到全连接层;在全连接层到输出层中采用激活函数softmax,输出分类结果cp;
8-5,卷积神经网络模型通过损失函数loss计算分类结果cp和真实值ct之间的损失,即cp和ct之间差值,不断优化模型中的参数;
8-6,当模型达到设定的迭代次数时,迭代结束,输出预测模型mcnn,即分类器模型mcnn;
8-7,将测试集ξtest输入到预测模型mcnn中,得到预测结果rcnn。
步骤(9)在分别根据mrf和mcnn得到相应的预测结果mrf和rcnn后,将他们通过线性结合的方法计算最后的预测结果,其中线性组合公式如下所示:
rfinal=(1-α)rrf αrcnn
其中参数α表示分类器的权重。
本发明提出结合权限和api调用序列信息预测android恶意软件,并且分别采用随机森林和卷积神经网络模型训练分类器,最后通过线性结合的方法计算最终的预测结果。相比于传统的android恶意软件检测方法,本发明具有如下收益:
1、在特征抽取阶段,本发明采用权限信息以及api调用序列信息来表示每个android应用程序。在后续的步骤中去除冗余的信息,降低了后续模型训练的时间,并且通过词嵌入(skip-gram)方法表示每个api,在降低表示向量维度的同时保留了api之间的语义信息,使得cnn模型可以捕获丰富的n-gram特征,大大提高了特征向量化表示的效果;
2、使用分类器混合的方式,结合了随机森林预测模型和卷积神经网络预测模型,进一步提高分类结果的准确度,增强预测模型的性能。
附图说明
图1为本发明结合权限和api调用序列特征的android恶意软件检测方法的流程图;
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进行进一步详细说明。
为叙述方便,定义相关符号如下:
a:android应用程序安装包(apk)集合。
permission:单个apk中包含的请求列表。
sequence:单个apk中api调用序列。
apij:第j个api。
vp:权限特征的向量表示。
vapi:api的向量表示。
q:由api调用序列构建的语料库。
ξtrain:apk90%的子集作为训练集。
ξtest:apk10%的子集作为测试集。
mrf:基于随机森林的预测模型。
mcnn:基于卷积神经网络的预测模型。
rrf:随机森林预测模型对测试集的预测结果。
rcnn:卷积神经网络预测模型对测试集的预测结果。
α:分类器的权重参数。
rfinal:对测试集预测的最终结果。
数据源获取:本发明所用的原始数据来自由wu整理的公开数据集。该数据集是从androzoo网站上获取原始数据,并借助virustotal上的多个检测方法对数据进行标注。每个样本由以下几部分组成:样本编号、安装包的清单文件、安装包的代码文件以及标注的类别信息等等。
以下结合附图1,对本发明专利提供的一种结合权限和api调用序列特征的android恶意软件检测方法进行详细说明,包括以下步骤:
步骤(1)给定n个android应用软件安装包(apk)集合a=(a1,a2,…an),将其中每个apk表示成ai=<apkid,mainfest,dex,lable>,i=1,2…n,其中apkid表示apk编号,mainfest表示apk中的清单文件(包含应用程序的配置信息),dex表示apk中的.dex后缀文件(包含应用程序中所有的代码),label表示apk的类别,即恶意或非恶意,
步骤(2)对每个apk进行特征抽取。
首先,从mainfest文件中抽取所有的请求的权限信息,记作permission=<per1,per2,…perk>,其中k表示该apk请求权限的个数;然后,利用androguard逆向工程工具反编译dex文件,识别每个指令代码并抽取所有的api调用序列,记作sequence=<api1,api2,…apim>,每个api表示成apij=<packagename,classname,functionname>,j=1,2,…m,其中packagename表示该api的包名,classname表示该api的类名,functionname表示该api的函数名。通过特征抽取后,每个apk可以进一步表示为ai=<apkid,permission,sequence,lable>,i=1,2…n。
步骤(3)对于permission和sequence进行预处理。
根据官方文档定义的权限列表,过滤permission中第三方或自定义的权限;通过识别api中的packagename,过滤sequence中非官方的api。经过预处理后,每个apk可以表示为ai=<apkid,prepermission,presequence,lable>,i=1,2…n。
步骤(4)对权限特征进行向量化表示。首先将数据集中所有样本(一个apk文件代表一个样本)请求的不同权限,构建一个权限字典;然后利用one-hot编码方法将prepermission用向量形式表示,记作vp=[x1,x2,…xc],其中c表示字典的大小,xi代表字典中的第i个权限,xi=0表示该prepermission中不包含该权限,xi=1则表示该prepermission中包含该权限。
步骤(5)对api调用序列特征进行向量化表示。将每个api看作不同的单词,一个api序列则可以看作一个句子,因此在本发明中,参考了自然语言处理中的词嵌入技术,对每个api进行表示。
首先合并集合a上所有的presequence,生成一个语料库q=(presequence1,presequence2,…presequencen)。然后利用word2vec中的skip-gram模型对q中的单词进行训练,得到每个api的向量表示vapi=[v1,v2,…vd],其中d代表向量的维度。
步骤(6)数据集划分。将数据集划分为十折,其中九折作为训练集ξtrain,剩下的一折作为测试集ξtest。
步骤(7)利用随机森林(randomforest,rf)模型训练一个基于权限的分类器mrf。随机森林算法会生成多颗决策树,并对数据进行分类预测,最后通过投票给出最后的分类结果,具体步骤如下:
7-1,设置模型参数:
·numberoftrees:131
·leafmin:1
7-2,将训练集ξtrain所有权限的向量表示vp输入到rf模型;
7-3,有放回的随机抽样(bagging)生成每棵树的训练数据,未被抽取的样本形成oob数据集;
7-4,在每棵决策树分裂节点时,计算不同划分属性下的信息增益,选择最佳的分裂属性,进行划分,重复该过程直到不能够再分裂为止;
7-5,将oob数据集输入计算决策树集合中,根据其分类的正确率,以此作为每棵决策树的权重,生成随机森林模型mrf;
7-6,将测试集ξtest输入到模型mrf中,得到每个apk的预测结果rrf。
步骤(8)利用卷积神经网络(convolutionalneuralnetworks,cnn)模型训练一个基于api调用序列的分类器mcnn,具体步骤如下:
8-1,设置模型参数:
·numberoftheconvolutionfilters:512
·convolutionfiltersizes:[3,4,5]
·numberofepochs:10
·batchsize:64
·embeddingsize:64
·dropoutrate:0.5
8-2,将训练集ξtrain所有api的向量表示vapi输入到cnn模型;
8-3,对于训练集ξtrain中数据,首先利用三个不同尺寸的卷积核执行卷积操作,然后对每个卷积结果进行最大池化1-max操作,输出o1,o2,o3;
8-4,先对o1,o2,o3进行展平操作,转化为一维的向量,再输入到全连接层;在全连接层到输出层中采用激活函数softmax,输出分类结果cp;
8-5,卷积神经网络模型通过损失函数loss计算分类结果cp和真实值ct之间的损失,即cp和ct之间差值的程度,不断优化模型中的参数;
8-6,当模型达到设定的迭代次数时,迭代结束,输出预测模型mcnn;
8-7,将测试集ξtest输入到预测模型mcnn中,得到预测结果rcnn。
步骤(9)在分别根据mrf和mcnn得到相应的预测结果rrf和rcnn后,将他们通过线性结合的方法计算最后的预测结果,其中线性组合公式如下所示:
rfinal=(1-α)rrf αrcnn
其中参数α表示分类器的权重,在本发明中,α的值为0.6。
1.一种android恶意软件检测方法,其特征在于包括如下步骤:
步骤(1)给定n个android应用软件安装包apk集合a=(a1,a2,…an);
将每个apk表示成ai=<apkid,mainfest,dex,lable>,i=1,2…n;
其中apkid表示apk编号,mainfest表示apk中的清单文件,dex表示apk中的.dex后缀文件,label表示apk的类别,即恶意或非恶意;
步骤(2)对每个apk进行特征抽取
从mainfest文件中抽取所有的请求的权限信息,记作permission=<per1,per2,…perk>,其中k表示该apk请求权限的个数;
利用androguard逆向工程工具反编译dex文件,识别每个指令代码并抽取所有的api调用序列,记作:
sequence=<api1,api2,…apim>
每个api表示成:
apij=<packagename,classname,functionname>
其中packagename表示该api的包名,classname表示该api的类名,functionname表示该api的函数名,j=1,2,…m;
通过特征抽取后,每个apk进一步表示为:
ai=<apkid,permission,sequence,lable>,i=1,2…n;
步骤(3)对于permission和sequence进行预处理;
步骤(4)对权限特征进行向量化表示;
步骤(5)对api调用序列特征进行向量化表示;
步骤(6)数据集划分,将集合a分为训练集ξtrain和测试集ξtest;
步骤(7)利用随机森林模型训练一个基于权限的分类器mrf;
步骤(8)利用卷积神经网络模型训练一个基于api调用序列的分类器mcnn;
步骤(9)根据mrf和mcnn对测试集ξtest预测,得到相应的预测结果rrf和rcnn后,通过线性结合的方法计算最终的检测结果。
2.根据权利要求1所述的一种android恶意软件检测方法,其特征在于步骤(3)具体如下:
根据官方文档定义的权限列表,过滤permission中第三方或自定义的权限;
通过识别api中的packagename,过滤sequence中非官方的api;
经过预处理后,每个apk表示为:
ai=<apkid,prepermission,presequence,lable>。
3.根据权利要求2所述的一种android恶意软件检测方法,其特征在于步骤(4)具体如下:
将数据集中所有样本请求的不同权限构建成权限字典,其中一个apk文件代表一个样本;
利用one-hot编码方法将prepermission用向量形式表示,记作vp=[x1,x2,…xc];
其中c表示字典的大小,xi代表字典中的第i个权限,xi=0表示该prepermission中不包含该权限,xi=1则表示该prepermission中包含该权限。
4.根据权利要求1或2所述的一种android恶意软件检测方法,其特征在于步骤(5)具体如下:
将每个api看作不同的单词,一个api序列则看作一个句子,合并集合a上所有预处理后的api调用序列presequence,生成一个语料库:
q=(presequence1,presequence2,…presequencen);
利用word2vec中的skip-gram模型对q中的单词进行训练,得到每个api的向量表示vapi=[v1,v2,…vd],其中d代表向量的维度。
5.根据权利要求1所述的一种android恶意软件检测方法,其特征在于步骤(7)具体如下:
7-1,设置随机森林模型参数:决策树的数量和最小的叶子节点数量;
7-2,将训练集ξtrain所有权限的向量表示vp输入到随机森林模型;
7-3,有放回的随机抽样生成每棵树的训练数据,未被抽取的样本形成oob数据集;
7-4,在每棵决策树分裂节点时,计算不同划分属性下的信息增益,选择最佳的分裂属性,进行划分,重复本步骤直到节点不能分裂为止;
7-5,将oob数据集输入计算决策树集合中,计算每棵决策树分类的正确率,并以此作为每棵决策树的权重,最后生成分类器模型mrf;
7-6,将测试集ξtest输入到分类器模型vrf中,得到每个apk的预测结果rrf。
6.根据权利要求1所述的一种android恶意软件检测方法,其特征在于步骤(8)具体如下:
8-1,设置卷积神经网络模型参数:卷积核的数量、卷积核大小、卷积神经网络训练的迭代次数、批量大小、向量维度和dropoutrate;
8-2,将训练集ξtrain所有api的向量表示vapi输入到卷积神经网络模型;
8-3,对于训练集ξtrain中数据,首先利用三个不同尺寸的卷积核执行卷积操作,然后对每个卷积结果进行最大池化1-max操作,输出o1,o2,o3;
8-4,先对o1,o2,o3进行展平操作,转化为一维的向量,再输入到全连接层;在全连接层到输出层中采用激活函数softmax,输出分类结果cp;
8-5,卷积神经网络模型通过损失函数loss计算分类结果cp和真实值ct之间的损失,即cp和ct之间差值的程度,不断优化卷积神经网络模型中的参数;
8-6,当卷积神经网络模型达到设定的迭代次数时,迭代结束,输出分类器模型mcnn;
8-7,将测试集ξtest输入到分类器模型mcnn中,得到预测结果rcnn。
7.根据权利要求1所述的一种android恶意软件检测方法,其特征在于步骤(9)所述的进行线性组合具体如下:
rfinal=(1-α)rrf αrcnn
其中参数α表示分类器的权重。
技术总结