APK加固技术破解方法研究
2023-09-25斯进杨雪裴洪卿岑嘉俊
斯进 杨雪 裴洪卿 岑嘉俊
摘 要: 为解决智能手机应用程序加固后无法获得代码运行逻辑及敏感数据的问题,研究了加壳、代码加密、结构加固、资源混淆等APK常见加固技术的基本原理。通过脱壳查看核心功能代码、修复魔数头、根据ZIP文件结构去除垃圾内容、破解加密算法等方法,对APK进行加固破解。该方法基于大量APK实例总结提炼而来,具有一定的普适性,可为取证人员开展涉案APK分析取证提供支持。
关键词: 手机应用程序; 逆向分析; APK加固技术; App加固破解
中图分类号:TP399 文献标识码:A 文章编号:1006-8228(2023)09-29-03
Research on cracking methods of APK reinforcement technology
Si Jin1, Yang Xue1, Pei Hongqin2, Chen Jiajun2
(1. Zhejiang Police College, Hangzhou, Zhejiang 310053, China; 2. Hangzhou Pinghang Technology Co., Ltd)
Abstract: To solve the problem that the code running logic and sensitive data cannot be obtained after the smart phone application is reinforced, the basic principles of common APK reinforcement techniques such as shelling, code encryption, structure reinforcement and resource obfuscation are studied. The reinforced APK is cracked by some methods such as shelling to view the core function code, repairing the magic number header, removing the garbage content according to the ZIP file structure, and cracking the encryption algorithm. These methods are based on the summary and extraction of a large number of APK cases, and have a certain degree of universality, which can provide support for forensics personnel to conduct APK analysis and evidence collection.
Key words: mobile application; reverse analysis; APK reinforcement technology; App cracking technology
0 引言
隨着智能手机在我国的普及,人们的上网方式也随之发生改变。《第50次中国互联网络发展状况统计报告》显示,截至2022年6月,我国网民规模为10.51亿,其中手机网民规模为10.47亿,占全体网民的99.6%[1]。手机用户的高速增长促进了移动支付技术广泛应用,各类智能手机应用程序(以下简称APP)APP迅速覆盖了人们日常出行、购物娱乐、金融理财等各个领域,其中安卓系统的应用程序占有较高比例,为确保手机端应用程序安全,开发者使用加壳、代码加密、资源混淆等加固技术,来保护安卓应用程序的安装包(AndroidPackage,简称APK),这种方法在解决手机应用安全问题的同时,也给APK取证分析带来了困扰。本文对APK常见加固技术进行分析研究,提出基于静态分析的破解方法,为公安机关开展APK分析取证提供思路和方法。
1 常见APK加固技术
通常情况下,为应对目前移动应用市场领域的破解、反编译、盗版等现象,企业在开发手机应用时会对APK加固以实现代码加密。APK加固的目的是保护APK代码逻辑,其原理是将APK文件进行隐藏、混淆、加密等操作,使反编译无法获取APK内的项目源码和资源。加固后的APK最明显特征是反编译后无法直观地查看APK中的Java代码,部分APK无法通过正常解包或反编译得到资源文件,甚至AndroidManifest.xml文件中的特征也被隐藏起来。
常见APK应用加固方法主要有整体型加固、函数抽取加固和虚拟机源码保护三类。具体特点如表1所示。
随着APK开发流程的逐步细化,开发者主要通过从市场上购买加壳服务来实现对APK的加固,因此常使用的方式是整体型加固。整体加固需要源程序、加密工具和解壳程序三要素共同参与实现对原APK的dex文件进行加密,启动应用时对dex解密,通过DexClassLoader进行加载,具体流程如图1所示[2]。
源程序:需要被加壳保护的Android应用程序的代码,可以是Android应用的apk也可以是Android应用的dex文件和so库文件。
加密工具:对源程序进行加密的工具,即对Android应用的APK或者Android应用的dex文件和so库文件进行加密的工具,为解壳程序提供源程序的解壳数据,语言和平台不限,加密处理方式根据加壳的需求来处理。
壳dex文件:实现解密解壳数据并通过DexClassLoader动态加载和运行源程序的代码,实现Android解壳程序与Android源程序的无缝替换,Android源程序APK得到执行[3]。
2 实例分析
如上文所述,整体加固实现对APK的加密、混淆、加壳处理,因此,破解工作并非一蹴而就,市场上主流软件也难以实现自动化处理[4]。本文将结合实例逐一演示加固技术破解方法。
2.1 加壳处理
要解决APK加壳问题,首先需要了解加壳的原理和類型,以便能够正确识别APK的壳。APK加壳就是通过在二进制的程序中植入一段代码,使其在运行时优先取得程序的控制权,以达到完成一些额外功能的目的。APK被加壳时,会将源dex文件进行加密拼接写入壳dex文件中,同时记录位置以方便壳知道从哪里开始加载源dex文件内容。这意味着新的dex文件内容由壳dex文件和加密后的源dex文件组成。
⑴ 基于Xposed类工具的安卓端脱壳方法[5]
该方法原理是针对加载已解密dex内容的com.Android.dex.Dex类对象内容进行提取,进而得到源dex文件。脱壳时,需要准备一个具有root权限的安卓设备,或者使用具有root权限的安卓模拟器安装Xposed框架和脱壳工具进行APK脱壳,并且需要通过adb命令导出脱壳后的源dex文件。
⑵ 利用Frida工具暴力提取 dex文件
该方法原理是先使用具有root权限的安卓设备(手机/模拟器)安装运行加固APK,再将加载到安卓设备内存中的源dex文件提取到计算机本地。dex文件具有一定结构特征,如文件头为“dex 035”,对应hex值为6465780A303335,在APP运行时,通过手工操作可以把内存中的dex文件“dump”到取证工作站。图2展示dex文件头的结构。
2.2 AndroidManifest.xml文件混淆修复
APK常采用文件头结构修改、文件编码修改等复合混淆方式,对AndroidManifest.xml文件进行混淆,导致文件内容无法查看。
⑴ 文件头结构修改
分析AndroidManifest.xml文件的结构发现,其文件头标识被修改成“0x0000”,此外,可以发现16位和32位处有异常的“F”位,被修改的三个地方分别对应AndroidManifest.xml文件的魔数头、字符总数和样式符偏移,如图3所示。AndroidManifest.xml正常的文件头标识为“0x0300”,因此,修复被篡改文件头方法非常简单,只需将前两位“0x0000”改回“0x0300”即可正常反编译。
修复AndroidManifest.xml的文件头后文件格式恢复正常,但文件内容仍有大量乱码。在以往的APK逆向分析中,我们发现针对Androidmanifest.xml的正文混淆通常会采用“Android”标签替换成任意字符串的方式,只需要在自研解析工具中根据“Android”标签的偏移找到该字符串并将其强制替换回“Android”即可修复,但在最近研究发现,开发者还会在Androidmanifest.xml中插入大量无用标签来干扰分析,因此还需要按照一定规则把垃圾标签和内容剔除。
⑵ 混淆文件编码修改
通过本文方法对AndroidManifest.xml文件修复后,可以成功反编译一部分内容,但显示的内容可能是中文乱码,导致数组索引出现问题而报错,这是因为该AndroidManifest.xml文件使用UTF-16宽字节编码,导致反编译工具不兼容,需要在解析过程中针对宽字节识别和判断后,进行单字节处理,最后实现对混淆文件的编码修改。
2.3 APK资源代码加密破解
对大量的加密样本研究发现,在APK内部进行加解密需自动化实现,因此加密常采用对称加密算法。对称加密是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,单钥加密的安全性依赖于加密算法的强度和密钥的秘密性。虽然加密类型较为单一,但在不同APK加密对象不尽相同。有的针对APK资源文件加密,有的对APK与服务器通讯地址的代码加密,也有的对APK文件进行整体加密。本文介绍以下常见加密类型的破解方法。
⑴ APK资源加密破解
常见APK大都是通过APP打包公司将搭建好的网站前端进行封装而成的WebAPP。WebAPP是一种框架型APP开发形式(H5AP框架开发形式),具有跨平台的优点,该框架由“HTML5云网站+APP应用客户端”构成。APP应用客户端只安装应用的外观部分,而数据则是在每次运行APP时加载网站数据,呈现给手机用户。这类APK大多可以通过分析资源文件,直接获取通讯地址、打包公司惟一ID号等。下文为一个WebAPP的JSON文件内容。
为了防止攻击者获取资源文件,打包公司会对资源文件进行加密,一些主流的打包公司,如APIcloud和“第八区打包”等,使用RC4对称加密算法进行加密。APIcloud会通过特定方法从so文件中提取密钥,而第八区则是通过特定的函数对密钥进行拆分和拼接。对使用第八区进行资源文件加密的APK进行反编译,可搜索到资源加密的算法。代码中的加密类定义了多个拆散的原始字符串值,加密算法主要通过对这些字符串值进行base64加密和拼接处理,最后生成RC4加密的密钥。
需要说明的是,个别打包公司在打包APP时会选择对APK资源文件进行加密。由于市面上有不少“山寨”公司通过使用大公司的打包ID和代码实现打包。不同打包公司的资源文件加解密方法会有差异,在做加密破解时间还需要具体分析APK的加密算法程序脚本。
⑵ APK代码加密破解
APK代码加密,一般指对代码中重要信息进行加密,如APK通讯地址、APK中的关键值、数据库密码等重要信息。APK代码加密通常也使用对称加密算法。
通过分析实现代码得到加密的密钥和参数,可得到APK真正的通讯地址。此外,对通讯内容进行加密的APK往往会伴随安全环境的检测,直接使用动态抓包也可以截取其真正的通讯目标地址。图4展示了通过指定参数、密钥和向量,解密AES密文得到通信目标地址的方式。
3 结束语
本文系统地分析了常用的APK加固技术特点和流程,并总结了整体加固流程实现的加壳、混淆、加密防护措施的手动破解思路和方法。该方法基于大量APK实例总结提炼而来,经实践证明具有较强普适性,可为取证人员开展涉案APK分析取证提供指导。但我们也发现,APK的破解方法也会随着加固技术的不断演进而变化,接下来我们还将在取证实践中不断归纳和总结新的破解方法和思路,并将其集成于相应的取证工具,为涉案APP的取证分析提供一体化解决方案。
参考文献(References):
[1] 中国互联网信息中心.第50次中国互联网络发展状况统计报告[R].北京:中国互联网信息中心,2022-08-31.
[2] 斜杠青年工作室.apk加固是什么意思(浅谈安卓apk加固原理和实现)[EB/OL].http://www.webzuan.cn/szk/7566.html,2022-01-09.
[3] 用友开发中心.APK加固原理和步骤是什么?[EB/OL].https://www.apicloud.com/blogDetails/8553,2022-06-29.
[4] 孟彩霞,林俊豪,张骁.面向非法第四方支付平台的取证分析技术研究[J].警察技术,2022(4):41-45.
[5] 李佳斌,裴洪卿,郑雄,等.第三方SDK暗刷流量的取证分析与应用[J].警察技术,2022(3):57-60.