APP加壳加固

·  阅读 2803

公司项目中需要对上线APP加壳加固,防止反编译。参考资料加上一周时间整出一版,记录下。

APK架构:

 apk本质上是一个zip压缩包,直接拿解压工具就可看到其中文件结构。 AndroidManifest.xml:应用的全局配置文件 

assets文件夹:原始资源文件夹 

classed.dex:源代码编程成class后,转成jar,在压缩成dex文件,dex可以直接在android虚拟机啊上运行 

lib:引用第三方sdk的so 

META-INF文件夹:Apk签名文件 

res文件夹:资源文件 

resources.arsc:记录资源文件和资源ID的映射关系 

中间关键的是dex文件,其中有我们程序的代码逻辑,通过反编译工具(如:jd-gui)等可以看到class文件代码。所以我做的这个加壳加固是针对dex文件。 

加壳加固原理

主要是利用android ClassLoader和双亲委托机制。 ClassLoader就是用来动态加载class文件到内存当中用的。

双亲委托机制: 加载器收到加载请求,首先会把委托给父类去完成,最终传递到顶层启动类加载器。父类无法加载才会自己加载 BaseDexClass>DexClassLoader、PathClassLoader(加载外部文件,插件化热修复核心) 

1.避免重复加载,当父加载器已经加载了该类的时候,就没有必要子ClassLoader再加载一次。 

2.安全性考虑,防止核心API库被随意篡改。 

apk加壳加固的原理

1.对主程序dex文件加密,使得反编译工具无法对dex文件解析。 

2.主动暴露一个无关键代码的dex壳,在app启动的时候解密主程序加密dex,通过ClassLoaser加载到内存中。 

3.主动拉起主程序代码,后续逻辑交给主程序,壳工程功成身退。 

具体工程代码如下:

app:主程序 

app主程序中是应用逻辑,没有太大修改,修改内容在AndroidManifest.xml中

1.application name改为shell壳工程中的ShellApplication

2.添加android:extractNativeLibs="true"

因为工程中使用了so库,加固后大部分的机器会报Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]的错误,需要添加这个配置

3.添加

在配置文件中添加meta-data,把主程序自己的Application路径传进去,目的是当ShellApplication加载dex之后,找到主程序Application,将Application替换掉,如果主程序Application没有代码逻辑,可以不添加这一步。

shell:壳工程

1.ShellApplication.attachBaseContext()中将apk文件解压保存,找到所有的加密dex文件,解密后加载到内存

2.ShellApplication.onCreate()中获取配置在清单文件的主程序Application,通过反射替换掉ShellApplication。注意:不要添加super.onCreate(),因为替换之后会执行主程序Application的onCreate()方法

3.dex文件通过AES加解密,壳工程中需要解密密钥,为了防止被反编译获取密钥解密我们的主程序,我将密钥封装到so中。

shelltool:java加壳打包工具 

shelltool工具文件结构

result:加壳加固apk输出目录

source:打包壳dex文件和临时目录,shelldex是存放shell壳工程编程转换后的dex文件,这么做是出于两点考虑:1.壳工程完成之后基本不会改变,每次打包都要重新加载解压转换会占用耗时。2.壳工程编译出来aar,解压后得到的jar包,jar包转换dex需要用到android-sdk/build-tools里面的dx.bat工具,不同开发环境配置的sdk目录不一样,方便其他人能拉下代码即用。

src:打包工具代码,入口是ShellTool的main函数

main函数流程如下:

1.清空之前的生成的apk文件和临时文件。

2.根据配置找到app/build/outputs/apk目录下对应版本的apk文件,demo中没有多版本,所以配置了ALL,表示在所有文件中查找。

3.解压APK,将里面所有的dex文件AES加密,并修改名称在最后加上下划线_,这步是为了方便在解密的时候找到对应的文件。解压后文件放在source/apk/下。

4.将dex壳复制到source/apk/下。

5.将source/apk/下所有文件压缩成apk文件,然后签名,输出到result目录。

缺点

1.apk第一次启动的时候需要解压解密,需要耗时,会有一段时间白屏

2.加密后dex文件再重新压缩打包,压缩率较低,加壳打包后APK比原先大

项目demo源码:gitee.com/RainbowBear…

分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改