activityGuard

Introduction: Android activity confusion
More: Author   ReportBugs   
Tags:

activityGuard 是一种针对四大组件进行混淆的解决方案,能够在打包时对 apk 和 aab 中的 Activity、Service、Application 和自定义的 view 进行名称混淆以提升应用的安全性。

目的

  • 防止逆向: Android 四大组件的类名直接暴露在 AndroidManifest.xml 和代码中,容易被反编译后根据名称了解应用逻辑。
  • 增强安全性: 混淆名称增加了攻击者定位关键组件的难度,降低被针对性攻击的风险。
  • 马甲包: 降低 aab 包查重率,避免上架 Google Play 因查重率过高,导致下架或封号问题

原理分析

Android 四大组件在打包过程中不能够 R8 被混淆,因为组件在 AndroidManifest.xml 以明文形式存在 Android 系统通过反射创建相关类来启动。所以我们需要在 R8 执行前修改 AndroidManifest.xml 和 layout 布局中的类名,并把新的名称 keep 的 R8 的混淆规则中(R8 混淆执行时是以 keep 住的类为节点,如果没引用的类会被移除掉)。最后在通过 asm 字节码修改类名,就能够实现对四大组件和自定义 view 实现混淆名称了。 activityGuard 通过自定义 Gradle 任务在打包过程中修改替换 AndroidManifest.xml 和 layout 中的类名和 class 的类名来实现对 Android 四大组件的混淆

博客 地址https://juejin.cn/post/7449723991638327296

使用方法

插件基于 Gradle8.0,并且因为基于 aapt2 生成的 aapt_rules.txt 来混淆类名,所以项目需要开启 isMinifyEnabled = true

每次混淆会在当前项目下生成对应的mapping.txt记录对应混淆类,插件默认会更加 mapping.txt 文件增量混淆名称,所以当需要不同混淆名时,可以删除 mapping.txt 文件或者自己实现对应生成规则方法(自己生成时记得确保唯一性)

buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
    dependencies {
        classpath "com.github.denglongfei:activityGuard:1.1.0"
    }
}

配置

plugins {
    id("activityGuard")
}
//以下均为非必须
//actGuard {
//    //是否开启
//    isEnable = true
//    //不需要混淆的类
//    whiteClassList = hashSetOf(
//        "com.activityGuard.confuseapp.MainActivity1",
//        "*.MainActivity2",
//    )
//    //类名混淆  com.activityGuard.a  -> a.b
//    obfuscatorClassFunction = {
//        it
//    }
//}

AAB 混淆

aab 打包混淆流程图如下 aab

Apk 混淆

apk 打包混淆流程图如下

apk

最终效果

apk image image

aab

image image

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools