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

本文已受權微信公衆號「玉剛說」獨家發佈。java

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

配置測試環境

首先須要在電腦上配置好 Java 環境。而後須要的主角 ProGuard,而後還有反編譯軟件 jadx。github

下載連接在下面。 ProGuard 下載地址 jadx 反編譯工具 兩個的工具有用下載地址sql

簡單描述咱們的測試流程

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

簡單實用的 ProGuard GUI

一、把下載的 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 結尾便可。以後咱們就可以直接在配置文件中修改和編寫混淆規則了。而後就經過第一步直接導入配置了。

配置 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 打包。

一、點擊 File => Project Structure

二、點擊 Artifacts 選項卡,而後點擊 + 號

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

四、選擇 main 方法,而後點擊 OK。

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

六、選擇 Build 便可

七、在項目根目錄 out/artifacts/項目名_jar,就能夠看到打包的 Jar 包了

Eclipse

一、在項目上點擊右鍵,點擊 Export

二、點開 java 選擇 JAR file

三、選擇 Jar 的存放位置點擊 Finish 便可。

相關文章
相關標籤/搜索