一种基于层次式SimHash的Android恶意代码分类方法与流程

文档序号:12720921阅读:194来源:国知局
一种基于层次式SimHash的Android恶意代码分类方法与流程

本发明涉及Android恶意代码相检测分类技术领域,尤其是一种基于层次式simhash的Android恶意代码检测方法。



背景技术:

随着移动互联网的发展,移动智能终端越来越普及,移动应用的种类与数量都呈现高速增长,智能手机已经成为网民最常用的上网工具。来自Gartner统计数据显示,2015年第4季度全球智能手机的销售量为4亿多台,其中Android系统占据了80.7%。截止2016年2月1日,仅Android官方应用市场Google Play上的应用数量就接近200万。同时,移动恶意应用的种类与数量也呈现高速增长,根据阿里聚安全发布的2015移动安全病毒年报,18%的Android设备感染过病毒,95%的热门移动应用存在仿冒应用,恶意应用类型越来越多。常见手机病毒的恶意行为包括恶意扣费、信息窃取、短信劫持等,可严重损害手机用户的利益,危害不容忽视。

Android恶意代码检测方法主要有基于特征代码和基于行为的检测。基于行为的检测方法则通过程序的行为与已知恶意行为模式进行匹配,判断目标文件是否包含恶意代码。误报率虽然并不理想,但可实现对未知恶意代码或病毒的检测,弥补基于特征代码的检测。基于行为的分析又可进一步分为动态和静态两种分析方法。动态分析方法是指利用“沙盒或虚拟机”来模拟运行程序,通过拦截或监控的方式分析程序运行时的行为特征,一定程度上可绕过代码混淆等代码保护机制,但是计算资源和时间消耗较大,且代码覆盖率低。相对于重量级的动态分析,静态分析则相对属于轻量级的方法,通常是通过逆向工程抽取程序的特征,分析函数调用、程序指令等序列,具有快速高效、代码覆盖率高等特点。其主要缺陷是分析时间较长,同时误报率并不稳定。

基于特征代码的检测方法通过检测文件是否拥有已知恶意软件的特征代码来判断其是否为恶意软件,具有快速、准确率高等特点。国外著名的Android恶意代码检测工具Androguard就是基于特征代码实现的。

simhash算法是由GoogleMosesCharikar发表的一篇论文“detecting near-duplicates for web crawling”中提出的,专门用来解决亿万级别的网页的去重任务。

simhash作为locality sensitive hash(局部敏感哈希)的一种:

其主要思想是降维,将高维的特征向量映射成低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。

其中,Hamming Distance,又称汉明距离,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。也就是说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101与1001001之间的汉明距离是2。至于我们常说的字符串编辑距离则是一般形式的汉明距离。

如此,通过比较多个文档的simHash值的海明距离,可以获取它们的相似度。simhash值的生成图解如图1所示。

算法过程大概如下:

1,将一个f维的向量V初始化为0;f位的二进制数S初始化为0;

2,对每一个特征:用传统的hash算法对该特征产生一个f位的签名b。对i=1到f:

如果b的第i位为1,则V的第i个元素加上该特征的权重;

否则,V的第i个元素减去该特征的权重。

3,如果V的第i个元素大于0,则S的第i位为1,否则为0;

4,输出S作为签名。

该算法首先将每一个特征映射为f维空间的一个向量,这个映射规则具体是怎样并不重要,只要对很多不同的特征来说,它们对所对应的向量是均匀随机分布的,并且对相同的特征来说对应的向量是唯一的就行。比如一个特征的4位hash签名的二进制表示为1010,那么这个特征对应的4维向量就是(1,-1,1,-1)T,即hash签名的某一位为1,映射到的向量的对应位就为1,否则为-1。然后,将一个文档中所包含的各个特征对应的向量加权求和,加权的系数等于该特征的权重。得到的和向量即表征了这个文档,我们可以用向量之间的夹角来衡量对应文档之间的相似度。最后,为了得到一个f位的签名,需要进一步将其压缩,如果和向量的某一维大于0,则最终签名的对应位为1,否则为0。这样的压缩相当于只留下了和向量所在的象限这个信息,而64位的签名可以表示多达264个象限,因此只保存所在象限的信息也足够表征一个文档了。

但是,单一的使用simhash方法对Android恶意代码的检测和分类,在实际情况中有很大可能性出现误报等情况,其中由于各种不稳定因素,会导致检测的结果出现误差。

