一种基于余弦算法的手机病毒检测方法
2020-04-13王怡然
◆苏 晖 王怡然
(华能贵诚信托有限公司电子商务部 北京 100093)
随着全球化和信息化的发展,移动互联网的发展进入了高速行驶的快车道,同时,移动互联网病毒也加快蔓延。2018 年,CNCERT 通过移动互联网恶意程序监测体系共监测移动互联网恶意程序5702861 个,比2017 年同期监测3162981 个恶意程序增长1.8 倍,涉及移动恶意程序702 个,继续呈现出爆炸式增长趋势。
现在对手机病毒的分析及检测主要采用基于特征的检测方法,它通过对已知特征匹配来判断是否存在手机病毒。现在,基于行为的检测方法也被引入手机病毒检测,它通过对手机程序执行监视,对文件、内存、进程等变化进行判断来完成检测,如J2ME 沙箱、Android 沙箱等[1-9]。但是,无论是基于特征还是基于行为的检测方法都无法难以对多态[10-11]和变形技术[12-13]处理后的手机病毒进行有效的检测。因为多态和变形技术处理后的手机病毒,可以通过逃避已知检测点或者加入混淆信息欺骗检测工具的方法来防止其被检测。由于没有对手机操作系统底层进行研究,检测不到操作系统底层的工作状态,如内存的变化,仅仅是监视了应用层APP 的数据改动及API 调用[14],因此无法对多态和变形技术处理后的手机病毒进行判断,从而对其也无法进行检测。
本文提出了一种基于余弦算法的二进制程序手机病毒检测方法,该方法对二进制程序行为进行分析,监视手机操作系统底层,跟踪内存及APP 存储空间的变化情况,揭示手机病毒程序的工作机制,通过余弦相似度比较对其进行检测,从而有效地解决了对多态和变形技术处理后的二进制程序手机病毒无法进行检查的问题。
1 形式化方法
为了进行手机病毒的二进制程序分析,本文定义了一种用于安全性分析的中间语言 EDIL(Exploit Detection for Intermediate Language),针对手机病毒检测,对BIL 中间语言[15]进行优化和扩展。BIL 是一种二进制程序分析的语言,能对数据流和控制流进行正确描述。
1.1 语言语法
EDIL 语法由程序状态语句列表(∑),当前内存状态(μ),当前变量值(φ),程序计数器(η)以及程序当前状态(σ)组成。参数的语法叙述见表1。
其中,∑、μ和φ都是起到了映射作用。如φ[x←10]表示将变量x进行更新,将它赋值为数值v=10。
表1 EDIL 基本语法描述
1.2 形式化表达式
EDIL 有完整的形式化方法,它的每一个程序状态语句都符合以下的形式化表达式:
表达式(1)表示在程序状态语句s由当前状态改变到下一终止状态s’的时候,其他规则都在分数线上的computation发生了变化。例如,在成功发生条件跳转时,EDIL 的形式化表达式如下:
在形式化表达式(2)中有一个简单的计算规则需要指明。表达式 ,μ φ∀ ⇓e v表示在当前状态语句下,根据μ和φ的具体范围,求出e的数值v。
2 手机病毒检测算法
2.1 算法描述
通过对二进制程序行为进行分析,利用余弦相似度比较恶意行为和正常行为之间的差异,从而检测二进制程序是否是一个恶意的手机病毒程序。基于余弦相似度的二进制程序手机病毒检测算法主要包括以下三个子算法:基本块划分算法、控制流分析算法以及行为分析算法。
2.2 基本块划分算法
基本块划分是在汇编代码的基础上进行的,基本块的过程可以分为两步:
(1)确定每个基本块的入口指令,根据上述原理,基本块入口指令只可能有三种:
· ①程序入口处的第一条指令;
· ②jmp 或者jcc 跳转目标地址处的指令;
· ③jmp 或者jcc 指令的下一条指令。
(2)根据每个基本块的入口指令,构造其所在的基本块。此时又有三种情况:
· ①由当前入口指令的开始地址直到下一个入口指令开始的地址之间的所有指令构成一个基本块;
· ②由当前入口指令的开始地址到其后第一条跳转指令的结束地址之间的所有指令构成一个基本块;
· ③由当前入口指令的开始地址到程序结尾之间的所有指令构成一个基本块。
2.3 控制流分析算法
本文利用分层法[16]对程序的控制流进行分析的过程分为三轮。
(1)第一轮先分析程序中的函数,得出起始地址和结束地址;
(2)第二轮调用基本块划分模块对每个函数内部的汇编代码进行分析,对每个基本块属性进行记录。在分析过程中关注的属性包括基本块的入口地址、出口地址和跳转目标。
(3)第三轮根据控制流图求函数的所有控制流路径,即求出从控制流根节点(函数入口基本块)到叶子节点的所有可能路径。路径皆由所经过的基本块组成。
2.4 行为分析算法
在基本块划分算法和控制流分析算法的基础上,可以通过EDIL 对手机病毒程序行为进行描述,利用余弦相似度比较算法对手机病毒程序行为进行比较,从而对其进行检测。
对程序行为的两个程序行为向量间的角度定义如下:
其中,G为基本块算法划分成的基本块。则与两个向量的夹角为:
在初始情况下,ai=1,i= 1,2,...,m。经过学习可以对余弦夹角测度进行校正。
3 手机病毒检测模型系统
3.1 模型系统描述
图1 给出了基于二进制程序行为分析的手机病毒检测模型系统,框图代表核心部件,其余表示文件格式和中间过程。该模型系统包括了3 个主要部分:APP 行为监视器、预处理器以及APP 行为检测器,现就它们的工作原理进行详细介绍。
3.2 APP 行为监视器
APP 行为监视器用于对需要进行手机病毒检测的文件进行监控,它跟踪文件在二进制程序中的执行情况。在APP 行为监视器中使用OllyDBG v1.1[17]完成反汇编工作。OllyDBG 可以解析多种PE 格式,得到其中的汇编指令、寄存器、内存以及导出函数等信息。同时,APP 行为监视器还对程序执行时特定进程的执行路径进行动态监视,所采用的方法是通过挂钩系统服务描述符表(SSDT)中的Native API。这样可以通过相关堆栈信息对程序执行路径进行回溯,并且通过监视调用Native API 情况,辅助和简化二进制程序分析,特别体现在处理函数调用以及动态代码生成时。
图1 基于二进制程序行为分析的手机病毒检测系统模型
3.3 预处理器
预处理器包括两个方面:基于基本块划分和控制流分析。预处理器的输入是汇编语言,输出是EDIL 中间语言,同时能优化汇编代码,增加检测效率。例如,一个程序入口点初始化分配堆栈的汇编代码如下:
在经过预处理器转化之后,输出的需EDIL 中间语言如下:
3.4 APP 行为检测器
APP 行为检测器的功能是确定进行检测的APP 文件是否存在手机病毒。它通过将对需要进行手机病毒检测的文件程序行为描述和正常行为描述相比较。需要指出的是在反汇编器和程序行为监视器有差异,反汇编器仅仅是通过OllyDBG 完成了相应的汇编代码生成,而并没有采集程序执行时特定进程的执行路径。原因在计算行为状态序列时并不需要回溯路径,仅仅计算出每个基本块的程序调用序列即可。
4 实验结果
为验证本文所提出的APP 分析的手机病毒检测方法的有效性,选择远程控制手机病毒和本地文件手机病毒进行实验。
4.1 远程控制手机病毒检测
远程控制手机病毒[18]检测的实验环境:操作系统为Android。为保证样本可对比性,选用10 个常用的远程控制类手机病毒,结果如表2。
表2 给出了4 种主流杀毒软件和EDIL 手机病毒检测系统模型对10 种远程控制类手机病毒样本的检测结果,√表示能够检测,×表示无法检测。从实验结果可以看出,EDIL 检测系统模型可以有效地检测出手机病毒样本,而其他4 种杀毒软件存在着检测不出样本的情况。特别是针对0007 和0009,各种测试的杀毒软件皆不能够进行检测。0007 的手机病毒方式是由于浏览器的CFunctionPointer 函数没有正确地处理文档对象,如果以特定序列附加并删除了对象,就可以触发内存破坏,导致以当前登录用户的权限执行任意代码。而杀毒软件没有监测这个函数的行为,并对此进行检测,从而根本不能判断进行此变形后的手机病毒。
表2 远程控制手机病毒检测结果
表3 中给出了实验中各个样本的空间代价占用情况及时间代价占用情况。由实验结果可以看出,行为描述文件的生成大小与原始的手机病毒文件大小无关。例如,0006 与0007 两个实验样本的原始的手机病毒文件大小都为633KB,但是行为描述文件大小分别是4,897KB 和10,687KB。由于两者的手机病毒方式不一样,导致了在进行二进制行为分析时所经历的路径不同,因此描述文件的生成大小与原始的手机病毒文件大小无必然联系。
表3 远程控制类手机病毒检测结果
手机病毒的时间代价包括预处理时间和检测时间,它与生成的行为描述文件大小成正比。行为描述文件大小越大,其预处理时间和检测时间也就消耗得越多。
4.2 本地文件手机病毒检测
本地文件手机病毒检测的实验环境:操作系统为Android。
本文选取了13 个本地文件手机病毒程序,表4 给出了4种主流杀毒软件和EDIL手机病毒检测系统模型对13 个本地文件手机病毒的检测结果。从实验结果可以看出,EDIL 检测系统模型可以有效地检测出手机病毒样本,而其他4 种杀毒软件则存在着检测不出样本的情况。4 种杀毒软件都不能够对病毒0008 进行检测。
表4 本地文件手机病毒检测结果
表5 中给出了实验中各个样本的空间代价占用情况及时间代价占用情况。由实验结果可以看出,本地文件手机病毒检测的行为描述文件的生成大小与原始的手机病毒文件大小也是不具有直接联系的,决定其大小的在于利用的何种漏洞。同时,由于APP 应用软件的类型不同,空间和时间代价都有所差别。
表5 本地文件手机病毒检测结果
5 结束语
基于余弦相似度算法的二进制程序手机病毒检测算法通过对APP 二进制程序行为进行跟踪,监视手机内存和APP 空间的变化,在中间语言层对程序行为进行形式化分析,从而对手机病毒进行检测。实验结果表明该方法可以有效地对手机病毒进行分析和检测,并且具有较小的时间复杂度和空间复杂度。