秒懂Android应用加固之dex加固

Android (39) 2024-02-06 10:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说秒懂Android应用加固之dex加固,希望能够帮助你!!!。

Android应用加固是一个很常见的功能,但是对其原理了解的人却不多。

下面,小亭跟您聊聊Android应用加固中的代码加固技术。

代码加固就是对dex加固,dex文件是对多个class文件的压缩。不管是加固,还是热更新、插件化、APM工具,这些技术的原理都是相同的,都是对dex的研究。所以这部分知识的了解还是很有必要的。

下面从以下三个方面对Android应用加固的dex加固技术进行说明。

一、dex文件是什么?

二、加固流程是什么?

三、如何加载加固后的dex文件?


我们先看第一个问题:

一、dex文件是什么?

apk就是一个zip包。这个zip压缩包中有以下文件:

1、dex文件:多个class文件的压缩。

2、META-INF夹:签名文件。

3、AndroidManifest.xml文件

4、lib: so库

5、resources.arsc:资源文件压缩包

6、assets:assets目录下的资源

秒懂Android应用加固之dex加固_https://bianchenghao6.com/blog_Android_第1张

class和dex文件对比图


二、加固流程是什么?

秒懂Android应用加固之dex加固_https://bianchenghao6.com/blog_Android_第2张

1、解压缩APK,将dex文件放到一个文件夹中。

2、对dex文件进行AES加密。

3、生成壳dex文件。

4、将源dex文件和壳dex文件以及解压文件夹下的其他文件一起生成新apk文件。

5、对新apk文件进行签名,生成最终apk文件。


对于上述流程,我们会产生以下问题:

1、dex文件可以随便拼凑么?

2、壳dex怎么来的?

3、如何签名?

4、如何运行新apk(如何脱壳)?


在解答以上疑问之前,让我们先来了解一个必备知识,就是apk的打包流程。

秒懂Android应用加固之dex加固_https://bianchenghao6.com/blog_Android_第3张

1、应用资源使用aapt生成R.java和resouces.arsc,AS帮我们做的。

2、Aidl文件使用aidl工具生成Java接口

3、R.java、Aidl相关Java文件和我们的java文件通过Java解析器生成class文件

4、使用dx工具将所有class文件生成dex文件

5、使用apkBuider将资源文件、dex文件等生成apk文件

6、使用签名工具对apk文件进行签名,生成最终的apk文件。


对源Dex文件进行加密:apk->unzip->过滤dex->对dex文件加密

1、通过ZipFile解压缩apk文件

2、用文件过滤器过滤出dex文件放到一个数组中

3、将每一个dex文件转成byte数组

4、将byte数组进行AES加密

5、将byte数组通过文件IO写回到原来的文件


生成壳dex文件:aar->unzip->过滤jar->用dx转成dex

1、将一个module生成的aar文件解压

2、过滤出jar文件

3、使用dx工具将jar文件转成dex文件


生成新apk文件:

使用Zip.zip将解压目录打包成apk文件。


对apk进行签名:

使用apksigner命令对apk进行签名。


三、如何加载Dex文件

秒懂Android应用加固之dex加固_https://bianchenghao6.com/blog_Android_第4张

Apk第一次启动时,解密dex文件。也就是在壳dex的Application的attachBaseContext方法中处理。

解密代码使用C++开发,生成so库,防止激活成功教程。秘钥通过网络传输过来。

使用hook修改dexElements[]。通过反射将最后的dex插入到dexElements数组中。

使用hook技术将两个application统一起来,让系统看起来只有一个application。

以上便是应用加固技术的核心原理,与热修复、插件化如出一辙。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复