Voted Perceptron算法基于Rosenblatt and Frank在1957年提出的感知器算法,它充分利用了具有大分界面的线性可分数据。该算法具有实现简单,比SVM更高效的特点,也被运用于使用核函数的高维空间问题中。有人[Manabu Sassano,IJCNLP]在自然语言处理实验中比较了Voted Perceptron和SVM的分类效率,发现Voted Perceptron与SVM准确性相当,但学习时间和预测速度略胜一筹。

该方法简介如下:

假设特征向量为X,|X|表示X的欧氏长度,X的标签y的取值为{-1,1}。该算法初始一个0预测向量V,V用于以后预测新的特征向量X的标签。即y'=sign(v.x)。如果预测值y'不同于真实值y,则更新预测向量v,即v=v+yx。如果y与y'相同,则v不变。这个过程反复进行。如果数据是线性可分,该算法已被证明为只会预测有限次错误。因此,如果反复训练数据,V将会收敛到一个能正确分类所有X的向量。预测错误的次数是O(|#y1-#y-1|)的,即错误的次数与y为1与y为-1的次数差有关。

在训练过程中,可以存储更多信息可以在测试集上产生更好的预测效果。在发现预测错误后,记录此时的预测向量V。当下一个预测错误产生时,我们计算该V预测正确的次数。将预测正确的次数作为预测向量V的权重。当测试过程中预测一个向量的标签时,计算每个预测向量的预测值-1或1,然后用权重组合这些预测值,得到一个最终的预测值。该方法基于这样的直觉:既然某个预测向量能产生更多的正确预测值,那就应该有更大的权重。详细算法图如图2。



技术实现要素:

为了克服已有恶意代码检测和分类方法的结果可行度较低的不足,本发明提供了一种结果可信度较高的基于层次式simhash的Android恶意代码检测和分类方法,该方法可以快速有效的检测Android应用程序,并将其准确的进行分类,并能够及时给出其恶意家族的类别信息。

本发明解决其技术问题所采用的技术方案是:

一种基于层次式simhash的Android恶意代码检测和分类方法,包括以下步骤:

步骤一,恶意代码检测和恶意家族的训练集,过程如下:

对已知各个恶意家族中的恶意应用程序进行分层次提取,分别从xml文件、smali代码、smali代码指令集、java代码、java代码指令集这5个方面分析应用程序,从而对每一个应用程序建立5个特征,对每个恶意家族,建立由该家族中恶意应用程序组成的5个特征集,从而形成各个恶意家族的分类模型;

在形成设定量的恶意家族模型之后,使用投票算法计算每一层的可信度,经过设定数量的训练之后,得出每一层的可信度权重;

步骤二,恶意代码检测和恶意家族分类的测试,过程如下:

首先对待测Android应用程序进行分层提取,分别得到xml文件、smali代码、smali代码指令集、java代码、java代码指令集这5个方面的集合,然后进行恶意代码检测,若检测出其为非恶意应用程序,得出检测结果,若检测出为恶意的应用程序,从分层得到的5个方面与步骤一得到的恶意家族模型进行simhash相似性对比,同时使用步骤一得到的各层的可信度,分别对每一层的对比结果做加权投票分析,综合得出一个最终结果。

进一步,所述步骤一中,利用对Android恶意程序的逆向反编译,分别提取出其中的xml文件、smali代码集、smali代码调用方法汇总、java代码集、java函数与类集合一共5个投票器,分别使用simhash方法进行检测,每一层的结果都是一个投票,最终的判定为投票选择的结果。

再进一步,Android应用程序的逆向反编译及内容提取的过程为:自己编写python程序,实现对Android应用程序的自动化反编译和信息提取;实现从apk文件中提取xml文件,将dex文件反编译成smali代码,自动提取其中的invoke调用函数名,将smali代码再次反编译为java代码,从java代码中提取函数和类名。

所述投票算法采用投票感知器算法如下:首先对每一层的算法赋予一个可信度初始值,在训练的时候测试每一种方法的实际准确性,在每一次的训练中,对每一层的训练结果做可信度权值增加;若该次训练该层检测结果正确,则该层的可信度权值加1,反之,则将该层的可信度权值减1;在经过足够多的训练结果之后,将对各层的可信程度有设定的结果;在测试时,则只需将每一层的测试结果与该层的可信度相乘,然后将5层的检测结构做投票统计,即得到最终结果。

本发明申请提出一种基于层次式simhash的Android恶意代码检测和分类方法,采用多层次对Android恶意代码的检测,对每一层的检测结果做统计,同时采用基于Voted Perceptron算法的投票算法,每一层得出的结果加上该层的可信度权值,来进行投票处理,根据投票结果来判断Android恶意代码的分类。这样不仅从多角度分析Android应用程序的代码,同时也对不同层分析的可信度做了加权处理,大大增强了结果的可信度。

