Java 混淆那些事(二):認識 ProGuard GUI

QuincySx發表於2019-03-24

本文已授權微信公眾號「玉剛說」獨家釋出。

這篇「Java 混淆那些事」的第二篇,我們先把我們的測試環境以及用到的各種工具介紹一下,然後動手去嘗試各種命令並且驗證它們的效果,這樣有助於我們理解。

配置測試環境

首先需要在電腦上配置好 Java 環境。然後需要的主角 ProGuard,然後還有反編譯軟體 jadx。

下載連結在下面。 ProGuard 下載地址 jadx 反編譯工具 兩個的工具備用下載地址

簡單描述我們的測試流程

第一步:寫出測試程式碼,打成一個 Jar 包(在文章結尾會介紹 intellij 和 Eclipse 怎麼匯出 jar 包)。 第二步:配置 ProGuard 的混淆規則 第三步:使用 jadx 去檢視混淆完的類檔案的內容。 第四步:一直重複上面三個步驟,搞明白具體的命令。

簡單實用的 ProGuard GUI

1、把下載的 ProGuard 解壓,開啟終端進入 proguard/bin 目錄,輸入 ./proguardgui.sh 開啟 ProGuard 的 GUI 客戶端。

Windows 電腦直接進入 proguard/bin 目錄雙擊執行 proguardgui.bat 即可。注:需要 JDK 環境

如圖:點選 Load configuration 按鈕可以讀取配置檔案。暫時忽略這個地方,等我們有了配置檔案或者需要編寫混淆規則的時候,就可以在這裡匯入了。

Java 混淆那些事(二):認識 ProGuard GUI

2、我們首先準備一個簡單的 Java 專案的 Jar 包,在 Input/Output 選項卡,點選 Add input 設定需要混淆的 Jar 包,點選 Add output 設定類檔案處理完成之後輸出的位置。

Java 混淆那些事(二):認識 ProGuard GUI

注:Mac 版 GUI 有個 BUG,設定 output 時需要選定一個檔案,而沒有辦法直接輸入路徑,我們可以先把未混淆的 Jar 包複製一份改個名字,混淆完成之後他會自動覆蓋 Jar 包。

3、切換到 Process 選項卡,直接點選 Process 即可輸出處理之後的 Jar 到 output 目錄。點選 Save configuration 按鈕,可以儲存配置檔案,以 .pro、.txt 結尾即可。之後我們就能夠直接在配置檔案中修改和編寫混淆規則了。然後就通過第一步直接匯入配置了。

Java 混淆那些事(二):認識 ProGuard GUI

配置 ProGuard 的除錯選項

以上雖然可以進行混淆,但是刪除了哪個類,那個方法,對哪個方法改了名字等等,我們都無從知曉。接下來我們繼續配置一下。接下來我們配置一下這三個東西,來幫助我們理解混淆過程。

usage.txt :經過壓縮過程被刪除的類、方法、欄位。 mapping.txt :儲存經過混淆過程,新舊類名、方法名、欄位名的對映,軟體釋出一定要保留此檔案,不然收集上來的報錯資訊,不知道具體是哪個類或方法,你將會很是頭疼。 seeds.txt :被 Keep 規則匹配到的類、方法、欄位,來驗證我們的 keep 規則是否合我們的需求。

usage.txt 的配置

點開 Shrinker 選項卡,在 Print usage 前面打鉤,並選擇 usage.txt 的輸出路徑。

Java 混淆那些事(二):認識 ProGuard GUI

mapping.txt 的配置

點開 Obfuscator 選項卡,在 Print mapping 前面打鉤,並選擇 mapping.txt 的輸出路徑。

Java 混淆那些事(二):認識 ProGuard GUI

seeds.txt 的配置

點開 Information 選項卡,在 Print seeds 前面打鉤,並選擇 seeds.txt 的輸出路徑。

Java 混淆那些事(二):認識 ProGuard GUI

使用 jadx 來檢視混淆過的 Jar

通過上述方法保留的相關檔案能夠驗證我們的混淆規則,但是我們除錯起來比較麻煩並且不夠直觀,所以我們使用一個開源工具 jadx 來觀察混淆後的程式碼,來驗證我們的混淆規則。

解壓下載完成後的 jadx.zip 然後進入 bin 目錄,雙擊 jadx-gui 開啟 jadx 軟體。

Windows 雙擊 jadx-gui.bat 開啟軟體

可以開啟混淆完成後 Jar 包,然後比較自己的原始碼,檢視不同地方。

Java 混淆那些事(二):認識 ProGuard GUI

認識一下配置檔案

#輸入需要混淆的 Jar
-injars JavaProGuardDemo.jar
#輸出混淆完成的 Jar
-outjars 'JavaProGuardDemo 2.jar'

-libraryjars /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/rt.jar

# 列印 usage
-printusage usage.txt
# 列印 mapping
-printmapping mapping.txt
# 列印 seeds
-printseeds seeds.txt

# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver

# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
    public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}

# Keep - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
    native <methods>;
}
...
複製程式碼

這是最基本的配置檔案,除了寫註釋的那幾句是我們自己在 GUI 的操作中新增的,其它都是 ProGuard 自己預設新增的。

常用 IDE 匯出 Jar 包

IntelliJ IDEA

此方法只適用於最普通的 Java SE 專案,如果使用了 Maven 等工具,可以使用 Maven 打包。

1、點選 File => Project Structure

Java 混淆那些事(二):認識 ProGuard GUI

2、點選 Artifacts 選項卡,然後點選 + 號

Java 混淆那些事(二):認識 ProGuard GUI

3、選擇 JAR => From modules with dependencies...

Java 混淆那些事(二):認識 ProGuard GUI

4、選擇 main 方法,然後點選 OK。

Java 混淆那些事(二):認識 ProGuard GUI

5、選擇 Build => Build Artifacts...

Java 混淆那些事(二):認識 ProGuard GUI

6、選擇 Build 即可

Java 混淆那些事(二):認識 ProGuard GUI

7、在專案根目錄 out/artifacts/專案名_jar,就可以看到打包的 Jar 包了

Eclipse

1、在專案上點選右鍵,點選 Export

Java 混淆那些事(二):認識 ProGuard GUI

2、點開 java 選擇 JAR file

Java 混淆那些事(二):認識 ProGuard GUI

3、選擇 Jar 的存放位置點選 Finish 即可。

Java 混淆那些事(二):認識 ProGuard GUI

相關文章