本文已受權微信公衆號「玉剛說」獨家發佈。java
這篇「Java 混淆那些事」的第二篇,咱們先把咱們的測試環境以及用到的各類工具介紹一下,而後動手去嘗試各類命令而且驗證它們的效果,這樣有助於咱們理解。git
首先須要在電腦上配置好 Java 環境。而後須要的主角 ProGuard,而後還有反編譯軟件 jadx。github
下載連接在下面。 ProGuard 下載地址 jadx 反編譯工具 兩個的工具有用下載地址sql
第一步:寫出測試代碼,打成一個 Jar 包(在文章結尾會介紹 intellij 和 Eclipse 怎麼導出 jar 包)。 第二步:配置 ProGuard 的混淆規則 第三步:使用 jadx 去查看混淆完的類文件的內容。 第四步:一直重複上面三個步驟,搞明白具體的命令。bash
一、把下載的 ProGuard 解壓,打開終端進入 proguard/bin 目錄,輸入 ./proguardgui.sh 打開 ProGuard 的 GUI 客戶端。微信
Windows 電腦直接進入 proguard/bin 目錄雙擊運行 proguardgui.bat 便可。注:須要 JDK 環境app
如圖:點擊 Load configuration 按鈕能夠讀取配置文件。暫時忽略這個地方,等咱們有了配置文件或者須要編寫混淆規則的時候,就能夠在這裏導入了。svn
二、咱們首先準備一個簡單的 Java 項目的 Jar 包,在 Input/Output 選項卡,點擊 Add input 設置須要混淆的 Jar 包,點擊 Add output 設置類文件處理完成以後輸出的位置。工具
注:Mac 版 GUI 有個 BUG,設置 output 時須要選定一個文件,而沒有辦法直接輸入路徑,咱們能夠先把未混淆的 Jar 包複製一份改個名字,混淆完成以後他會自動覆蓋 Jar 包。測試
三、切換到 Process 選項卡,直接點擊 Process 便可輸出處理以後的 Jar 到 output 目錄。點擊 Save configuration 按鈕,能夠保存配置文件,以 .pro、.txt 結尾便可。以後咱們就可以直接在配置文件中修改和編寫混淆規則了。而後就經過第一步直接導入配置了。
以上雖然能夠進行混淆,可是刪除了哪一個類,那個方法,對哪一個方法改了名字等等,咱們都無從知曉。接下來咱們繼續配置一下。接下來咱們配置一下這三個東西,來幫助咱們理解混淆過程。
usage.txt :通過壓縮過程被刪除的類、方法、字段。 mapping.txt :存儲通過混淆過程,新舊類名、方法名、字段名的映射,軟件發佈必定要保留此文件,否則收集上來的報錯信息,不知道具體是哪一個類或方法,你將會非常頭疼。 seeds.txt :被 Keep 規則匹配到的類、方法、字段,來驗證咱們的 keep 規則是否合咱們的需求。
點開 Shrinker 選項卡,在 Print usage 前面打鉤,並選擇 usage.txt 的輸出路徑。
點開 Obfuscator 選項卡,在 Print mapping 前面打鉤,並選擇 mapping.txt 的輸出路徑。
點開 Information 選項卡,在 Print seeds 前面打鉤,並選擇 seeds.txt 的輸出路徑。
經過上述方法保留的相關文件可以驗證咱們的混淆規則,可是咱們調試起來比較麻煩而且不夠直觀,因此咱們使用一個開源工具 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 本身默認添加的。
此方法只適用於最普通的 Java SE 項目,若是使用了 Maven 等工具,可使用 Maven 打包。
一、點擊 File => Project Structure
二、點擊 Artifacts 選項卡,而後點擊 + 號
三、選擇 JAR => From modules with dependencies...
四、選擇 main 方法,而後點擊 OK。
五、選擇 Build => Build Artifacts...
六、選擇 Build 便可
七、在項目根目錄 out/artifacts/項目名_jar,就能夠看到打包的 Jar 包了
一、在項目上點擊右鍵,點擊 Export
二、點開 java 選擇 JAR file
三、選擇 Jar 的存放位置點擊 Finish 便可。