zoukankan      html  css  js  c++  java
  • 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中也需要对应修改以上两处。

    基于以上思路,实现可以加固的一个简单插件。

    源码地址:https://github.com/milovetingting/Shell

    使用步骤

    1. 新建项目,再新建一个Android Library类型的Module作为壳Module,名称随意,以"shell"为例,在壳Module中新建继承自Application的类,以"ShellApplication"为例,在ShellApplication中重写attachBaseContext方法,这个方法需要调用super.attachBaseContext(base)方法:
    public class ShellApplication extends Application {
    
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
        }
    
    }
    
    1. 主Module需要依赖刚才新建的壳Module,并指定主Module的启动Application为刚才新建的ShellApplication。

    2. 项目根目录下的build.gradle中引入插件:

    buildscript {
        dependencies {
            //...
            classpath 'com.wangyz.plugins:ShellPlugin:1.0.0'
            //...
        }
    }
    
    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. 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无法正常使用。

  • 相关阅读:
    调研一类软件的发展演变—聊天软件( 1000-2000 words, in Chinese)
    C++用法的学习心得(要求包含示例,并反映出利用网络获取帮助的过程)
    软件工程学习总结
    南通大学教务管理微信公众号体验
    设计一款给爸爸妈妈用的手机
    第二次作业
    web browser 发展史
    c++用法的学习心得
    电梯调度
    一个数组既有正数也有负数,计算出它的子数组和的最大值。
  • 原文地址:https://www.cnblogs.com/milovetingting/p/12633570.html
Copyright © 2011-2022 走看看