Android恶意代码的逆向分析
2016-09-21李天辉王艳青
李天辉,王艳青
(沈阳师范大学软件学院,辽宁沈阳110036)
Android恶意代码的逆向分析
李天辉,王艳青
(沈阳师范大学软件学院,辽宁沈阳110036)
本文主要研究基于逆向工程的Android应用程序中恶意代码的分析方法。首先,通过逆向工程得到Android应用程序的Java源代码和资源文件,然后根据源代码分析程序的功能、结构;根据manifest资源文件分析程序组件的各种权限,再结合恶意代码的行为特征判断是否存在恶意代码及其危害。也可以据此方法研究Android系统受攻击的原因及防御办法并进一步发现恶意代码的特征。
逆向工程;android;恶意代码;APK
0 引言
移动互联网发展越来越快,Android手机应用程序也越来越丰富。但由于Android系统的开放性,应用程序分发越来越容易,为恶意软件提供了良好的传播环境,这样就导致了Android系统安全问题日益突出。手机吸费、木马和病毒等恶意软件的迅速滋生及利用Android恶意软件进行网络犯罪活动的日益增多,Android手机用户正面临前所未有的安全风险。2010年,Android恶意软件的定义刚出现在Dr.Web病毒数据库中,但截止2014年底,Dr.Web病毒数据库中的有关Android恶意软件总定义数量达到5 681个,增加了2 867种新成员,包括各种不必要的、恶意的、以及含有潜在风险的应用程序。这一数字比2013年增长了102%,比2010年增长了189倍(或18,837%)。这些数据表明恶意软件的检测与防范工作面临了严峻的挑战。
目前,对基于Android系统的恶意软件的分析方法还在处于探索阶段。很多针对恶意软件的分析技术,一般只关注结果,缺乏对攻击方法、攻击过程、恶意软件类型特征等更详细信息的分析与取证。为解决此类问题,本文主要研究Android恶意代码的逆向分析方法。此方法基于对Android应用程序进行逆向工程,然后再分析Android应用程序的设计结构、功能及各种组件的访问权限等,再对比程序原来的基本功能与恶意代码的行为特征,进一步判断出是否有恶意代码存在及其危害。
1 Android系统简介
Android是由Google公司研发的基于Linux平台的移动设备操作系统,它由Linux内核层、系统库与运行环境层、应用框架层、应用层4个层次组成的操作系统。
1.1 Linux内核层(Kernel)
Linux内核是硬件和软件之间的抽象层,主要包括核心和驱动两部分,核心包括内存管理、进程管理、网络协议栈、安全性和驱动模型等。驱动包含显示驱动(DisplayDriver)、音频驱动(AudioDrive-r)、无线局域网驱动(WifiDriver)等。
由于内核层的进程往往以较高的权限运行,所以在系统安全方面,一旦出现漏洞[1]可能导致高级权限泄露。内核层的研究集中于将SELinux引入内核层以增强系统的安全性能[2]。
1.2 系统库(Libraries)与运行环境(Runtime)
系统库是Android程序运行所需的一些C/C++库。运行环境包含一个核心库,提供了Java编程语言核心库的大多数功能。每个应用程序都在它自己的进程中运行,都各自拥有一个独立的Dalvik虚拟机实例,如图1所示。Dalvik是基于寄存器的Java虚拟机,而不是基于栈的虚拟机,并且还优化了内存资源的使用及同时支持多个虚拟机的特点。
图1 Dalvik虚拟机实例
1.3 应用程序框架(ApplicationFramework)
此部分为Android应用程序提供系统的API,在框架安全性限制的前提下,开发者可以任意访问核心应用程序所使用的API框架,重新调用各种组件和服务,包括应用程序开发所需要的界面管理、数据访问、应用包的管理、应用层的消息传递、定位管理、电话管理以及Google Talk服务等功能。
应用程序框架层和系统库层的安全威胁同样来自于自身的漏洞,但由于Android系统的权限机制、签名机制和沙盒机制[3]的良好设计,实现了鉴别开发者、限制应用程序行为和保障应用程序独立运行的功能,所以暴漏出的安全漏洞较少。
1.4 应用程序(Application)
Android最上层提供了移动互联设备所需要的各种应用程序,如SMS短消息程序、Email客户端、日历、浏览器、联系人管理、地图程序等。
Android程序是用Java语言进行开发的,传统的Java程序运行是通过JVM虚拟机将源文件编译成Java字节码运行。在Android程序编码完成后,首先将Java源代码转换为字节码,再用DX工具将字节码文件转换成.dex格式的文件,最后.dex格式的文件在Dalvik虚拟机上运行。Dalvik虚拟机要依赖Linux内核一些功能才能运行,例如:线程机制、底层内存管理机制等操作系统管理机制。
2 Android应用程序的逆向工程原理
2.1 APK结构分析与逆向工程
APK即Android程序包文件,是Android系统应用程序默认安装文件格式。APK英文全称为“application package file”。任何一个Android程序想要在Android设备上运行,首先要进行编译,然后再被打包成APK文件。APK文件基于zip文件格式,与jar文件的构造方式相似,可通过应用程序项目文件在 Eclipse开发环境中的目录进行结构分析。
逆向工程也称为反向工程(Reverse Engineering)[4],其含义是根据存在的结果来分析推导出具体的原因。对一个已经发布的应用程序,可以通过逆向工程得到其源代码,然后根据项目文件及源代码分析其程序结构和设计方案。当然也能用逆向分析方法来分析程序中否存在安全隐患及恶意代码[5]。不过,也有部分必有用心的开发者用逆向分析的方法在源程序中故意添加一些恶意代码。
APK是将Java源程序编译后的.class文件打包成.jar文件后再打包成classes.dex的文件包,dex格式文件可以直接在Android系统中的Dalvik虚拟机上运行。这是一个逐步优化的编译过程。Dex格式文件的指令码属于Dalvik虚拟机专有的指令集,专门为移动操作系统优化过,与标准Java的.class文件相比,它体积小,运行效率高。最后被打包成.apk文件进行发布。明晰了Android应用程序的封装过程,再把APK文件反向解析出Java源程序就是Android应用程序的逆向工程。
2.2 Android应用程序逆向工程的方法与步骤
Android 应用程序逆向工程需用到 Winrar、dex2jar、JD-GUI、apktool等工具,过程分4步。工程流程图如图2所示,下面分别进行详细说明。
图2 Android逆向工程流程图
1)用解压工具解压缩APK文件
可以直接把APK文件的扩展名修改成.zip,然后解压,获取classes.dex文件,这个就是打包后的class文件。
2)使用dex2jar将classes.dex反编译为jar文件
将classes.dex文件复制到dex2jar路径下,使用 Windows的命令提示符切换到dex2jar所在目录,执行命令如下:
dex2jar.batclasses.dex
命令执行后会生成classes.dex.dex2jar.jar文件。
3)使用JD-GUI查看反编译后的jar文件
JD-GUI界面是Windows窗口模式,直接选择路径打开classes.dex.dex2jar.jar文件即可查看原Java源代码。
4)获取资源文件、xml配置文件等
由于Android应用程序的图片等资源文件都做了二进制压缩,直接解压的xml文件以及图片文件都是乱码。所以需要用到apktool工具获取原来的资源文件。apktool工具有三个文件,并放在同一个目录下,分别为apktool.jar、apktool.bat、aapt.exe。然后把要反编译的APK文件复制到apktool目录下,然后打开命令提示符,输入命令即可自动进行反编译。命令如下:
apktool d MusicPlayer.apk MusicPlayer
apktool是命令,d是反编译,MusicPlayer.apk和 MusicPlayer分别为要反编译的文件名和反编译后资源文件存放的文件夹名,前者要和实际文件名一致,后者可任意命名。
在得到的资源文件夹中,其中res文件是资源文件,xml文件是对应的xml配置文件[6]。
3 恶意代码的分析方法
对Android应用程序逆向工程后,就可以得到应用项目的Java源代码及xml配置等文件,然后再对这些文件进行分析。逆向工程后得到的程序源代码行数以万计,盲目分析效率很低,需要找到程序的关键点进行分析。对Android应用程序恶意代码的分析主要有2个方法。下面以常见的恶意代码特征[7]进行分析和说明。
3.1 分析程序信息、结构,函数等
1)Android系统中的恶意代码通常会偷偷地发送付费短信,来实现恶意扣费的目的,如下java代码可以实现此功能。
如果在逆向工程中发现有类似代码并且原应用程序并没有此项功能,则说明此段代码极可能是恶意代码。
2)启动后台服务
恶意代码通常能偷偷地在系统后台启动一些Service组件程序来实现其非法操作,要启动Service通常先继承BroadcastReceiver类,再通过startActivity()函数实现自启动。Broadcast Receiver组件可以接收一种或多种Intent组件作为触发事件,当一个BroadcastReceiver组件被触发后,系统就会通知相应程序来启动Service组件。由于Service具有静默运行的特点,用户很难发现,恶意代码一般以android.content.Context.startServiee()函数来启动后台Service组件。
如果在逆向工程中发现有类似后台启动的服务代码,且与原应用程序功能不符,则很可能为恶意代码。
3)插入浏览器书签
在android系统浏览器中插入浏览器书签也是恶意代码惯用的推广手法,下面的java代码就可以实现在浏览器中插入书签。
如果在逆向工程中发现有类似代码,则说明该程序至少有恶意推广的意图。
3.2 分析配置文件的权限列表
Androidmanifest.xml文件记录着应用程序的一些基本信息,包括应用程序的包名、系统发行版本及各种组件的注册权限等。根据对APK文件中的androidmanifest.xml的权限列表进行分析,例如注册的Receiver列表及Service列表,如果该列表中的权限与原应用程序基本功能不符,极有可能是恶意代码。分析配置文件权限时,还要对
前面提到恶意代码自启动功能要想实现,Receiver许可必须要完成配置,这样才能允许接收系统启动消息。该功能在AndroidManifest.xml中以如下代码来实现。
书签如果要成功实现,AndroidManifest.xml中也必须进行权限注册,有关xml代码示例如下。
实现任意恶意代码的行为都需要配置权限许可,而Androidmenifest.xml是android应用程序配置权限许可的必用的文件,所以对Android程序逆向工程后首先对配置文件进行检测也是一个可提高效率的办法。
4 结语
Android恶意代码的逆向分析方法是基于对Android系统的应用程序进行逆向工程,即反向编译APK程序包,获取项目配置文件Anroidmanifest.xml和应用程序的Java源程序,然后再去分析程序的代码结构、功能及各组件的运行权限等。据此研究恶意代码的各种特征行为及系统受攻击的原因和防御方法。
[1]CokerR.Porting nsa security enhanced linux to hand-held devices[C]//proc of Linux Symp.Ottawa:Linux Symp Inc.2003:117-127.
[2]Shabtai A,Fledel Y,Elovici Y.Securing Andorid powerred mobile devices using SELinux[J].Security & Privacy,2010,8(3):36-44.
[3]GoogleInc.Andorid security[EB/OL].[2013-06-26].https://source.android.com/tech/security/.
[4]Schmidt A-D,Bye R,Schmidt H-G,et al.Static analysis of executables for collaborative malware detection on Android[C] //2009 IEEE International Conference onCommunications.Dresden,Germany,2009:1-5.
[5]贾菲,刘威.基于Android平台恶意代码逆向分析技术的研究[J].技术研究,2012(04):61-63.
[6]关立勋.Android应用开发深入学习实录[M].北京:电子工业出版社,2013.
[7]李俊.Android系统源代码分析[M].北京:中国铁道出版社,2015.
ReverseAnalysis of Android's Malicious Code
LI Tian-hui1,WANG Yan-qing2
(College of Software,Shenyang Normal University,Liaoning Shenyang 110036,China)
Analysis method of malicious code in Android application based on reverse engineering is principally studied.Firstly,java source code and resource files of Android application are acquired via reverse engineering.And then in accordance with the function and structure of java source code,and with the manifest resource file,various competences of program components are analyzed.Finally,in combination with the behavior of malicious code,whether exist the malicious code and its harm is determined.This method could also be applied to studying the being-attacked cause and defense of Android system and further finding the characteristics of malicious code.
Android; reverse engineering; malicious code; APK
TP393 [文献标志码]A [文章编号]1009-8054(2016)04-0095-04
2015-07-17
李天辉(1976—),男,硕士,讲师,主要研究方向为计算机网络,信息安全;
王艳青(1961—),男,硕士,副教授,主要研究方向为信息安全,计算机网络。