查看原文
其他

最全Android及资源混淆方法汇总(无需加固节约成本并将APP上架Google Play成功的最佳方案)

刘一刀 哆啦安全 2022-06-09

XmlClassGuard混淆任意类

1前言


一个非常实用的插件XmlClassGuard,它可混淆Android 4大组件、自定义View等任意类,也许你会质疑这有什么用,但有过上架Google Paly的同学,估计看到标题就已迫不及待的想要了解XmlClassGuard了,简单理解,如果你的app被Google Play下架,想要重新上架,就必须手动改一堆的包名+类名,这工作量少则2-3天,多则一个礼拜,甚至更久且容易改错;然而使用XmlClassGuard的话,仅需执行一个任务,30s内就可搞定,且不出错,简单的说,XmlClassGuard就是来解放你双手,助你成功上架Google Play的。

https://github.com/liujingxing/XmlClassGuard



2XmlClassGuard 简介


• XmlClassGuard是一个可混淆Android 4大组件、自定义View等任意类的插件。


• XmlClassGuard可以看作是ProGuard的补充,跟ProGuard没有任何关系,也不会有任何冲突。


• 可快速更改manifest文件里的package属性,并同步到其他文件中。


• 可快速移动n个目录到其他目录中,并同步到其他文件中。


• XmlClassGuard最主要的功能是混淆xml文件用到的类,故取名为XmlClassGuard,与AndResGuardAabResGuard对应。

https://github.com/shwenzhang/AndResGuard

https://github.com/bytedance/AabResGuard



3有什么用?


1. 弥补ProGuard不混淆4大组件等类的问题。


2. 增加aab、apk反编译的难度。


3. 极大降低aab包查重率,避免上架Google Play因查重率过高,导致下架问题。


关于第三点,有过上架Google Play 商店的同学应该知道,如果之前的包被下架或封号,想要同套代码再次上架,那99%概率是再次封号,很大一部分原因就是上述说到的类未被混淆,很容易被Google断定为包重复,从而导致再次封号,因此,如果想要再次上架,就必须要更改四大组件、自定义View等的包名+类名以降低查重率,然而,如果手动去完成这项任务,估计会累死一个程序员,于是乎,就有了XmlClassGuard,通过插件去完成手工的活,一个任务便可搞定。


4原理


XmlClassGuard不同于AndResGuard(apk资源混淆)、AadResGuard(aab资源混淆)侵入打包流程的方案,XmlClassGuard需要在打包前执行xmlClassGuard任务,该任务会检索AndroidManifest.xml及navigation、layout文件夹下的xml,找出xml文件中引用的类,如4大组件及自定义View等,更改其包名+类名,并将更改后的内容同步到其他文件中,说直白点,就是在打包前,在本地更改包名+类名。


警告警告!!!!!! 由于是在本地操作,任务执行是不可逆的,故务必做好代码备份,否则代码将很难还原。


5上手


1、在build.gradle(root project)中配置


buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
    dependencies {
        classpath "com.github.liujingxing:XmlClassGuard:1.0.0"
    }
}

2、在 build.gradle(application) 中配置


apply plugin: "xml-class-guard"

//以下均为非必须
xmlClassGuard {
    //用于增量混淆的 mapping 文件
    mappingFile = file("xml-class-mapping.txt")
    //更改manifest文件的package属性,即包名
    packageChange = ["com.ljx.example""ab.cd"]
    //移动目录
    moveDir = ["com.ljx.example""ef.gh"]
}

此时就可以在Gradle栏中,找到以下3个任务:



6任务介绍


XmlClassGuard插件共有3个任务,分别是moveDir、packageChange及xmlClassGuard,下面将一一介绍。


6.1、moveDir


moveDir是一个移动目录的任务,它支持同时移动任意一个目录,它会将原目录下的所有文件(包括子目录)移动到另外一个文件夹下,并将移动的结果,同步到其他文件中,配置如下:


xmlClassGuard {
    //移动目录
    moveDir = ["com.ljx.example""ef.gh",
               "com.ljx.example.test""ff.gg"]
}

上面代码中moveDir是一个Map对象,其中key代表要移动的目录,value代表目标目录;上面任务会把com.ljx.example目录下的所有文件,移动到ef.gh 目录下,将com.ljx.example.test目录下的所有文件移动到ff.gg目录下。


6.2、packageChange


packageChange是一个更改manifest文件里package属性的任务,也就是更改app包名的任务(不会更改applicationId) ,改完后,会将更改结果,同步到其他文件中(不会更改项目结构),配置如下:


xmlClassGuard {
    //更改manifest文件的package属性,即包名
    packageChange = ["com.ljx.example""ab.cd"]
}

以上packageChange是一个Map对象,key为原始package属性,value为要更改的package属性,原始package属性不匹配,将更改失败。


6.3、xmlClassGuard


xmlClassGuard是一个混淆类的任务,该任务会检索AndroidManifest.xml及navigation、layout 文件夹下的xml文件,找出xml文件中引用到的类,如4大组件及自定义View等,更改其包名+类名,并将更改的结果,同步到其他文件中,最后会将混淆映射写出到mapping文件中,配置如下:


xmlClassGuard {
    //用于增量混淆的 mapping 文件
    mappingFile = file("xml-class-mapping.txt")
}


上面配置的mappingFile可以是一个不存在的文件,混淆结束后,会将混淆映射写出到该文件中,如下:


dir mapping:
    com.ljx.example -e
    com.ljx.example.activity -dh

