吕苗苗
基于JAVA的安卓应用代码混淆技术研究
吕苗苗
江苏医药职业学院医学技术学院, 江苏 盐城 224005
随着安卓应用软件的使用量不断增加,关于安卓应用安全保护问题也越来越突出。本文在分析安卓软件攻击的基础上,提出一种基于JAVA的安卓应用代码混淆技术,旨在提高安卓应用代码的隐蔽性,进而使安卓应用得到更有效的保护。该技术包括对安卓应用代码的抽离、映射、注册以及解释执行等步骤。然后通过实验分析,以验证该技术的有效性及相关性能。结果表明:该技术有较强的有效性,能够更好地保护安卓应用,但是在性能方面,无论是APK文件包大小还是内存消耗量,都有比较明显的增加,因此在技术推广中需要考虑性能方面的影响。
JAVA; 安卓应用代码; 混淆技术
安卓是目前应用最广泛的移动终端系统,基于安卓平台的各种软件应用数不胜数,在给手机用户带来便捷体验的同时,安全问题也不断涌现,极大地威胁到人们的财产权和隐私权。安卓系统有着很强的开放性,攻击者可以随时随地获取目标的动态行为数据,探测用户的隐私[1]。由于安卓软件基本上都是通过JAVA代码构建的,采用DEX格式的编译形成可执行文件,在APK文件包中直接打包,方便用户的操作使用,但也给攻击者留下漏洞。攻击者可以逆向编译JAVA代码,将可执行文件重新修改和打包,形成恶意代码的注入,若手机用户中木马,很有可能造成财产损失[2]。据相关统计,在恶意应用中有80%以上属于修改JAVA代码重新打包型[3]。针对这种现状,本文提出一种基于JAVA的安卓应用代码混淆技术,通过抽离和映射代码,达到代码混淆的目的,以抵御恶意攻击。首先抽离安卓软件中的code_item代码,然后映射混淆抽离出的代码,形成混淆代码索引表,在SO中进行封装。最后采取JNI机制注册封装后的代码,生成特定的执行环境。安卓应用代码混淆技术可以有效实现安卓应用保护,有较大的推广价值。
在各种安卓应用软件中,通常采用JAVA语言将操作程序编译成DEX格式的可执行文件,该类型文件主要由code_item代码组成。所以基于JAVA的安卓应用代码抽离,首要步骤就是在APK文件包中的DEX文件里找出相应的code_item代码,然后将该代码抽离出来。在这一过程中需要分析code_item中的Dalvik字节码,并通过运算指令和返回指令实现代码抽离。
当安卓应用代码抽离出来之后,下一步执行映射操作,将Dalvik字节码进行映射混淆。按照DEX文件格式,通过映射使code_item代码中的insns字段能够指向Dalvik。首先按照Dalvik语法确定insns的指令操作信息,其次以操作码映射表为依据,一步步将每一个操作码重新映射为新操作码,以达到映射混淆的目的,最后将这些新操作码组成code_item代码索引表,利用C或者C++语言编译并在SO中封装该索引表。
为使映射后的Dalvik字节码能够在安卓应用Native层中被正确执行,需要通过JAVA语言注册该混淆代码。首先定义解释执行的入口类,即MethodStub类,按照JAVA下不同的返回类型,使入口方法得到不同的定义。入口参数一般是可变参数,利用JNI机制在Native层中实现解释执行的调用。基于JAVA注册混淆代码之后,原code_item代码会变更为注册后的code_item代码,因而在执行原code_item代码时,并不会在安卓运行环境中动态加载,同时经过注册的code_item代码,也不会包含原有逻辑,从而能够有效抵御恶意攻击的风险。
当code_item代码经过映射混淆之后,需要在安卓应用Native层中通过映射解释器实施映射解释执行操作,构建映射解释执行环境是关键一步。映射解释器主要按照操作码映射表以及Dalvik标准解释混淆代码,在映射解释执行环境中处于核心地位,如图1所示。未使用代码混淆技术的安卓应用会直接在ART中执行,而混淆后的安卓应用代码,则可以使用映射解释器以及JNI接口与安卓ART实施交互,而没有混淆的部分代码也可以直接在ART中执行。
通过实验测试基于JAVA的安卓应用代码混淆技术,测试用例包括算术运算、系统方法和自定义方法调用、JNI方法调用、Native方法等。整个实验由安卓应用代码混淆技术有效性验证以及相关性能测试组成。
为验证安卓应用代码混淆技术的有效性,第一步采用Jadx、Jeb等JAVA的逆向编译工具,分析抽离映射之后的混淆代码在静态下能否逆向发现原逻辑。其中使用Jadx逆向编译算术运算用例,得出的结果并不能发现原逻辑。进一步测试其它用例,整个测试结果如表1所示。
表 1静态下能否逆向发现原逻辑的测试结果
Table 1 Whether the test results of the original logic can be retrieved in static state
从实验测试结果看,所有测试用例在静态下都不能发现原逻辑,这是因为在DEX可执行文件中抽离映射code_item代码之后,形成了混淆代码,而JAVA的逆向编译工具是以DEX可执行文件为基础分析code_item代码,当代码混淆时,JAVA的逆向编译工具就无法正确发现原逻辑,这极大地提高了安卓应用的安全性。第二步采用安卓通用脱壳工具Dexhunter分析动态下能否发现混淆代码的原逻辑,其中算术运算用例的实验结果如图2所示。
图2 动态下能否逆向发现原逻辑的测试结果
从图2的测试结果可以看出,安卓通用脱壳工具获得算术运算APK文件,然后利用ART加载对内存数据进行运算,但是混淆后的代码并不会加载原始信息,因此也不能逆向发现原逻辑。其它测试用例的结果同样如此。这说明无论在静态和动态下,本技术都能很好地保护安卓应用。
本实验对安卓应用代码混淆技术的性能测试,主要从APK文件包大小测试、内存消耗测试两个方面进行,对比代码混淆技术使用前后的性能情况。第一步选取算术运算和自定义方法调用两个用例进行测试,查看APK文件包大小变化,测试结果如表2所示。根据表2测试结果,使用代码混淆技术之后,APK文件包增加20多KB,主要是因为混淆映射及解释处理所增加的代码量导致APK文件包变大。
表 2 安卓应用代码混淆技术使用前后的APK文件包大小变化情况(Byte)
第二步选取算术运算和自定义方法调用两个用例,利用adb shell命令查看安卓应用在代码混淆技术使用前后的内存消耗情况,测试结果如表3所示。从实验测试结果可以看出,当使用代码混淆技术之后,安卓应用的内存增加7000多KB,主要是因为映射解释执行时加载SO文件所消耗的内存量,还有增加保护方法所消耗的内存量。当前的智能手机内存基本在64 GB以上,因此所增加的内存消耗量并不会影响手机的正常使用。
表 3 安卓应用代码混淆技术使用前后的内存消耗量变化情况(KB)
安卓应用软件的广泛使用也导致安全问题频发,用户的隐私与财产受到严重威胁,如何保护安卓应用成为国内外的一个热门课题。Vecchiato等研究了安卓通用脱壳工具使用情况,认为以加密技术为基础对安卓应用进行加壳保护能够收到一定效果,该方案首先对DEX文件进行加密处理,使相关文件得到隐藏,然后通过壳程序封装处理后的文件。在需要使用时再次通过壳程序解密,实现DEX文件的动态加载,但是在加密解密的过程中,攻击者依然有机会利用脱壳技术得到原DEX文件[4]。Azfar等针对安卓应用DEX文件脱壳破解的问题,提出一种基于JNI机制的SO加固技术,主要使用C或C++语言在SO中封装DEX文件,利用JNI机制实现动态加载,能够起到较好的反编译阻断效果,但无法形成安卓应用的全过程保护[5]。Peisen等提出一种以LZW编码技术为基础的安卓应用混淆技术,通过该技术重新排列指令次序,以提高安卓应用指令的隐蔽性,但这种方法的编码表较多,而且每一个编码表都是独立的,这影响到加密的工作量,该技术的安全效果与编码表的加密强度息息相关[6]。总体来看,相关研究或多或少都存在一些缺陷,而本文的安卓应用代码混淆技术,则从代码方面打乱逻辑,形成安卓应用全过程保护,因此有较大的推广价值。
随着智能手机的普及以及安卓应用软件的大量开发,关于安卓应用安全保护问题在国内外引起了广泛关注。本文针对恶意攻击的路径原理,提出一种基于JAVA的安卓应用代码混淆技术,旨在提高代码的隐蔽性,防止安卓应用数据信息的原逻辑被轻易破解。首先对安卓应用代码混淆技术的步骤过程进行介绍,然后通过实验分析,验证代码混淆技术的有效性及相关性能。总体来看,该技术对安卓应用的保护效果较高,但也要考虑到性能方面的影响,尤其要注意内存消耗的影响。目前的性能影响并不大,若随着该技术的不断开发,会出现更多的保护方法,内存消耗的增加难以避免,因此在今后的研究中应加以重视。
[1] 缪小川,汪睿,许蕾,等.使用敏感路径识别方法分析安卓应用安全性[J].软件学报,2017,28(9):2248-2263
[2] Mente R, Bagadi A. Android Application Security[J]. Advances in computational sciences and technology, 2017,10(5):1207-1210
[3] Chanajitt R, Viriyasitavat W, Choo KKR.Forensic analysis and security assessment of Android m-banking apps[J]. Australian journal of forensic sciences, 2017,50(1):3-19
[4] Vecchiato D, Vieira M, Martins E.The Perils of Android Security Configuration[J].Computer, 2016,49(6):15-21
[5] Azfar A, Choo KKR, Lin L. Android mobile VoIP apps: a survey and examination of their security and privacy[J]. Electronic commerce research, 2016,16(1):73-111
[6] Yu BC, Song P, Xu XY. An android malware static detection scheme based on cloud security structure[J]. International Journal of Security and Networks, 2018,13(1):51-57
Study on Android Application Code Obfuscation Technology on Java
LV Miao-miao
224005,
With the increasing use of Android application software, the security protection of Android application is becoming more and more prominent. Based on the analysis of Android software attacks, this paper proposes a JAVA-based code obfuscation technology for Android applications, aiming at improving the concealment of Android application code and making Android applications more effectively protected. The technology includes the steps of extracting, mapping, registering and interpreting the Android application code. Then, the effectiveness and related performance of the technology are verified through experimental analysis. The results show that the technology is effective and can better protect Android applications, but in terms of performance, whether APK file package size or memory consumption, there is a significant increase, so the impact of performance needs to be considered in the promotion of technology.
JAVA; Android application code; obfuscation technology
TP309
A
1000-2324(2019)04-0671-04
2018-04-28
2018-05-30
江苏省社会科学基金项目:大数据背景下智慧校园建设的策略与实践研究(15JYC001)
吕苗苗(1983-),女,硕士,讲师,主要研究方向为计算机技术和医学信息技术. E-mail:277243949@qq.com