一、前言
Android作为开源框架,开放之余,所要面临的就是安全问题,世间之事,有正就有邪,有攻就有守,作为开发者虽然不需要进入专业安全领域,但还是需要掌握基本的安全常识和原理。
二、加壳
加壳最初用于windows平台可执行程序,后被Andriod平台采用用于apk加固,可阻止对apk的反编译反调试等。
基本原理就是在程序中植入一段代码,在运行的时候取得控制权进行额外程序操作,跟病毒执行原理类似。
App的加固技术可分为:dex加密和so加密,其中dex加密更为重要,因为dex可反编译为java可读代码。
三、DEX文件
apk解压后可以从目录中看到classes.dex文件,它是运行在daivilk虚拟机上的Android可执行文件,包含应用程序的全部操作指令以及运行时数据。java程序编译成class后,使用dx工具将所有class文件整合到dex文件中,使各个类可以共享数据,文件结构更加紧凑且减少冗余,是传统jar文件大小的50%左右。
Dex文件整体结构图:
从宏观上来说 dex 的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成,如图:
其中Header 的存储内容,如图:
这里主要关注3个字段:checksum、signature和fileSize。
checksum:校验码字段,占4bytes,主要用来检查从该字段(不包含checksum字段,也就是从12bytes开始算起)开始到文件末尾,这段数据是否完整,也就是完整性校验。它使用alder32算法校验。
signature:SHA-1签名字段,占20bytes,作用跟checksum一样,也是做完整性校验。之所以有两个完整性校验字段,是由于先使用checksum字段校验可以先快速检查出错的dex文件,然后才使用第二个计算量更大的校验码进行计算检查。
fileSize:文件长度字段,占4bytes,保存classes.dex文件总长度。
当加密后的程序写入Dex,需要修改checksum和signature确保两次文件检查通过,以及修改dex文件的大小,否则Dalvik虚拟机加载会报错。另外,脱壳的时候,需要拿到apk的大小,将源apk的大小追加到壳dex的末尾就可以了。
四、加固原理
加固apk运行流程:
Dex文件整体加固原理:
在该过程中涉及到三个对象,分别如下:
源程序:加固的对象,主要修改原apk文件中的classes.dex和AndroidManifest.xml文件。
壳程序:用于解密dex(加密)文件,并加载解密后的原dex文件,然后正常启动原程序。
加密程序:对原dex文件进行加密,加密算法可选:异或操作、反转、rc4、des、rsa等。
加固过程可分4个阶段:
(1) 加密dex文件
(2)合成新的dex文件
(3)修改原apk文件打包
(4)运行壳程序加载原dex文件
4.1 加密dex文件
加密阶段主要是讲把原apk文件中提取出来的classes.dex文件通过加密程序进行加密。加密的时候如果使用des对称加密或者非对称加密算法,则需要注意处理好密钥保存的问题。
4.2 合成新的dex文件
合成阶段主要是将上一步生成的加密的dex文件追加在壳dex文件后面,两个dex进行合并,然后在文件末尾追加加密dex文件的大小数值。
壳程序里面ProxyApplication(继承自Application)类,是应用程序最先运行的类,在原程序运行之前,可以在在这个类里面进行解密dex文件和加载原dex文件的操作。
4.3 修改原apk文件打包
1.解压apk,准备修改2个文件:classes.dex和AndroidManifest.xml。
2.将classes.dex替换为上一步加密合成的classes.dex。
3.修改AndroidManifest.xml文件,指定application为ProxyApplication。
4.打包签名。
4.4运行壳程序加载原dex文件
执行步骤:
Dalvik虚拟机加载新classes.dex文件->运行ProxyApplication类->执行attachBaseContext方法->执行onCreate方法。
attachBaseContext方法任务:
1.获取加密dex文件的位置:len(新classes.dex文件) – len(加密dex文件大小:classes.dex文件末尾记录),读取加密的dex文件,将其解密并保存到资源目录下。
2.使用自定义的DexClassLoader加载解密后的原dex文件。
onCreate方法任务:
1.通过反射修改ActivityThread类,将Application指向原dex文件中的Application。
2.创建原Application对象,调用原Application的onCreate方法启动原程序。
文章来源:https://www.toymoban.com/news/detail-725893.html
欢迎关注微信公众号:android-tech文章来源地址https://www.toymoban.com/news/detail-725893.html
到了这里,关于Android APK加固原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!