0


Android APK加固原理

一、前言

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方法启动原程序。

欢迎关注微信公众号:android-tech

标签: android 安卓 java

本文转载自: https://blog.csdn.net/kingwjh/article/details/128814421
版权归原作者 葡萄使徒 所有, 如有侵权,请联系我们删除。

“Android APK加固原理”的评论:

还没有评论