Android应用安全防护实践一辣敌方眼睛之代码混淆-Activity混淆(五)

大家都晓得四大组件是不能混淆的 因为混淆工具只会搞dex文件的混淆 xml就不行了 强行混淆会导致activity文件名改变了 注册清单里面的没变从而导致无法运行APP

下面介绍一个能混淆四大组件 自定义view的办法 和其他的组件
效果图如下
效果图
可以看到四大组件名字都改变了 谁也认不出咋是啥玩意 大大提高解读难度

这个gradle插件是饿了么开源的组件 开源项目我也copy了一份 点我直达
copy的版本是本文发布的时间 2019年01月20日14:51:38
如果有更新请自己跟踪copy

使用很简单 但是官方并没有太多的使用文档和注意事项说

我这里根据使用经验来补充介绍一下

  1. 插件的最新版本是2.0.0 也就是classpath 'me.ele:mess-plugin:2.0.0’这样 可以自己改成classpath 'me.ele:mess-plugin:+'来获取最新版本 获取完毕之后在改成写死的最新版本
  2. 2.0.0版本插件只支持gradle 3.0.x版本 如果你使用的gradle版本比较高 请自行降低 否则会报错找不到清单文件
  3. 混淆规则请添加指令-dontshrink 否则会导致插件失效
  4. 混淆如果使用之前文章的自定义字典 请注释classobfuscationdictionary这个类名字典 否则会导致编译失败 因为xml不识别特殊符号
  5. 使用时请吧混淆规则的排除四大组件 自定义view等规则注释 否则就没有使用这个插件的意义了
  6. 在测试混淆的时候 请不要使用 run的方法直接运行到手机 有可能导致插件失效 我是build debug apk 文件出来发送到手机来测试的

下面附上我的混淆配置文件

#必须要开 否则ele的activity混淆会失效
-dontshrink
-optimizationpasses 5
-dontusemixedcaseclassnames
#-overloadaggressively
#-useuniqueclassmembernames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-allowaccessmodification
-dontoptimize
-dontpreverify
-ignorewarnings
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes Exceptions
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
#自定义输出到指定包名 捉迷藏
-repackageclasses 'android.support.v4'
-verbose

#自定义字典 类名的混淆字典注释 为什么上面说了
-obfuscationdictionary dict.txt
#-classobfuscationdictionary dict.txt
-packageobfuscationdictionary dict.txt

#关闭警告
-dontwarn android.support.**
-dontwarn androidx.**
#webview 使用了要加上
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}

-keepclassmembers,allowoptimization enum * {
      public static **[] values();
      public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
#移除日志
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
-assumenosideeffects class java.io.PrintStream {
    public *** println(...);
    public *** print(...);
}
#-----------------------------不动-----------------------------
#okhttp的混淆
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform

#腾讯mta统计
-keep class com.tencent.stat.*{*;}
-keep class com.tencent.mid.*{*;}
#广点通广告
-keep class com.qq.e.** {
    public protected *;
}


#ndk类排除
-keep class 包名.Utils{
*;
}
#webview js 交互
-keep class 包名.JavaScriptLocal{
*;
}

配置好了就可以build apk出来测试了 可以使用jadx-gui来反编译项目查看效果 jadx-gui工具自己网上找

附上使用方法

项目根目的gradle依赖导入

dependencies {
        //noinspection GradleDependency
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'me.ele:mess-plugin:2.0.0'
    }

app模块的使用插件

apply plugin: 'com.android.application'
apply plugin: 'me.ele.mess'

这样就行

猜你喜欢

转载自blog.csdn.net/weixin_44515491/article/details/86562277