proguard 混淆工具的用法 (適用於初學者參考)


一、  ProGuard簡介

附:proGuard官網

因為Java代碼是非常容易反編碼的,況且Android開發的應用程序是用Java代碼寫的,為了很好的保護Java源代碼,我們需要對編譯好后的class文件進行混淆。

ProGuard是一個混淆代碼的開源項目,它的主要作用是混淆代碼,殊不知ProGuard還包括以下4個功能。

  1. 壓縮(Shrink):檢測並移除代碼中無用的類、字段、方法和特性(Attribute)。
  2. 優化(Optimize):對字節碼進行優化,移除無用的指令。
  3. 混淆(Obfuscate):使用a,b,c,d這樣簡短而無意義的名稱,對類、字段和方法進行重命名。
  4. 預檢(Preveirfy):在Java平台上對處理后的代碼進行預檢,確保加載的class文件是可執行的。

總而言之,根據官網的翻譯:Proguard是一個Java類文件壓縮器、優化器、混淆器、預校驗器。壓縮環節會檢測以及移除沒有用到的類、字段、方法以及屬性。優化環節會分析以及優化方法的字節碼。混淆環節會用無意義的短變量去重命名類、變量、方法。這些步驟讓代碼更精簡,更高效,也更難被逆向(破解)。

  

ProGuard工作原理

ProGuarshrinkoptimizeobfuscatepreveirfy四個步驟組成,每個步驟都是可選的,我們可以通過配置腳本來決定執行其中的哪幾個步驟。

混淆就是移除沒有用到的代碼,然后對代碼里面的類、變量、方法重命名為人可讀性很差的簡短名字。

那么有一個問題,ProGuard怎么知道這個代碼沒有被用到呢?

 

這里引入一個Entry Point(入口點)概念,Entry Point是在ProGuard過程中不會被處理的類或方法。在壓縮的步驟中,ProGuard會從上述的Entry Point開始遞歸遍歷,搜索哪些類和類的成員在使用,對於沒有被使用的類和類的成員,就會在壓縮段丟棄,在接下來的優化過程中,那些非Entry Point的類、方法都會被設置為privatestaticfinal,不使用的參數會被移除,此外,有些方法會被標記為內聯的,在混淆的步驟中,ProGuard會對非Entry Point的類和方法進行重命名。

 

二、proGuard基本使用之UI界面操作

  1.去proGuard 官網下載地址下載並解壓proguard,執行 bin目錄下的proguardgui.bat 如下圖

    

           2.啟動后如下圖所示,我們重按展示順序一步一步向下走ProGuard

注:紅色圈內為加載配置文件按鈕.官方推介”myconfig.pro”文件格式,其他博客寫的配置文件都為xxx.cfg格式.在沒有配置文件下可不做此操作。

 

3.Input/Output展示如下圖。

注:工具很強大,可以導入各種的包如(jar,war,ears,zips)等格式的進行操作。由於對其他格式的文件操作不熟不知會產生什么莫名錯誤。所以就以jar文件做為例子.

Add input:導入需要操作的文件。

Add Outinput: 需要輸入的文件。

Filter: 過濾導入文件內那些不需要操作的文件。

Add an enty:添加支持庫library jars. 對添加的項目支持 jar文件或者其他文件不會進行處理。

 

3.shrinking如下圖。

注:proGuard的壓縮屬性。刪除無效的代碼(未研究)

4.Obfuscation 代碼混淆的主要配置如下圖

注:勾選中為需要做什么什么操作。

1.  obfuscate 代碼混淆

2.  Print Mapping 輸出映射文件即混淆后與混淆前的映射

3.  Apply mapping 應用映射文件

4.  Obfuscation dictionary 自定義混淆的類名,方法名,變量名字典,替換原先的a,b,c.這中格式的

5.  Class Obfuscation dictionary

6.  Package Obfuscation dictionary

7.  Overload aggressively 混淆的時候大量使用重載,減小包體積,增加理解難度

8.  User unique clssmember names 指定相同的混淆名對應相同的方法名

9.  User mixed-case class names 指定在混淆的時候使用大小寫混用的類名

10.  Keep package names 聲明不混淆指定的包名

11.  Flatten package hierarchy 所有重新命名的都重新打包

12.  Repackage Classes 所有重新命名過的都重新打包

13.  Keep attributes 指定受保護的屬性

14.  Keep parameter names 指定被保護的方法的參數類型和參數名不被混淆

15.  Rename sourceFile attribute 指定一個字符串常量設置到源文件的類的屬性

16.  Adapt class strings 指定字符串常量如果與類名相同,也需要被混淆

17.  Adapt resource file names 如果資源文件與某類名同,那么混淆后資源文件被命名為與之對應的類的混淆名

18.  Adapt resource file names 指定資源文件的中的類名隨混淆后的名字更新

 

 

ADD 操作 添加自定義的一些文件不被混淆 使用通配符的形式進行匹配

 5.Optimization 代碼優化 如下圖

6.Information 如下圖 一些輸出或后台執行信息的配置 默認就好

8.Process 執行操作界面 包含查看配置文件,保存配置文件和執行按鈕操作

三、 Maven項目配置ProGuard

  1. maven集成proguard  .pom文件配置方式有三種放在。
    1. 利用注解的方式在需要的混淆的文件中給上相應的注解。
    2. 直接以<option><option> 的方式編輯相應參數配置
    3. 加載配置文件的形式 .pro文件或.cfg 文件
    4. 配置文件模板.可參考附帶項目列子 .pom 文件
    5. 注:proguard並沒有提供直接打成war的方式。一般情況都市生成jar包並把jar包做混淆,之后替換原有的class文件。

四、 ProGuard一些注意事項

a. 反射使用。比如 setName() 方法通過混淆被映射為了 a() 如果我們希望通過方法名 setName 來調用類中的該方法,在寫代碼的時候,我們也不會知道這個名字將會被映射為 a ,混淆之后,會找不到方法的。 混淆使得方法名發生改變,而我們還在使用原來的方法名進行反射。

b. bean 文件使用。對於 bean 文件,很多時候,它們作為和服務器之間的通信實體。如果在這種情況下進行了混淆,當數據發給服務器之后,服務器是看不懂的,因為屬性名都變了,而服務端保存的是原來的 bean 文件(序列化問題,json問題

c. 回調函數。這是一個值得注意的地方。比如在 Activity 中的 onTouchEvent 回調,如果被你混淆了,而系統實際上不知道的,混淆是你的個人行為。它不會知道到該回調的,同樣因為找不到。

d. 枚舉。在使用枚舉類型的時候,應當注意不要對它們進行混淆。因為枚舉會使用反射進行操作。

e. native 方法不要混淆。

f. 內嵌類經常會被混淆,結果在調用的時候為空就崩潰了。(開發盡量避免內嵌類)

# 保留內嵌類不被混淆 :-keep class com.example.xxx.MainActivity$* { *; }

 

詳細請查考附件:proGuard-example

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM