中国科技论文在线
http://www.paper.edu.cn
基于 smali 的 Android 静态检测方法
胡鸽,徐国爱**
(北京邮电大学计算机学院,北京 100876)
摘要:随着移动互联网的发展,移动应用软件的安全问题也日渐突出。本文对当前 Android
静态分析技术进行了概述,对 Android 应用软件反编译获取的中间语言 smali 进行语法研究,
根据 smali 语法树的相关结构进行信息提取,获取数据流、控制流及函数依赖图等信息,与
维护的规则库进行检测,最终设计并实现了一个基于中间语言 smali 的移动应用软件静态行
为检测系统。通过大量样本实验证明,基于中间语言 smali 的静态行为检测系统对比基于源
代码的静态检测系统效率有极大的提高,并且有漏报率有一定程度的降低。。
关键词:smali;静态检测;敏感行为;Android
中图分类号:TP309
Static analysis for Android based on smali
HU Ge, XU Guoai
(Computer School, Beijing University of Posts and Telecommunications,Beijing 100876)
Abstract: With the development of mobile Internet, mobile software security problem has been more
serious. In this paper, we provide an overview of the current Android static analysis methods ,and study
the Android application software acquired decompiled smali, according to the related information
extraction of smali grammar tree, access to the data flow, control flow and function dependency graph
and other information, compare to the rule database.Finally design and implement a static behavior
detection system of mobile applications based on smali . Proved by large number of samples, the
efficient of this detection system has greatly improved contrast to detection system based on source
code, and there is a certain degree of false negative rate decreases.
Key words: smali;static analysis; sensitive behavior;Android
0 引言
伴随着移动互联网的飞速发展,移动应用软件已经渗透到社会的各行各业中并在人们生
活中起的作用也越来越重要,同时移动应用软件相关的安全问题也随之而来。在移动应用终
端上,以 Android 作为系统的终端占了大部分市场份额,而由于 Android 系统的开发性问题,
恶意软件比率一直都居高不下并呈现增长趋势。根据 CNCERT 发布的《2014 年中国互联网
网络安全报告》[1],移动互联网恶意程序主要针对 Android 平台,共有 949772 个,占 99.8%
以上,表明 Android 平台上的恶意软件问题较之其他平台更加严重。
对于 Android 平台下的软件进行分析,筛选出含有敏感行为的软件是非常迫切的问题。
传统静态行为检测一般是将移动应用软件反编译到 Java 源代码进行进一步的分析,然而反
编译得到的源代码不是完全符合 Java 原生代码的语法结构,且在反编译过程中也会不可避
免的丢失部分信息,因此针对源代码进行的静态检测系统的语法结构只能自己设定。根据自
行设定的语法规则进行后续分析时,从源代码到语法树中间耗费大量的时间和空间,且信息
丢失情况较严重,造成检测效率低下且检测结果与实际情况有较大偏差。
smali[2]语言实际是 Davlik 的寄存器语言,这种语言在语法上完整的实现了 dex 可执行
作者简介:胡鸽(1991-),女,硕士研究生,主要研究方法为移动应用软件静态分析
通信联系人:徐国爱(1972-),男,副教授,主要研究方法为软件安全. E-mail: xga@bupt.edu.cn
- 1 -
5
10
15
20
25
30
35
40
中国科技论文在线
http://www.paper.edu.cn
文件的所有功能,包括程序代码、注释等大量信息。与传统的反编译到源代码所使用的工具
比如 dex2jar 相比,转换为 smali 语言效率更高。因此对 smali 语言进行分析,可以解决基于
源代码的静态检测系统检测效率低下且有信息丢失造成检测结果与实际程序有偏差的问题。
综上所述,本文设计并实现了一个基于中间语言 smali 的静态行为检测系统,用于发现
Android 检测样本中存在的敏感行为。
本文的组织结构如下:第二章介绍了相关工作。第三章介绍了 smali 语法树分析等基础
理论。第四章详细介绍了基于中间语言 smali 的静态行为检测系统的设计与实现。第五章进
行了实验结果分析。第六章进行了总结与展望。
1 相关工作
静态分析[3]针对程序样本,在不经过实际程序执行的情况下,对样本的特征、行为或是
缺陷进行分析,静态分析的对象一般是程序源代码,也可以是目标码(如汇编代码或 smali
字节码等)。
恶意代码静态检测方法分为基于特征的检测技术和基于行为的检测技术两大类[4]。基于
特征代码的检测技术是通过检测文件是否拥有已知恶意软件的特征代码(如,一段特殊代码
或字符串)来判断其是否为恶意软件。基于敏感行为的检测技术依靠监视程序的行为,与已
知的恶意行为模式进行匹配,来判断目标文件是否具备恶意趋向。移动应用软件静态分析中
经常使用的工具有 smali、apktool[5]等。
静态检测技术方面,国内外都已经做了大量的研究。在基于特征代码的检测技术方面,
卢文清[6]等人将 Android 恶意软件的危险 API 列表。危险系统调用表及权限列表综合起来作
为特征进行 Android 恶意软件检测。吴俊昌[7]等人将 Android 移动应用使用的权限作为特征,
进而设计了一种基于权限特征的静态检测方法。R Johnson[8]等人虽然在分析中使用了 smali
语言,然而他们的分析重点是权限分析,并没有涉及到 smali 语法信息提取等内容。基于特
征的检测技术无法对未知病毒和已知病毒的变体进行检测,且由于特征分析是由恶意代码库
45
50
55
60
中的特征码进行区分的,若出现一个未知恶意样本即此样本并未被分析,其特征码没有被提
取出来,基于特征扫描的检测系统就无法识别该病毒,从而造成漏报。
65
在基于行为的检测技术方面,秦中元[9]提出了一种基于危险权限和行为的静态检测方
法。首先通过检测是否申请危险权限进行预判,然后进行污点传播和语义分析,以检测出
APK 中是否存在隐私窃取和恶意扣费行为。David Wagner[10]等人将系统调用作为切入点,
他们通过分析系统调用序列,来检测由于软件安全缺陷造成的安全隐患。路程[11]等人选择
将 Android 平台下移动应用软件反编译到源代码,对获取的源代码进行建模、控制流、数据
流分析,最后与安全模型进行匹配,从而发现恶意代码。这种检测系统虽然在一定程度上可
以对未知恶意代码进行检测但是效率低下且漏报率较高。
实际上基于行为的静态检测系统针对的检查对象是模型而非程序本身,程序在向模型转
化的过程中的偏差可能导致最终的检查结果与实际程序中存在的错误出现偏差,传统检测方
法中将移动应用软件反编译得到的源代码,因为其无法匹配 Java 的语法模型以及丢失的信
息,在转换为模型的过程中与程序本身存在较大的偏差,从而造成最后的检查结果也会存在
偏差。与反编译到源代码不同,smali 作为中间语言最大限度的保留了应用程序中的信息,
且 smali 本身有严格的语法规则,即其在建模过程中没有信息丢失,在最后的检查结果与实
际情况误差较小,因此本系统选择将中间语言 smali 作为分析语言,针对 smali 语法树进行
信息提取和安全分析,在提高准确率、降低漏报率的前提下将检测效率大大提高。
70
75
80
- 2 -
中国科技论文在线
http://www.paper.edu.cn
基于以上分析,本文的主要研究内容是中间语言 smali 的文件格式及语法树结构,进而
对 smali 语法树中的信息进行提取,进行安全分析,最后设计并实现了一种基于中间语言
smali 的静态行为检测系统。
2 smali 语法树
85
对 smali 进行静态分析,需要将信息从 smali 语法树中抽取出来。所以我们需要对 smali
语法树进行分析,通过 smali 语法树的相关结构信息,从其中抽取必要分析信息。smali 语
法树的基本树状结构如下图所示。
图 1 smali 语法树图
Fig. 1 smali grammar tree
根据语法树的结构,下面对各节点的含义进行说明。首先是针对根节点 I_CLASS_DEF
的子节点进行信息描述。根节点的子节点主要是确定当前 smali 文件的相关信息,包括 sma
li 文件类名、属性、接口等信息。
表 1 smali 文件根节点的子节点描述
Tab. 1 the description of child node of root node
90
95
节点名称
节点描述
smali 文件名
类属性,包括 public/interface 等值
父类名称
外部接口
Java 名称
当前 smali 文件下存在的 methods
当前 smali 文件下存在的所有的 field
name
I_ACCESS_LIST
I_SUPER
I_IMPLEMENTS
I_SOURCE
I_METHODS
I_FIELDS
其次是本课题分析重点 I_METHOD 及下属子节点的信息描述。I_METHOD 下属子节点
主要描述了当前 method 的名称、参数及返回值类型、方法使用的寄存器个数及参数寄存器
等信息。通过这些信息可以确定一个 method 的信息和位置。
100
表 2 I_METHOD 节点的子节点描述
Tab. 2 the description of child node of I_METHOD node
节点名称
method name
I_METHOD_PROTOTYPE
I_ACCESS_LIST
I_REGISTERS
I_ORDERED_METHOD_ITEMS
节点描述
method 名称
method 的参数及返回值类型
method 属性
method 使用的寄存器个数
method 下具体语句
- 3 -
中国科技论文在线
http://www.paper.edu.cn
I_CATCHES
I_PARAMETERS
I_ANNOTATIONS
I_LOCALS
然后是对于节点 I_ORDERED_METHOD_ITEMS 及子节点的分析。此节点的子节点涉
try/catch 语句
参数寄存器
当前 smali 文件下存在的所有的 annotations
当前 method 位置
及当控制流及数据流的变化。
表 3 I_ORDERED_METHOD_ITEMS 节点的子节点描述
Tab. 3 the description of child node of I_ORDERED_METHOD_ITEMS node
节点名称
I_STATEMENT_FORMAT
I_LINE
I_LOCAL
I_PROLOGUE
最后是对节点 I_STATEMENT_FORMAT 的子节点分析,I_STATEMENT_FORMAT 的
子节点中不同的指令对应不同的寄存器数据变化和函数依赖变化。I_STATEMENT_FORMA
T 子节点描述如表 4 所示。
节点描述
指令执行语句
行号
当前位置
序言注释
表 4 I_ORDERED_METHOD_ITEMS 节点的子节点描述
Tab. 4 the description of child node of I_STATEMENT_FORMAT node
节点描述
执行的指令名称
使用的寄存器
参数及返回值类型
执行语句中的其他信息
节点名称
statement
I_REGISTER_
I_METHOD_PROTOTYPE
else
表 4 中的 statement 根据不同的指令名称,对于后面的寄存器等有不同的影响,即对数
据流变化有影响;若 statement 为跳转指令,则对于控制流变化有影响;若 statement 为调用
函数指令,则对控制流、数据流有影响的基础上,可以生成函数依赖图,进而可以进行流追
踪。
3 基于 smali 的行为分析检测系统
本系统主要包括流分析和安全分析模块,其中流分析模块包括控制流、数据流以及函数
依赖图的提取,安全分析模块包括特征库的建立与维护、行为分析等。图 2 即基于中间语言
smali 的行为分析检测系统流程图。
105
110
115
图 2 基于 smali 的行为分析检测系统流程图
Fig. 2 flow chart of behavior detection system based on smali
120
3.1 流分析
首先利用 apktool 将待检测移动应用软件反编译为 smali 文件,apktool 的中间模块中 ba
- 4 -
中国科技论文在线
http://www.paper.edu.cn
ksmali 部分会将 smali 文件生成为 smali 语法树,依据此语法树相关结构,进行信息抽取,
获取控制流和数据流变化数据,与维护的规则库进行检测,进行控制流与数据流分析,获取
敏感行为出现的地点与参数等信息。
125
抽象语法树是通过分析 smali 文件的语法、词法,将 smali 文件按照语法结构等生成为
树状结构,根据 smali 本身的语法树结构体系,可以将语句之间的跳转关系,寄存器间的数
据变化等信息抽取出来形成新的控制流图、数据流图,以及根据 smali 中 invoke 指令的相关
信息获取函数依赖图,根据上述三种图,可以进行流追踪。
130
首先是获取控制流图。不同的语句对控制流的影响不同,相关语句的控制流图如表 5
所示。源代码中所有的循环语句如 for、while 等在 smali 语句中都会转化为 if 指令。
表 5 控制流指令表
Tab. 5 instruction list of control flow
指令
if
goto
switch
顺序语句
控制流变化
两个出口,一个为真,一个为假。
一个出口,有跳转行为。
多出口跳转指令。
没有跳转或分支,顺序执行。
135
140
145
150
已经获取了不同语句对应不同的控制流图流向,根据执行语句的指令可以获取当前方法
内的各语句间的跳转关系,即可以获取方法内的整体控制流图,可以进一步的获取控制依赖。
其实是获取函数依赖图。控制流分析中另一个重要的图是函数依赖图,即确定当前移动
应用软件中的函数调用关系的图。该图的求解涉及到 smali 语言中一类执行指令即 invoke 指
令。此类指令表明当前语句中涉及到函数调用关系。invoke 指令的格式为 invoke v meth@B
BBB,根据其格式可以确定当前被调用函数的命名空间、类名及返回类型,这些信息可以唯
一确定一个被调用的函数,作为此被调用函数的父函数可能作为另一个函数的子调用函数,
将这些信息收集即可成为函数依赖图,从此图可以获取函数调用关系,即实现了函数间关联
性的获取,为后续的数据流分析及安全分析等奠定了基础。
最后是对数据流进行获取分析。根据第二章的分析,因为内存等的限制,本系统并不是
将数据流进行全保存,而是在进行分析时,将与命中 API 有关的数据进行分析,这些数据
的变化实际是寄存器的变化,因此数据流分析即是寄存器数据变化。
3.2 安全分析
安全分析中首先有规则库的建立与维护问题。本文中所设计系统使用的规则库是以中国
互联网协会反网络病毒联盟在 2012 年发布的《移动互联网恶意代码描述规范》[12]为标准,
对移动恶意软件的行为属性、判定标准和命名格式进行了规范,将移动恶意软件按照行为属
性分为八大类,包括恶意扣费类、信息窃取类、远程控制类、恶意传播类、资费消耗类、系
统破坏类、诱骗欺诈类及流氓行为类。根据标准将与相关敏感行为实现有关的 API 及参数
信息等整理成为规则库,方便进行后续的安全分析。本系统的规则库分为三类,一类为敏感
行为 API,二类为参数信息,三类为用户行为规则。
155
安全规则采用递归的方式定义,规则中的元素与中间结构中节点及其属性是一一对应
的。规则集根据前文可以知道有三部分,一部分是定义需要检测的 Android 系统提供的敏感
行为 API,一部分是参数检测器,另一部分是用户行为分析器。规则中的每个元素都是对查
- 5 -
中国科技论文在线
询条件的一个约束。
http://www.paper.edu.cn
通过图 3 可以知道安全分析流程。通过与预先定义的引起敏感行为的 API 调用进行比
对,判断程序中是否含有敏感行为。对于已经命中了敏感 API,进行参数检测等计算约束结
果,发现确实是一个可能造成用户损失的恶意行为,但是这种行为若是用户自己发起或用户
已知的则不是敏感行为,最后生成结果。
160
图 3 安全分析流程图
Fig. 3 flow chart of safety analysis
165
4 实验分析
本文主要从实验效率和分析结果两个方面对本系统进行评估。为了评估本系统的实验效
率,本文选取了 300 个样本进行检测,其中包含有 50 个恶意应用软件,对比使用源代码检
测系统和基于中间语言 smali 检测系统的检测时间及最终检测的敏感行为如表 6 所示。从表
6 可以得知基于中间语言 smali 的静态检测平台对比基于源代码的静态检测平台检测效率有
大幅度的提高,并且检测出的敏感行为数量也有增加,表明之前因为信息缺失而无法检测出
的敏感行为在基于中间语言 smali 的静态检测系统中可以被成功检测出,即在检测效率和准
确率上,本系统设计的移动应用软件静态检测系统有显著提高。
170
- 6 -
中国科技论文在线
http://www.paper.edu.cn
表 6 平台对比实验结果
Tab. 6 comparison result of different platform
175
检测平台
基于源代码的检测系统
基于 smali 中间语言的检测系统
平均时间
6.67min
1.16min
检测出的敏感行为
9328
10271
通过本文所提的基于中间语言 smali 的静态行为检测系统进行分析,所有 300 个样本中
204 个样本触发了 10271 次敏感行为规则,204 个样本中正常样本 154 个存在敏感行为,50
个恶意样本全部都存在敏感行为。
180
样本类型与所触发的行为数如表 7 所示,从中可以发现恶意样本的平均触发规则数远高
于正常样本的平均触发规则数,表明本文的移动应用软件静态检测系统对于恶意应用软件的
命中可信度较高。
表 7 平台对比实验结果
Tab. 7 the triggering rule number of two kinds
触发敏感行为规则数
平均触发规则数
5917
4354
23.668
87.08
样本类型
正常样本
恶意样本
5 结论
本文提出了一种基于中间语言 smali 的静态行为分析方法,通过对应用程序反编译获取
的中间语言 smali 进行语法树构建,进而进行流分析和安全分析,获取当前应用程序中存在
的敏感行为。通过系统的实验,验证了本方法在效率上有极大的提高,并且漏报率有下降。
在下一步工作中,可以对安全规则进行扩充,可以检测更多的敏感行为,增大检测范围。
[参考文献] (References)
-
A
tool
apk
年
for
Android's
dex
联
网
安
全
报
JesusFreke.
中
国
互
CNCERT.2014
smali/baksmali:
android-apktool
assembler/disassembler
[1]
告
[OL].2014.http://www.cert.org.cn/publish/main/46/2015/20150602085719088775378/2015060208571908877537
8_.html
[2]
An
format[OL].[2011].http://code.google.com/p/smali/
[3] Schmidt, A.-D, Bye, R, Schmidt, H.-G, et al. Static Analysis of Executables for Collaborative Malware
Detection on Android[J]. Communications icc.ieee International Conference on, 2009:1 - 5.
[4] Yin, Heng, Song, Dawn, Egele, Manuel, et al. Panorama: Capturing system-wide information flow for malware
detection and analysis[J].Acm Conference on Computer & Communications Security,2007:116-127.
[5]
for
files[OL].[2011].https://code.google.com/p/android-apktool/
[6] 卢文清, 何加铭, 曾兴斌,等. 基于混合特征的 Android 恶意软件静态检测[J]. 无线电通信技术, 2014,
40(06):64-68.
[7] 吴俊昌, 骆培杰, 程绍银, 等. 基于权限分类的 Android 应用程序的静态分析[A]. 第四届信息安全漏洞
分析与风险评估大会[C]. 北京: 出版者不详, 2011: 41-48.
[8] Johnson R, Wang Z, Gagnon C, et al. Analysis of android applications' permissions[J].Software Security and
Reliability Companion (SERE-C), 2012 IEEE Sixth International Conference on. IEEE, 2012: 45-46.
[9] 秦中元, 徐毓青, 梁彪,等. 一种 Android 平台恶意软件静态检测方法[J]. 东南大学学报:自然科学版,
2013, (06):1162-1167.
[10] Wagner D, Dean D. Intrusion detection via static analysis[J]. IEEE Symposium on Security & Privacy,
2001:0156.
[11] 路程, 张淼, 徐国爱. 基于源代码静态分析技术的 Android 应用恶意行为检测模型[D].北京:北京邮电
大学,2011.
[12] 中华人民共和国工业和信息化部, YD/T 2439-2012. 移动互联网恶意程序描述格式[S]北京:出版社不详,
engineering
Android
reverse
185
190
195
200
205
210
- 7 -
中国科技论文在线
http://www.paper.edu.cn
215
2012.
- 8 -