本发明的有益效果主要表现在:快速有效的检测Android应用程序,并将其准确的进行分类,并能够及时给出其恶意家族的类别信息。

附图说明

图1是simhash值生成图。

图2是Voted Perceptron算法的示意图。

图3是Android恶意代码训练过程的流程图。

图4是Android恶意代码检测过程的流程图。

具体实施方式

下面结合附图对本发明作进一步描述。

参照图3和图4,一种基于层次式simhash的Android恶意代码检测和分类方法,包括以下步骤:

步骤一,恶意代码检测和恶意家族的训练集,如图3所示。过程为:对已知各个恶意家族中的恶意应用程序进行分层次提取,分别从xml文件、smali代码、smali代码指令集、java代码、java代码指令集这5个方面分析应用程序,从而对每一个应用程序建立5个特征,对每个恶意家族,建立由该家族中恶意应用程序组成的5个特征集,从而形成各个恶意家族的分类模型。在形成一定量的恶意家族模型之后,使用投票算法计算每一层的可信度,经过足够多的训练之后,得出每一层的可信度权重。

步骤二,恶意代码检测和恶意家族分类的测试,如图4所示。过程类似于第一部分:首先对待测Android应用程序进行分层提取,分别得到xml文件、smali代码、smali代码指令集、java代码、java代码指令集这5个方面的集合,然后进行恶意代码检测,若检测出其为非恶意应用程序,得出检测结果,若检测出为恶意的应用程序,从分层得到的5个方面与步骤一得到的恶意家族模型进行simhash相似性对比,同时使用步骤一得到的各层的可信度,分别对每一层的对比结果做加权投票分析,综合得出一个最终结果。

利用对Android恶意程序的逆向反编译,分别提取出其中的xml文件、smali代码集、smali代码调用方法汇总、java代码集、java函数与类集合一共5个投票器,分别使用simhash方法进行检测,每一层的结果都是一个投票,最终的判定为投票选择的结果。

改进投票算法举例如下:

假设每一层标识为V1,V2,V3,V4,V5,其各自分别的权重为W1,W2,W3,W4,W5,且权重初始值为10。

L1:在训练阶段,对每一次的训练结果做累加处理,如第一次训练结果在各层的结果为:正确、错误、正确、正确、正确,则相应的每一层的权重作如下处理:

W1=W1+1=11;

W2=W2-1=9;

W3=W3+1=11;

W4=W4+1=11;

W5=W5+1=11;

在第二次训练的结果为:正确、错误、正确、错误、正确,则各权重处理:

W1=W1+1=12;

W2=W2-1=8;

W3=W3+1=12;

W4=W4-1=10;

W5=W5+1=12;

......

假设这样进行了1001次训练过程(考虑到最后权重累加可能出现的结果不一致时可能出现的权重值对等的情况的出现,因此选用奇数次训练),得到最终各层的训练结果为:W1=525,W2=313,W3=887,W4=355,W5=749。

L2:测试阶段,对待测试的Android恶意程序进行各层分层的测试,并将各层的结果乘以权重之后相加,得出最后的结论。注意,这里的相加并不是数值上的相加,其规则为:若测试结果一致的,该结果的权重数值相加,否则不做变化。如某个Android恶意程序各层测试的结果为:S1=1,S2=3,S3=1,S4=2,S5=1,则先对该应用程序的一致的结果作权重累加处理,即结果为1的有S1,S3和S5,将其权重值相加,得到结果为1的权重为2161,另外没有相同的结果,不作其他处理。因此对结果处理后得到该应用程序结论为:结果为1的可能性为2161,结果为2的可能性为355,结果为3的可能性为313。投票取大值,得出结论:该应用程序结果为1。

Android应用程序的逆向反编译及内容提取的过程为:自己编写python程序,实现对Android应用程序的自动化反编译和信息提取。实现从apk文件中提取xml文件,将dex文件反编译成smali代码,自动提取其中的invoke调用函数名,将smali代码再次反编译为java代码,从java代码中提取函数和类名等。

采用投票感知器算法,并在其基础上做简化修改,修改后的算法如下:首先对每一层的算法赋予一个可信度初始值,在训练的时候测试每一种方法的实际准确性,在每一次的训练中,对每一层的训练结果做可信度权值增加。若该次训练该层检测结果正确,则该层的可信度权值加1,反之,则将该层的可信度权值减1。在经过足够多的训练结果之后,将对各层的可信程度有一定的结果。在测试时,则只需将每一层的测试结果与该层的可信度相乘,然后将5层的检测结构做投票统计,即可得到最终结果。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1