基于Dalvik 虚拟机的Android Application 脱壳技术
2017-04-22王李松方勇
王李松,方勇
(四川大学电子信息学院,成都 610065)
基于Dalvik 虚拟机的Android Application 脱壳技术
王李松,方勇
(四川大学电子信息学院,成都 610065)
随着移动应用的飞速发展,移动端频频爆发的恶意代码日益严重地困扰着每一个用户的隐私和财产安全。同时大量的恶意程序采用加壳保护,躲避杀毒引擎的扫描。无论是分析木马病毒,还是寻找正常程序的漏洞,首先都要从加壳的程序中得到原始的可执行文件。基于对Android平台加固技术以及Dalvik虚拟机的机制进行研究,提出并实现一种通用的脱壳方案DexUnpack。
Dalvik;Android;加壳;脱壳
0 引言
目前Android已经成为最流行的移动操作系统,巨大的市场占有率带来了极大的利润,大量的攻击者也将目光投到了Android平台。阿里移动安全2016年第二季度的报告显示,该季度感染恶意代码的Android设备总量高达2877万,比上一季度增长96.2%。与此同时,原本用来防止应用程序被逆向分析、破解修改、重打包的加壳技术也被恶意程序利用。攻击者利用加壳技术隐藏木马病毒程序的真正代码来躲避安全软件杀毒引擎的扫描与移动安全研究人员的分析。Android平台常用的加壳技术主要包括:虚拟机检测,代码动态加载,代码动态修改,反调试。无论是安全人员分析应用还是各种杀毒引擎扫描查杀恶意程序,首先都必须获得原始的可执行文件(Dex)。
由于脱壳技术对于Android应用安全的重要作用,百度移动安全的研究人员提出并实现了基于Xp osed框架的脱壳工具ZjDroid,安全研究员瘦蛟舞基于Cydia Substrate框架实现了Dex Memory Dump Tools。其中的基本思想就是Android应用运行的内存空间中存在完整的Dex文件,直接将对应区域的内存读出即可。但是由于加壳技术的发展,当加壳过后的程序检测到在上述脱壳环境中运行时,可以通过直接退出,大量形成虚假的Dex内存空间,Dex动态修改等对抗手段让其失效,使得我们要么不能得到Dex,要么得到错误或不完整的Dex。基于对Android应用的加壳技术以及Dalvik虚拟机中可执行文件的加载过程的深入分析,通过修改Android系统源码,编译自定义的系统实现了一种通用的脱壳方案DexUnpack。
1 Android 平台的加壳技术
1.1 环境检测
为了防止应用程序在危险环境运行被分析破解,加壳程序都具有运行环境检查功能,一旦检测到自己的运行环境不是安全环境,就会触发本身的安全机制,不会进行真实Dex文件的加载。常用的检测技术包括检查Android模拟器以及脱壳环境检测。Android模拟器检测可以通过检查设备的IMEI,DeviceID,PhoneNumber,Fingerprints,Props,特征文件(/dev/socket/qemud,/dev/qemu_pipe)等。脱壳环境检测包括Root检测,Xposed框架检测,Cydia Substrate框架检测等。
1.2 代码动态加载
Dalvik虚拟机允许程序在运行时动态加载代码执行。加壳的应用程序往往会将原始的可执行文件进行加密保存,在运行时对加密的代码进行解密,将解密后的内容直接通过匿名内存映射的方式直接映射到一块匿名的内存空间然后使用libdvm.so中的相关函数进行Dex文件的内存加载。这样整个文件系统中就不会出现Dex文件,大大增强了隐蔽性与安全性。
1.3 代码动态修改
当可执行代码被Dalvik虚拟机加载进内存后可以通过JNI接口调用native code更改可执行代码,当该代码需要真正运行时再将其修改还原。这样即使在内存中也不存在完整的可执行代码,这就从一定程度上增加了逆向分析的难度。让传统的基于内存搜索和内存Dump的方法都失效。
1.4 反动态调试
动态调试技术是分析应用程序的重要手段,加壳程序为了阻止自身被动态分析,采用的手段通常有:限制调试器连接,Android使用android:debuggable标签标识应用程序是否可调试,通过将android:debuggable设置为false便可限制调试器连接;抢占ptrace,抢占ptrace的概念继承至Linux系统的ptrace系统调用,ptrace系统调用为开发者提供一种使用一个进程监视、控制另一个进程的执行或检查、改变另一个进程内存和寄存器的方法,ptrace经常被用来实现反调试功能,因为一个进程只能被ptrace一次,如果应用程序使用ptrace进行自我监控和跟踪,就可以阻止动态调试;检查/proc/pid目录下的文件,Linux系统将进程在内核中的进程信息通过内存映射的方式映射到/proc/pid目录中的文件中,当程序被调试时,相关信息会发生变化,例如status文件中的TracerPid就会从0变为调试该进程的进程pid,通过检测TracerPid是否为0就可检测程序是否正在被动态调试。
2 DexUnpack 实现原理
2.1 DexUnpack实现的基本思想
Android应用程序的可执行文件即Dex文件在运行时由Dalvik虚拟机加载并执行,它的文件格式如图一所示。只要我们能够正确地重建此文件结构,就能得到脱壳后的Dex文件。为了重建该文件结构,我们必须得到每一个Class的全部信息。因为每个Class在使用前都必须被Dalvik虚拟机正确加载,所以只要我们深入到Dalvik虚拟机对Dex文件处理加载Class的过程中,修改Dalvik虚拟机的处理过程即可得到Class的全部信息。
图1 Dex文件结构
2.2 Dex文件处理
对Dex文件进行处理的过程如图2所示:
图2 Dex文件处理流程
(1)对Dex文件验证和优化,验证的目的是对Dex文件中的类数据进行安全性合法性检验,为虚拟机的安全稳定运行提供保证;优化的目的则是根据当前设备平台增加辅助信息,使得Dex文件更加高效的被执行。
(2)对Dex文件进行解析,其目标就是通过在内存中创建专用的数据结构描述该文件,为随后实际加载某一指定类做好数据准备。
(3)对指定类进行实际加载,其功能是实时根据Dalvik虚拟机执行需要从已被解析的Dex文件中提取二进制Dalvik字节码并将其封装进运行时数据结构,以供解释器解释执行。该运行时数据结构实际上是一个ClassObject结构体对象,也称为类对象,该数据结构用于封装程序类的所有运行时数据信息。当虚拟机执行一个类方法时,解释器将引用并执行类对象中封装的方法操作码,进而达到完成程序要求的执行目标。因此,ClassObject对象在程序运行过程中承担着不可替代的重要作用。
ClassObject加载机制的根本任务是根据程序运行需要在已被虚拟机解析的Dex文件中查找并加载指定类。类加载机制最终会输出一个ClassObject数据结构的实例对象。Dalvik虚拟机主要通过调用类加载机制的本地方法接口函数Dalvik_dalvik_System_DexFile_ defineClass对运行时所需的类进行定义,完成对类的加载工作。当类加载完成我们就得到了重建是需要的全部Class信息。
3 DexUnpack 的设计与实现
通过对Dalvik虚拟机源码的分析,我们知道了ClassObject的完整的加载过程。通过对Dalvik虚拟机的源码进行修改,增加反模拟器检测的内核模块,实现了DexUnpack。
3.1 DexUnpack的框架结构
DexUnpack主要由一个自定义的Android系统完成主要功能,如图3所示。当加壳APP应用在我们的工具上运行,通过反模拟器检测模块,Dex文件内存重建模块,脱壳应用重建模块的作用,我们将得到一个脱壳后的应用。后续的安全人员安全分析和杀毒软件的扫描即可在真正的可执行程序上进行。
3.2 反模拟器检测
因为加壳代码一开始就会检测运行环境,如果发现自身运行在模拟器上就会触发本身的安全机制,不会进行Dex文件的加载。根据加壳代码进行模拟器检测的方法,通过自定义的模块进行对抗。DexUnpack中实现反模拟器检测的方法有以下两种:
图3 Dexunpack处理加壳应用
(1)隐藏系统API返回的模拟器特征值:系统提供一些API获得Android设备的电话号码,IMEI,MAC地址等,在模拟器上这些值都是预定义不变的,通过这些特征很容易判断运行环境为模拟器。通过加载自定义的HOOK模块,更改这些返回值即可隐藏真实的运行环境。一部分更改值如表1所示。
表1
(2)隐藏关键文件:/dev/socket/qemud和/dev/qemu_ pipe文件是模拟器中的关键驱动文件,隐藏这些文件可以隐藏真实的运行环境。隐藏方式同意通过修改File.exits(),当发现有应用在检测这些路径时直接返回为空,代表这些文件并不存在。
3.3 Dex文件内存重建
通过上面对于ClassObject对象的加载我们获得了ClassData的原型数据,但是前面提到加壳程序的动态修改技术使得当前ClassData的原型数据并不是正确的。对于每一个新加载的类,它的初始化函数
当我们得到了正确的ClassData的原型数据,下面需要按照结构体DexClassData重建ClassData。结构体DexClassData的结构如下:
当遍历重建完全部的ClassData,Dex文件中最关键的各个Class的数据我们就重建完成了。下面只需要按照DexFile数据结构和ClassObject数据结构的对应关系重建Dex文件。重建过程如图4所示:
图4 数据结构对应关系
4 实验结果
4.1 加壳厂商识别
加壳厂商在给应用加壳时会引入明显的特征,通过加固后的应用的文件信息我们可以容易的判断加壳的厂商。
娜迦:libchaosvmp.so,libddog.solibfdog.so
爱加密:libexec.so,libexecmain.so
梆梆:libsecexe.so,libsecmain.so,libDexHelper.so
360 :libprotectClass.so,libjiagu.so
通付盾:libegis.so
网秦:libnqshield.so
百度:libbaiduprotect.so
4.2 实验数据
根据上文提出的方法实现DexUnpack并进行测试。为了测试DexUnpack的通用性与有效性我们选取不同厂商加壳的应用进行测试。测试的结果如下:
表2
从上面的实验结果可以得出,本方案在对抗虚拟机检测和脱壳成功率方面具有较好的效果,所以通过修改系统源码实现自动化脱壳分析是十分可行的方案。
[1]Patrick Schulz.Code Protection in Android(2012)
[2]Chen,K.,Liu,P.,Zhang,Y.:Achieving Accuracy and Scalability Simultaneously in Detecting Application Clones on Android Markets. In:Proceedings of the ACMICSE(2014).
[3]Strazzere,T.:Android-Unpacker(2014).https://github.com/strazzere/androidunpacker.
[4]谭艳华.Android Dalvik即时编译系统评估与优化.福建:东南大学,2015.
[5]Sabanal,P.:State of the art:Exploring the New Android Kitkat Runtime(2014).
[6]Qian,C.,Luo,X.,Yu,L.,Gu,G.:Vulhunter:Towards Discovering Vulnerabilities in Android Applications.IEEE Micro 35(1),44-53 (2015)
[7]Doha,Qatar.DroidNative:Real-Time Detection of Android Native Code Malware(2015)
[8]Yueqian Zhang,Xiapu Luo,Haoyang Yin.DexHunter:Toward Extracting Hidden Code from Packed Android Applications(2015).
[9]Gartner Inc.:Debunking Six Myths of App Wrapping(2015).http://gtnr.it/1aGJizc.
[10]ZjDroid.https://github.com/halfkiss/ZjDroid.
[11]吴艳霞,张国印.Dalvik虚拟机各模块机制分析[D].北京:清华大学出版社,2014.
Code Extraction Technology of Packed Android Application Based on Dalvik Virtual Machine
WANG Li-song,FANG Yong
(College of Electronic Information,Sichuan University,Chengdu610065)
With the rapid development of mobile applications,the mobile device of the frequent outbreak of malicious code increasingly plaguing every user's privacy and property security.At the same time a large number of malicious programs use packed protection,avoid antivirus engine scan.Whether the analysis malicious program,or to find the normal program of the loopholes,first of all from the packed program to get the original executable file.Based on the research on the packed technology of Android platform and the mechanism of Dalvik virtual machine,puts forward and realizes a general de-wrapping program DexUnpack.
Dalvik;Android;Packed;Unpacked
1007-1423(2017)07-0045-05
10.3969/j.issn.1007-1423.2017.07.012
王李松(1991-),男,湖北松滋人,硕士,研究方向为Android安全
2016-12-22
2017-02-20
方勇,博士,教授,研究方向为信息安全、网络信息对抗