本文已授權微信公眾號「玉剛說」獨家釋出。
這篇「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 按鈕可以讀取配置檔案。暫時忽略這個地方,等我們有了配置檔案或者需要編寫混淆規則的時候,就可以在這裡匯入了。
2、我們首先準備一個簡單的 Java 專案的 Jar 包,在 Input/Output 選項卡,點選 Add input 設定需要混淆的 Jar 包,點選 Add output 設定類檔案處理完成之後輸出的位置。
注:Mac 版 GUI 有個 BUG,設定 output 時需要選定一個檔案,而沒有辦法直接輸入路徑,我們可以先把未混淆的 Jar 包複製一份改個名字,混淆完成之後他會自動覆蓋 Jar 包。
3、切換到 Process 選項卡,直接點選 Process 即可輸出處理之後的 Jar 到 output 目錄。點選 Save configuration 按鈕,可以儲存配置檔案,以 .pro、.txt 結尾即可。之後我們就能夠直接在配置檔案中修改和編寫混淆規則了。然後就通過第一步直接匯入配置了。
配置 ProGuard 的除錯選項
以上雖然可以進行混淆,但是刪除了哪個類,那個方法,對哪個方法改了名字等等,我們都無從知曉。接下來我們繼續配置一下。接下來我們配置一下這三個東西,來幫助我們理解混淆過程。
usage.txt :經過壓縮過程被刪除的類、方法、欄位。 mapping.txt :儲存經過混淆過程,新舊類名、方法名、欄位名的對映,軟體釋出一定要保留此檔案,不然收集上來的報錯資訊,不知道具體是哪個類或方法,你將會很是頭疼。 seeds.txt :被 Keep 規則匹配到的類、方法、欄位,來驗證我們的 keep 規則是否合我們的需求。
usage.txt 的配置
點開 Shrinker 選項卡,在 Print usage 前面打鉤,並選擇 usage.txt 的輸出路徑。
mapping.txt 的配置
點開 Obfuscator 選項卡,在 Print mapping 前面打鉤,並選擇 mapping.txt 的輸出路徑。
seeds.txt 的配置
點開 Information 選項卡,在 Print seeds 前面打鉤,並選擇 seeds.txt 的輸出路徑。
使用 jadx 來檢視混淆過的 Jar
通過上述方法保留的相關檔案能夠驗證我們的混淆規則,但是我們除錯起來比較麻煩並且不夠直觀,所以我們使用一個開源工具 jadx 來觀察混淆後的程式碼,來驗證我們的混淆規則。
解壓下載完成後的 jadx.zip 然後進入 bin 目錄,雙擊 jadx-gui 開啟 jadx 軟體。
Windows 雙擊 jadx-gui.bat 開啟軟體
可以開啟混淆完成後 Jar 包,然後比較自己的原始碼,檢視不同地方。
認識一下配置檔案
#輸入需要混淆的 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
2、點選 Artifacts 選項卡,然後點選 + 號
3、選擇 JAR => From modules with dependencies...
4、選擇 main 方法,然後點選 OK。
5、選擇 Build => Build Artifacts...
6、選擇 Build 即可
7、在專案根目錄 out/artifacts/專案名_jar,就可以看到打包的 Jar 包了
Eclipse
1、在專案上點選右鍵,點選 Export
2、點開 java 選擇 JAR file
3、選擇 Jar 的存放位置點選 Finish 即可。