楼赟程, 施勇, 薛质
(上海交通大学 信息安全工程学院,上海,200240)
基于逆向工程的Android恶意行为检测方法*
楼赟程, 施勇, 薛质
(上海交通大学 信息安全工程学院,上海,200240)
由于Android系统应用市场的特性导致恶意软件传播迅速,对用户的手机乃至个人隐私造成了十分巨大的危害。本文首先介绍了Android应用的逆向技术,然后分析了恶意代码采用的多种Android代码隐藏技术及隐私获取的代码特征。针对这些情况,本文基于Android的逆向工程提出了一种静态检测和动态检测相结合的恶意行为检测方法,可以更加有效的检测代码中的恶意行为。最后通过对Android样本应用的分析表明此方法的可行性与有效性。
Android;恶意代码;代码隐藏;行为检测
近年来,智能手机一直在高速发展,普及率越来越高。一直以来,Android系统因为其开源的特性一直在安全层面上被人们所诟病,其恶意软件的数量及其恶意行为的严重性也远远超过了苹果的IOS系统。隐私窃取、恶意扣费、系统破坏、远程控制等行为已经成为恶意软件和病毒的主要破坏手段。所以如何对Android应用进行恶意行为检测室一个十分重要的工作。
2010年由William Enck等人提出的TaintDroid动态污点跟踪系统可以说是近年来实用性和扩展性都比较高的恶意行为检测系统之一[1]。无论国外和国内都有许多研究人员对其进行了扩展和修补[2-3],故Android上的动态污点跟踪系统已经十分完善了,但其本质是不变的。用动态污点跟踪的方法必须要修改操作系统原始的数据保存结构,在正常数据后添加污点数据。所以必须在Dalvik虚拟机层及framework层进行系统源码级的修改,并编译成新的Android系统img文件在某一设备上进行安装,最后才能对目标Android应用进行检测。这样的过程是十分繁琐的,且导致系统本身修改需要重新编译和安装,消耗大量的时间和精力。
国外曾有学者对1260个恶意软件进行了分析,其中有86%是重打包(Repackaging)程序[4],由此可见重打包是近几年恶意软件传播的主要途径。针对此种现象,本文提出了基于逆向工程的应用行为检测方法,这是一种针对单个目标应用程序进行的静态和动态相结合的检测方法。其实无论是静态的代码分析还是动态的行为分析都无法单独地、明确地把一个应用定性为恶意软件[5],但两者的结合可以大大增加判断的准确程度。
逆向工程是产品设计和实现的再现工程,通过逆向工程可以分析出产品的处理流程、组织结构、功能特性等等内在要素。而在软件的逆向工程领域,主要是把可执行文件或安装文件进行反编译得到类似源码的可读代码并进行分析、破解、学习。而在Android逆向工程领域,我们主要针对Android应用程序的APK文件进行拆分、反编译、代码分析、代码植入、组装、签名等工作。
2.1 APK文件结构
Android的应用程序的APK文件,其本质就是ZIP压缩文件,修改其后缀名解压后得到的文件一般情况下有[6]:
1)META-INF文件夹:其中主要存放签名信息,保证APK的完整性和安全性;
2)res文件夹:其中存放了图片之类的资源文件;
3)AndroidManifest.xml配置文件:其中写着权限(permission)声明、接收器(receiver)静态声明、服务(service)声明,活动(activity)声明等。通过阅读此XML配置文件可以快速地了解应用的总体结;
4)classes.dex文件:此文件为java源码编译后生成的dalvik字节码文件。由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。普通的java反编译工具是无法处理dex文件的,一般使用dex2jar进行处理;
5)resources.arsc:编译后的二进制资源文件。
2.2 Android逆向方法
Android逆向流程从反编译后的生成代码可分为两种方法。
方法一是把classes.dex文件反编译为java代码,使用的工具是上文提到的dex2jar,反编译成功后的代码可以通过jd-gui来进行阅读。这种方法的优点是转化后的java代码清晰易懂,但无法重新组装生成APK,只能作为一种辅助的代码阅读手段。并且这种逆向方法很容易被混淆,从而导致生成的代码十分混乱,甚至会有不可读代码存在。
方法二则是把classes.dex文件反编译为smali代码。Smali代码是一种面向对象的汇编代码,其可读性较强,修改后的smali代码还可以重新打包和签名生成新的APK文件。而在本文提出的行为检测方法也将采用此种逆向方法。反编译成smali代码常用的工具是apktool,此工具集合了解压缩、XML文件解析、smali正反编译,组装等各个功能。
3.1 Android系统安全机制
Android系统是基于Linux系统进行开发的手机操作系统,所以其安全机制很大程度依赖了Linux的特性。在Linux系统中,一个用户ID(user id)识别一个给定用户,而在Android系统中,一个用户ID识别一个应用程序。应用程序在安装时就被分配了一个用户ID,这个用户ID是保持不变的,这就是沙箱的概念[7]。通过此方法Android系统分离了应用程序间的权限和资源,从而保护了程序的独立性。
而对于单个Android应用程序,Android则采用了权限声明机制来限制应用程序。权限根据风险级别可以分为4类[8]:
表1 Android系统安全级别
3.2 Android恶意代码
Android恶意代码泛滥的主要原因正是Android权限机制所造成的。虽然用户在安装应用程序时能够完整查阅应用本身需要的所有权限,但由于如今应用程序功能多元化,所以几乎所有应用程序都会申请包括通讯录、联系人、地理位置等涉及隐私信息的权限。而用户若要使用这些应用程序,则必须选择确定。久而久之,安装应用程序时给出的权限提示形同虚设,这就给很多重打包程序有了可乘之机。
例如类似Flappy Bird这样的著名游戏,本身的运行并不需要多少权限,但许多攻击者会把它作为目标,植入恶意代码后,上传到第三方应用市场。当用户下载后,就会窃取用户敏感信息或在后台发送短信、拨打电话,从而导致用户遭受经济损失或者隐私权上的侵犯[9]。
3.3 Android代码隐藏方法
Android代码在其被反编译成smali代码后,仍旧具有相当高的可读性,所以许多恶意代码会对自身进行加密和隐藏,保护自身不被杀毒软件或者检测软件发现。Android的代码隐藏方法主要有如下几种方法:
(1)反射调用
反射(Reflection)是Java语言的特性之一,在Java中使用反射技术可以直接操作程序的内部属性,并可以更加灵活地控制程序的运行。而在Android中如果恶意代码使用反射技术动态调用其恶意方法则可以大大增加检测者静态调试的难度。
以发送短信这个功能为例,正常的Android代码如下所示:
SmsManager smsManager=SmsManager.getDefault();
smsManager.sendTextMessage("5554",null,"content",null,null);
使用反射调用后代码变为:
SmsManager smsManager=SmsManager.getDefault();
Class>clazz=Class.forName("android.telephony.Sms-Manager");
Method m1=clazz.getMethod("sendTextMessage",java.lang.String.class,java.lang.String.class,java.lang.String.class,android. app.PendingIntent.class,android.app.PendingIntent.class);
m1.invoke(smsManager,"5554",null,"content",null,null);
最重要的是对这两段代码进行逆向得到的smali代码也会完全不同,另外由于原来的方法名现在成为了method变量,原来的类名直接变成了string变量,所以这些变量甚至可以通过网络进行传递,更好的保障了代码的隐蔽性。
(2)动态加载
Android系统本身提供了DexClassLoader这一个方法来支持应用程序在运行过程中动态加载包含classes.dex文件的jar包或者apk文件,再结合Java的反射调用技术,就可以执行非应用程序部分的代码,其基本的构造函数如下:
public DexClassLoader(String dexPath,String optimizedDirectory,String libraryPath,ClassLoader parent)
有了这种方法后,恶意代码甚至可以把核心执行代码放在网络端,在需要运行的时候下载下来后,再使用动态加载的方法调用它。这同样使得恶意代码被逆向的难度增加。
(3)代码混淆
代码混淆的方法有许多种,第一种是类名处理,即把原先有意义比较规整的类名和包名用abcd等简单字母所代替,减少代码可读性和逻辑性。
第二种是字符串处理,在Android逆向分析的过程中,利用字符串锁定目标代码是一种比较常见的做法,所以许多代码为了保护自身,都会单独用Native Code写一个加密解密类,然后在Java代码中都使用加密后的字符串,避免被锁定。
第三种是代码乱序,这里的乱序是指对逆向后的代码在保证其运行正确性的前提下进行乱序,随后重新打包成正常的应用程序。这样的方法主要针对使用dex2 jar进行逆向的分析者。这样生成的应用程序如果被dex2 jar逆向所得到的java代码,其代码长度会大大增长,且逻辑性较差,甚至会产生一些逆向上的错误。
4.1 检测流程
图1 行为检测流程
检测流程如上图所示,主要流程为:
1)对被检测应用程序进行反编译,得到smali代码;
2)对smali代码进行静态分析,主要方法是针对敏感权限的特定函数进行检查,从而得到静态分析结果;
3)针对在步骤2中找到的特定函数,植入代码;
4)重打包成为新的可用APK应用程序;
5)将新生成的应用程序运行于Android操作系统上;
6)人工的或自动化的动态检测其行为是否具有恶意性,从而得到动态分析结果;
7)综合静态和动态的分析结果得到最终结果。
4.2 静态检测
在Android应用程序中,恶意行为通常与权限有较大的相关性,而权限又与关键函数有直接联系,其一般联系如下表所示[10]:
表2 Android行为权限函数对应关系
其中获取短信、获取通讯录和获取通话记录,这三种行为都是从系统数据库中获得相应的隐私信息,其代码结构十分雷同,主要区别在于query请求的URI。而获取位置信息的官方API是通过getlastknownlocation函数进行获取的,但如今第三方地图服务比较多,所以第三方地图类库的继承也需要关注。短信拦截则需要注册BroadcastReceiver,分为静态注册和动态注册两种方法。
所以对反编译后生成的smali代码,主要采用的就是模式匹配的方法,而模式匹配的对象则是函数名称。当然如果应用程序拥有这些函数,也无法说明它是恶意程序。这样的静态检测目的是为被检测程序列出可疑点,是否有恶意行为应根据在动态检测中的表现,两者相结合一起进行判断。
4.3 代码植入
在经过静态检测获取应用程序的恶意行为可疑点后,可以针对其函数进行代码植入或代码替换,这里的代码植入主要是为了帮助后续的动态分析步骤。
以发送短信函数为例,在java环境下,函数的形式和变量如下:
public void sendTextMessage(String destinationAddress,String scAddress,String text,PendingIntent sentIntent,PendingIntent deliveryIntent)
而在反编译后得到的smali语句则如下:
invoke-virtual/range{v2..v7},Landroid/telephony/Sms-Manager;->sendTextMessage(Ljava/lang/String;Ljava/lang/ String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/ app/PendingIntent;)V
我们可以对此函数进行替换,使用我们重新封装过的sendMessage函数。在新的封装函数中,我们并不需要同样发送短信,只需要保持新的函数与原函数输入、输出一致就可以保证重打包后的应用程序能够正常运行。而在函数主体中,我们可以加入log语句或者本地log文件输出,这样就可以在随后的动态检测过程中,在不运行真正的隐私获取函数的情况下,同时输出原函数调用的变量。
以上文的sendTextMessage函数为例,其中的v3变量就是目标的电话号码,v5变量就是所要发送的内容。我们在函数主体就可以把这两个变量输出来查看函数调用状况。
4.4 动态检测
动态检测则是把经过代码植入后形成的新APK文件装入运行环境(可以是虚拟机环境,可以是真实手机环境)进行运行。由于代码植入过程中植入log输出,通过这些log输出可以清晰的查看到此APK运行过程中敏感函数调用的参数究竟是什么样的,是否真的存在恶意行为。
4.5 实验样例
现针对一样本程序进行分析,可以得到如下分析结果:
图2 样本分析结果
通过静态检测得知共有4个敏感权限,其中分别对应了2个函数及一个第三方类。在程序主体调用过程中,共有1个sendT-extMessage函数,6个BDLocationListener的使用。而有关INTERNET权限的openConnection函数则存在于10个文件,共出现了19次。
使用openConnection函数进行连接后,主要通过GET方法进行网络沟通,所以我们对此方法添加log信息,输出HTTP交互中得到的信息。而BDLocationListener不是函数,其关键是找到真正的经纬度变量。在代码中我们可以找到last_longitude以及last _latitude变量,这两个string变量都在某一文件中调用并存入SharedPreferences中去。所以与这两个string相对应的键值对即为获得的经纬度。
静态分析完成后,进行代码植入和到动态分析,通过运行日志可以发现此程序的网络连接主要返回信息为商家广告推送,其中采用了经纬度作为请求变量,在某种意义上滥用了用户的位置信息。而经纬度的获取则在程序开启后就立刻进行了。最后发送短信的函数则是对号码106901605571发送了手机的IMEI码。
最后可以得到结论:此应用的权限有所超标,特别在位置信息获取及广告信息的推送上侵犯了用户的隐私。但由于没有更多的敏感权限,隐私泄漏程度一般。
本文提出了一种基于逆向工程的静态和动态相结合的Android应用程序检测方法。相对纯粹基于权限或基于代码的静态检测方法,此方法可以更系统、更具体、更准确的观察被检测程序的行为模式和完整运行流程,定位到恶意行为的准确位置,并最终给出一个比较公正的评价和判断。与传统检测方法相比,这种方法的优点在于在应用层面上进行检测,独立于dalvik虚拟机层,检测对象是应用的代码特征、应用行为以及相关行为函数传递的参数,检测环境与应用的真实运行环境一致,且静态与动态相结合,避免误报。此检测方法可以在恶意代码检测、病毒检测、应用程序防篡改检测等方面得到广泛的应用,并能给出比较详尽的分析结果。同时在后续研究中,可以在静态与动态分析的过程中扩展代码特征库或行为特征库,实现自动化的检测流程。
[1] ENCKW,GILBERT P,CHUN BG,etal.TaintDroid:An Information-Flow Tracking System for Realtime Privacy Monitoring on Smartphones[C].//the 9th USENIX Conference on Operating Systems Design and Implementation.Berkeley:USENIX Association.2010:1—6.
[2] 秦中元,徐毓青,梁彪等.一种Android平台恶意软件静态检测方法[J].东南大学学报(自然科学版),2013,(6):1162-1167.
[3] BERESOFRD A R,RICE A,SKEHIN N,et a1.MockDroid: Trading Privacy for Application Functionality on Smartphones [C]//Proc.of the 12th Workshop on Mobile Computing Systems and Applications.Phoenix,USA,2011.
[4] ZHOU YAJIN,JIANG XUXIAN.Dissecting Android Malware: Characterization and Evolution[C]//2012 IEEE Symposium on Security and Privacy.2012:95-109.
[5] JACOBG,DEBAR H,FILIOL E.Behavioral detection ofmalware:from a survey towards an established taxonomy[J]. Journal in computer Virology,2008,4(3):251-266.
[6] 贾菲,刘威.基于Android平台恶意代码逆向分析技术的研究[J].信息网络安全,2012(4):61-63,84.
[7] 杨广亮,龚晓锐,姚刚等.一个面向Android的隐私泄露检测系统[J].计算机工程,2012,38(23):1-6.
[8] MICHAELGRACE,WU ZHOU,XUXIAN JIANG and AHMAD-REZE SADEGHI:Unsafe Exposure Analysis of Mobile In-App Advertisements[C]//the 5th ACM Conference on Security and Privacy in W ireless and Mobile Networks.2012.
[9] 冯博,戴航,慕德俊等.Android恶意软件检测方法研究[J].计算机技术与发展,2014(2):149-152.
[10] Android.Manifest.permission[EB/OL].http://developer.android.com/reference/android/Manifest.permission.html.
Android M alicious Behavior Detection based on Reverse Engineering
LOU Yun-cheng,SHIYong,XUE Zhi
(School of Information Security,Shanghai Jiao Tong University,Shanghai200240,China)
The characteristics of application market for Android system would usually lead to the rapid spread of themalwares,thus cause tremendous harm to the user′smobile phone and personal privacy.Firstly,the reverse technology of Android application is described,and then the code-behind technology used by Android malwares and the code characteristics of privacy access are analyzed. In light of this,amalicious behavior detectionmethod based on the reverse engineering of Android and in combination with static detection and dynamic detection is proposed,and thismethod could detectmalicious behaviormore effectively.Finally,the analysis of Android sample application indicates the feasiblility and effectiveness of thismethod.
Android;malicious code;code-behind;behavior detection
TN929
A
1009-8054(2015)04-0083-05
楼赟程(1989—),男,硕士,主要研究方向为Android手机安全;
2014-11-19
中国信息安全测评中心科研项目资助(No.CNITSECKY-2013-009/2)
施 勇(1979—),男,博士,讲师,主要研究方向为网络与信息安全;
薛 质(1971—),男,博士,教授,主要研究方向为网络与信息安全。■