Android应用加固的简单实现方案

时人不识凌云木,直待凌云始道高。这篇文章主要讲述Android应用加固的简单实现方案相关的知识,希望能为你提供帮助。

个人博客
http://www.milovetingting.cn
android应用加固的简单实现方案(二) 前言上一篇文章介绍了基于dex加固方案的两种具体实现。相对于手动加固,基于gradle实现的加固方案效率有了进一步提升。但是,还是需要在壳Module中增加util相关工具类的引用,为进一步减少代码侵入性,在前面方案的基础上,进一步完善插件的功能。
实现原理为了避免在壳Module中引入脱壳相关的工具类,可以在aar生成后,利用ASM生成需要的class文件,然后修改aar中的classes.jar文件,将我们生成的class文件加入到classes.jar中。而壳Module的启动Application也需要在编译后修改attachBaseContext方法,加入脱壳代码的引用。这块都可以通过修改class中的方法来实现。而脱壳后,实质上还是运行apk中的代码,因此,apk中也需要对应修改以上两种。
具体实现可以参考源码:
使用步骤下面主要介绍插件生成后的使用:
  1. 项目根目录下的build.gradle中引入插件
buildscript {repositories { //... maven { url uri(‘E:\Repository‘) } //... } dependencies { //... classpath ‘com.wangyz.plugins:ShellPlugin:1.0.0‘ //... } }allprojects { repositories { //... maven { url uri(‘E:\Repository‘) } //... } }

  1. app模块下的build.gradle引入插件及配置插件
apply plugin: ‘com.wangyz.plugins.ShellPlugin‘//主要注意shellModuleName和shellApplication的配置 shellConfig { //壳Module的名称 shellModuleName = ‘shell‘ //壳Module中Application的全类名 shellApplication = ‘com.wangyz.shell.ShellApplication‘ keyStore = ‘E:\Code\Android\android.keystore‘ keyStorePassword = ‘android‘ keyPassword = ‘android‘ alias = ‘android‘ }

  1. 壳Module中增加继承自Application的自定义Application,如这里的ShellApplication,然后重写attachBaseContext方法
public class ShellApplication extends Application {@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); }}

  1. sync工程
  2. 在打包apk前,先执行Build-Clean Project,然后双击gradle面板的app/Tasks/build/assembleRelease,就会在项目根目录/壳Module名称-release/outputs/下生成signed.apk,这个apk就是加固过的apk.
注意事项
  1. 这里只是演示加固的思路,对于加密部分,只是用了简单的^操作,具体可以自己换成AES,RSA或者其它加密方式。
  2. 插件会用到dx,gralde的命令,因此需要配置这两个的路径
  3. 插件会用到ASM,在编译出class后修改class。经过实践,发现在生成apk后,没有修改过代码或者没有执行sync的操作后,transform的回调不会走,因此也不会执行修改class的逻辑,因此在每次生成加固apk前,需要执行clean项目的操作。
  4. 引入插件后的配置文件一定不能错,重点关注shellModuleName和shellApplication,否则会导致生成的apk无法正常使用。
源码【Android应用加固的简单实现方案】源码地址:https://github.com/milovetingting/Shell

    推荐阅读