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'

這樣就行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章