class mapping:
    com.ljx.example.AppHolder -e.B
    com.ljx.example.activity.MainActivity -dh.C


dir mapping是混淆的目录列表,class mapping是具体类的混淆列表。


6.4、混淆任意类


xmlClassGuard任务是支持增量混淆的,如果你需要混淆指定的类com.ljx.example.test.Test,便可以在dir mapping下写入com.ljx.example.test -> h, 此时再次执行xmlClassGuard任务,便会将com.ljx.example.test目录下的所有类(不包含子目录下的类) 移动到h文件夹中,并将所有类名混淆,再次混淆的后mapping文件如下:


dir mapping:
    com.ljx.example -e
    com.ljx.example.activity -dh
    com.ljx.example.test -h

class mapping:
    com.ljx.example.AppHolder -e.B
    com.ljx.example.activity.MainActivity -dh.C
    com.ljx.example.test.Test -h.D

手动输入混淆规则,需要注意以下几条规则。



6.5、每次混淆产生不一样的结果


默认情况下,每次混淆,都将产生一样的结果,混淆的包名根据哈希算法得出,混淆的类名,从大写字母A开启,依次递增,如:A B C ... Y Z BA BB .. ZY ZZ BAA...(可以看做26进制的字符串)


如果你需要每次混淆产生不一样的结果,只需做两步:


1. 对于包名,需要你配置每一个。


2. 对于类名,可以每一个都去配置,但类太多时,配置每一个,就显得繁琐,此时仅需要配置一个即可。


如我们修改一下上面的mapping文件,如下:


dir mapping:
    com.ljx.example -hh
    com.ljx.example.activity -jk
    com.ljx.example.test -et

class mapping:
    com.ljx.example.AppHolder -hh.Z

此时执行xmlClassGuard任务,就会产生不一样的结果,如下:


dir mapping:
    com.ljx.example -hh
    com.ljx.example.activity -jk
    com.ljx.example.test -et

class mapping:
    com.ljx.example.AppHolder -hh.Z
    com.ljx.example.activity.MainActivity -jk.BA
    com.ljx.example.test.Test -et.BC

可以看到,包名完全是根据自定义生成的结果,而类名便从Z开始,依次递增Z BA BC ..., 这里可以把包名看成26进制的字符串依次递增。


7注意事项


• 混淆的类,要避免与其他类同名,否则类名替换时,会出现误杀情况。


• 类混淆后,类的包名(路径)也会被混淆,所以,如果你用到一些三方库,有配置包名的地方,记得手动更改。


• XmlClassGuard不会更改proguard-rules.pro文件的内容,所以,类混淆后,如果该文件内容有混淆前的类或目录,也记得手动更改。


• XmlClassGuard只会帮你更改包名+类名,并同步带其他文件中,不会更改你的任何代码逻辑,如混淆后,出现部分功能不正常问题,需要你自己查找原因,如果是XmlClassGuard的问题,欢迎提issuePR

https://github.com/liujingxing/XmlClassGuard/issues

https://github.com/liujingxing/XmlClassGuard/pulls


警告警告!!!!!! 由于是在本地操作,任务执行是不可逆的,故务必做好代码备份,否则代码将很难还原。


建议通过git管理代码,执行前单独拉个分支。


作者:刘一刀原文链接:https://juejin.cn/post/7079955014822674468


Android系统定制之Android.mk和Android.bp语法详解(精通版)


开源的Android及资源混淆方法推荐

DEX控制流混淆、Android Studio插件版针对Android APK DEX控制流混淆,在不会改变应用原有逻辑的前提下,会将原始代码进行控制流混淆,使得代码难以阅读,增加反编译阅读的难度以达到保护应用。https://github.com/CodingGay/BlackObfuscatorhttps://github.com/CodingGay/BlackObfuscator-ASPlugin
一个可混淆4大组件(混淆任意类),自定义View等任意类的插件,上架Google Play的利器https://github.com/liujingxing/XmlClassGuardhttps://github.com/liujingxing/XmlClassGuard/releases
Android资源混淆工具https://github.com/shwenzhang/AndResGuardhttps://github.com/shwenzhang/AndResGuard/releaseshttps://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md
针对aab文件的资源混淆工具https://github.com/bytedance/AabResGuardhttps://github.com/bytedance/AabResGuard/releaseshttps://github.com/bytedance/AabResGuard/blob/develop/wiki/zh-cn/README.md
Android混淆字典https://github.com/Shouheng88/LeafNote-Community/blob/main/dict.txt
ProGuard, Java optimizer and obfuscatorhttps://github.com/Guardsquare/proguardhttps://github.com/Guardsquare/proguard/releases
修改版Proguard,混淆后的类名为Oo0组合https://github.com/ylk2534246654/Oo0Proguardhttps://github.com/L-JINBIN/Oo0Proguard
AAR proguardshttps://github.com/yongjhih/android-proguards


欢迎关注视频号


推荐阅读

Oo0代码混淆实现方法

超实用的优质公众号推荐

Android应用安全方案梳理

加固不等于安全之APP应用更安全浅析

加密shared_prefs/xml中的内容防窃取

Android包体积优化(常规、进阶、极致)

bundletool工具使用(Android aab包安装)

Google Play上架App之aab转apk和apk转aab的使用方法

Android aab包google上架避免关联下架的解决方案(App出海企业的福利)

Android App Bundle混淆加密加壳加固保护的解决方案(过Google App上架审核)


商务合作,联系作者

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存