Android 將類混淆成中文、混淆資源文件和反編譯

1.配置proguard-rules.pro和module文件混淆成中文:

  1. 在proguard-rules.pro的配置:

       #中文混淆
       -classobfuscationdictionary ./proguard-keys.txt
       -packageobfuscationdictionary ./proguard-keys.txt
       -obfuscationdictionary ./proguard-keys.txt
    

    在module的目錄下創建proguard-keys.txt文件,裏面寫上一堆中文:
    proguard-keys.txt
    混淆成中文,參考文檔鏈接:https://blog.csdn.net/jiangwei0910410003/article/details/61618945

    2.混淆資源文件,使用微信的AndResGuard:
    1.在項目的build.gradle文件中加上AndResGuard的配置:

    dependencies {
    //  微信的資源混淆工具:不僅能全面混淆資源文件,還能縮減資源文件的整體體積
            classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'
        }
    

    2.在module的目錄下創建一個and_res_guard.gradle文件,文件內容如下:

     apply plugin: 'AndResGuard'
      andResGuard {
           // mappingFile = file("./resource_mapping.txt")
           mappingFile = null
           use7zip = true
           useSign = true
           // 打開這個開關,會keep住所有資源的原始路徑,只混淆資源的名字
           keepRoot = false
           whiteList = [
                   // for your icon
                   "R.drawable.icon",
                   // for fabric
                   "R.string.com.crashlytics.*",
                   // for google-services
                   "R.string.google_app_id",
                   "R.string.gcm_defaultSenderId",
                   "R.string.default_web_client_id",
                   "R.string.ga_trackingId",
                   "R.string.firebase_database_url",
                   "R.string.google_api_key",
                   "R.string.google_crash_reporting_api_key"
           ]
           compressFilePattern = [
                   "*.png",
                   "*.jpg",
                   "*.jpeg",
                   "*.gif",
           ]
           sevenzip {
               artifact = 'com.tencent.mm:SevenZip:1.2.15'
               //path = "/usr/local/bin/7za"
           }
       
           /**
            * 可選: 如果不設置則會默認覆蓋assemble輸出的apk
            **/
           // finalApkBackupPath = "${project.rootDir}/final.apk"
       
           /**
            * 可選: 指定v1簽名時生成jar文件的摘要算法
            * 默認值爲“SHA-1”
            **/
           // digestalg = "SHA-256"
       }
    

3.在module的build.gradle文件中引用and_res_guard.gradle文件:

在這裏插入圖片描述
具體的可以參考AndResGuard的開源地址:https://github.com/shwenzhang/AndResGuard

2.混淆成中文遇到的問題:

  1. 在proguard-rules.pro文件中配置-classobfuscationdictionary ./proguard-keys.txt這個,在gradle版本是2.3及以上時,打簽名包報的錯誤信息:

     Caused by: java.io.IOException: Failed to read zip file 'E:\project\workepace\myself\Collection\app\build\intermediates\transforms\proguard\release\jars\3\1f\main.jar'.
    at com.android.apkzlib.zip.ZFile.<init>(ZFile.java:450)
    at com.android.apkzlib.zip.ZFile.<init>(ZFile.java:387)
    at com.android.builder.files.RelativeFiles.fromZip(RelativeFiles.java:122)
    at com.android.builder.files.IncrementalRelativeFileSets.fromZip(IncrementalRelativeFileSets.java:106)
    at com.android.builder.files.IncrementalRelativeFileSets.fromZip(IncrementalRelativeFileSets.java:84)
    at com.android.build.gradle.tasks.PackageAndroidArtifact.doFullTaskAction(PackageAndroidArtifact.java:334)
    at com.android.build.gradle.tasks.PackageApplication.doFullTaskAction(PackageApplication.java:56)
    at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:88)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    ... 91 more
    

解決方式是將gradle版本改成2.2.3的,具體原因和解釋參考鏈接:https://blog.csdn.net/SilentWeek/article/details/78520090

  1. 調整完gradle版本後,try again時報錯:

    Gradle DSL method not found: 'google()'Gradle DSL method not found: 'google()'
    Possible causes:<ul><li>The project 'Collection' may be using a version of the Android Gradle plug-in that does not contain the method (e.g. 'testCompile' was added in 1.1.0).
    Upgrade plugin to version 3.1.4 and sync project</li><li>The project 'Collection' may be using a version of Gradle that does not contain the method.
    Open Gradle wrapper file</li><li>The build file may be missing a Gradle plugin.
    Apply Gradle plugin</li>
    

    將項目的build.gradle文件裏的google()替換成:

    repositories {
    //        google()
            maven {
                url 'https://maven.google.com/'
                name 'Google'
            }
        }
    

加上一混淆的優化點:在proguard-rules.pro文件中加上:

#把你的代碼以及所使用到的各種第三方庫代碼統一移到同一個包下,加上包名可以更好的保護不能被混淆的類
-repackageclasses com.myself.collection

具體解釋和使用AndResGuard資源混淆解釋,參考鏈接:https://blog.csdn.net/hqiangtai/article/details/76037244

最後遇到還未解決的問題,希望有大佬能幫忙。在混淆後類名亂碼和字體樣式變了,顯示的不是proguard-keys.txt配置的簡體字體,最後的混淆效果:
混淆後的結果

3反編譯獲取資源文件和源代碼文件的命令行:

  1. 準備工具:

       apktool  
            作用:資源文件獲取,可以提取出圖片文件和佈局文件進行使用查看
       dex2jar
            作用:將apk反編譯成java源碼(classes.dex轉化成jar文件)
       jd-gui
            作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
    

配置系統環境:在系統變量中新建變量APK_TOOL,變量值是工具所在的文件夾路徑:
在這裏插入圖片描述
將配置的APK_TOOL環境變量加入Path變量中,我們就可以開始進行反編譯了。
在這裏插入圖片描述
2. 使用cmd命令行進入到保存工具的目錄:
在這裏插入圖片描述
輸入apktool.bat d apk名.apk ,等待提取完成:
在這裏插入圖片描述
會在當前目錄下生成一個apk名的文件夾,進入文件夾下的res文件夾中可以查看資源文件:
在這裏插入圖片描述
在這裏插入圖片描述
雖然我們可以將apk文件的後綴改成zip,解壓後能夠的到目錄,但是打開文件裏面顯示亂碼:
在這裏插入圖片描述
3.將apk的 後綴名改成.zip或者rar,解壓文件,拿到對應的classes.dex文件,並將文件複製到dex2jar.jar解壓後對應的文件夾下。然後使用命令行跳轉到dex2jar.jar解壓後的文件夾路徑下:
在這裏插入圖片描述
在該命令行下輸入d2j-dex2jar classes.dex命令,回車,會在這個目錄下生成一個classes-dex2jar.jar文件,然後使用jd-gui工具的jd-gui.exe工具打開生成的jar文件,顯示效果如上面的混淆結果。

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