本文已授權(quán)微信公眾號「玉剛說」獨(dú)家發(fā)布。
這篇「Java 混淆那些事」的第二篇,我們先把我們的測試環(huán)境以及用到的各種工具介紹一下,然后動(dòng)手去嘗試各種命令并且驗(yàn)證它們的效果,這樣有助于我們理解。
配置測試環(huán)境
首先需要在電腦上配置好 Java 環(huán)境。然后需要的主角 ProGuard,然后還有反編譯軟件 jadx。
下載鏈接在下面。
ProGuard 下載地址
jadx 反編譯工具
兩個(gè)的工具備用下載地址
簡單描述我們的測試流程
第一步:寫出測試代碼,打成一個(gè) Jar 包(在文章結(jié)尾會介紹 intellij 和 Eclipse 怎么導(dǎo)出 jar 包)。
第二步:配置 ProGuard 的混淆規(guī)則
第三步:使用 jadx 去查看混淆完的類文件的內(nèi)容。
第四步:一直重復(fù)上面三個(gè)步驟,搞明白具體的命令。
簡單實(shí)用的 ProGuard GUI
1、把下載的 ProGuard 解壓,打開終端進(jìn)入 proguard/bin 目錄,輸入 ./proguardgui.sh 打開 ProGuard 的 GUI 客戶端。
Windows 電腦直接進(jìn)入 proguard/bin 目錄雙擊運(yùn)行 proguardgui.bat 即可。注:需要 JDK 環(huán)境
如圖:點(diǎn)擊 Load configuration 按鈕可以讀取配置文件。暫時(shí)忽略這個(gè)地方,等我們有了配置文件或者需要編寫混淆規(guī)則的時(shí)候,就可以在這里導(dǎo)入了。

2、我們首先準(zhǔn)備一個(gè)簡單的 Java 項(xiàng)目的 Jar 包,在 Input/Output 選項(xiàng)卡,點(diǎn)擊 Add input 設(shè)置需要混淆的 Jar 包,點(diǎn)擊 Add output 設(shè)置類文件處理完成之后輸出的位置。

注:Mac 版 GUI 有個(gè) BUG,設(shè)置 output 時(shí)需要選定一個(gè)文件,而沒有辦法直接輸入路徑,我們可以先把未混淆的 Jar 包復(fù)制一份改個(gè)名字,混淆完成之后他會自動(dòng)覆蓋 Jar 包。
3、切換到 Process 選項(xiàng)卡,直接點(diǎn)擊 Process 即可輸出處理之后的 Jar 到 output 目錄。點(diǎn)擊 Save configuration 按鈕,可以保存配置文件,以 .pro、.txt 結(jié)尾即可。之后我們就能夠直接在配置文件中修改和編寫混淆規(guī)則了。然后就通過第一步直接導(dǎo)入配置了。

配置 ProGuard 的調(diào)試選項(xiàng)
以上雖然可以進(jìn)行混淆,但是刪除了哪個(gè)類,那個(gè)方法,對哪個(gè)方法改了名字等等,我們都無從知曉。接下來我們繼續(xù)配置一下。接下來我們配置一下這三個(gè)東西,來幫助我們理解混淆過程。
usage.txt :經(jīng)過壓縮過程被刪除的類、方法、字段。
mapping.txt :存儲經(jīng)過混淆過程,新舊類名、方法名、字段名的映射,軟件發(fā)布一定要保留此文件,不然收集上來的報(bào)錯(cuò)信息,不知道具體是哪個(gè)類或方法,你將會很是頭疼。
seeds.txt :被 Keep 規(guī)則匹配到的類、方法、字段,來驗(yàn)證我們的 keep 規(guī)則是否合我們的需求。
usage.txt 的配置
點(diǎn)開 Shrinker 選項(xiàng)卡,在 Print usage 前面打鉤,并選擇 usage.txt 的輸出路徑。

mapping.txt 的配置
點(diǎn)開 Obfuscator 選項(xiàng)卡,在 Print mapping 前面打鉤,并選擇 mapping.txt 的輸出路徑。

seeds.txt 的配置
點(diǎn)開 Information 選項(xiàng)卡,在 Print seeds 前面打鉤,并選擇 seeds.txt 的輸出路徑。

使用 jadx 來查看混淆過的 Jar
通過上述方法保留的相關(guān)文件能夠驗(yàn)證我們的混淆規(guī)則,但是我們調(diào)試起來比較麻煩并且不夠直觀,所以我們使用一個(gè)開源工具 jadx 來觀察混淆后的代碼,來驗(yàn)證我們的混淆規(guī)則。
解壓下載完成后的 jadx.zip 然后進(jìn)入 bin 目錄,雙擊 jadx-gui 打開 jadx 軟件。
Windows 雙擊 jadx-gui.bat 打開軟件
可以打開混淆完成后 Jar 包,然后比較自己的源代碼,查看不同地方。

認(rèn)識一下配置文件
#輸入需要混淆的 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 自己默認(rèn)添加的。
常用 IDE 導(dǎo)出 Jar 包
IntelliJ IDEA
此方法只適用于最普通的 Java SE 項(xiàng)目,如果使用了 Maven 等工具,可以使用 Maven 打包。
1、點(diǎn)擊 File => Project Structure

2、點(diǎn)擊 Artifacts 選項(xiàng)卡,然后點(diǎn)擊 + 號

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

4、選擇 main 方法,然后點(diǎn)擊 OK。

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

6、選擇 Build 即可

7、在項(xiàng)目根目錄 out/artifacts/項(xiàng)目名_jar,就可以看到打包的 Jar 包了
Eclipse
1、在項(xiàng)目上點(diǎn)擊右鍵,點(diǎn)擊 Export

2、點(diǎn)開 java 選擇 JAR file

3、選擇 Jar 的存放位置點(diǎn)擊 Finish 即可。
