Java混淆工具 ProGuard之初體驗

1.混淆工具版本html

本文使用的是ProGuard這一款Java代碼混淆工具。 由於在咱們實際的開發工做中,有些程序包含了公司核心產品的代碼,因此爲了保護自身的知識產權,避免程序包不當心外流出去,咱們有必要進行一些保護措施,在程序開發完以後,須要將程序代碼進行混淆。java

本文使用的是ProGuard v5.3.3版本。 下載地址:http://www.jb51.net/softs/242707.htmlapache

2.混淆工具安裝步驟json

2.1下載後的文件是一個壓縮包:eclipse

輸入圖片說明

2.2 解壓壓縮包ide

輸入圖片說明

3.混淆工具使用步驟函數

3.1 解壓後,執行 bin目錄下的proguardgui.bat工具

輸入圖片說明

執行proguardgui.bat後如圖:優化

輸入圖片說明

注意:執行proguardgui.bat後會出現一個cmd命令框,不要關閉,最小化便可。ui

3.2 點擊左側菜單欄中的「Input/Output」按鈕:

輸入圖片說明

3.4 點擊右側菜單欄中的「Add input...」按鈕,導入須要被混淆的jar包:

輸入圖片說明

輸入圖片說明

3.5 點擊右側菜單欄中的「Add Output...」按鈕,填寫配置咱們須要混淆後輸出的jar包,輸出的jar包須要本身手動填寫,jar包名稱能夠自定義:

輸入圖片說明

配置好jar包輸入輸出後,如圖:

輸入圖片說明

3.6 添加支持庫,即eclipse裏java project裏的libraries全部Library的jar包,點擊下方「Library jars,aara,wars,wars,zips,apks,and directories」框右側「Add」按鈕:

輸入圖片說明

添加完畢後,如圖所示:

輸入圖片說明

3.7 設置Shrinking,設置如圖所示:

輸入圖片說明

3.8 設置Obfuscation,設置如圖所示:

輸入圖片說明

3.9 設置Optimization,設置如圖所示:

輸入圖片說明

3.10 設置Information,注意Target的jdk版本,設置如圖所示:

輸入圖片說明

3.11點擊「process」,再點擊「save configuration」,在彈出的對話框中,輸入要保存的配置文件(首先在指定文件夾下建立一個空test.pro文件,選中test.pro),最後點擊「保存」:

輸入圖片說明

3.12 保存完test.pro文件以後,關閉ProGuard,開始手動修改配置文件test.pro,test.pro文件內容在保存時已自動生成內容,咱們只需添加自定義的修改便可,內容以下:

-injars angora_test.jar
-outjars angora_test_mix.jar

-libraryjars 'C:\Program Files\Java\jre1.8.0_131\lib\rt.jar'
-libraryjars 'D:\proguardlib\JavaEWAH-0.3.2.jar'
-libraryjars 'D:\proguardlib\RoaringBitmap-0.4.5.jar'
#…略 
#以上均爲以前載入的支持庫jar包,此處略

-dontshrink
-keeppackagenames
-flattenpackagehierarchy ''
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
-keepparameternames

#不優化 代碼/配置/變量
-optimizations !code/allocation/variable

#忽略警告
-ignorewarnings

#忽略泛型
-keepattributes Signature

#忽略註解
-keepattributes *Annotation*

#不要警告找不到com.alibaba.fastjson.**這個包裏面的類的相關引用
-dontwarn com.alibaba.fastjson.**

#保持com.alibaba.fastjson.**這個包裏面的全部類和全部方法而不混淆
-keep class com.alibaba.fastjson.**{*;}

-dontwarn com.groovy.util.**
-keep class com.groovy.util.**{*;}

-dontwarn com.apache.common.**
-keep class com.apache.common.**{*;}

-dontwarn com.codehaus.groovy.**
-keep class com.codehaus.groovy.**{*;}

-keep class com.bynear.main.**{*;}
-keep class com.bynear.main.dispatcher.**{*;}

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

# Keep names - _class method names. Keep all .class method names. This may be
# useful for libraries that will be obfuscated again with different obfuscators.
-keepclassmembers,allowshrinking class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String,boolean);
}

# Remove - System method calls. Remove all invocations of System
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.System {
    public static long currentTimeMillis();
static java.lang.Class getCallerClass();
#…略
}

# Remove - Math method calls. Remove all invocations of Math
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.Math {
    public static double sin(double);
    public static double cos(double);
    #…略
}

# Remove - Number method calls. Remove all invocations of Number
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.* extends java.lang.Number {
    public static java.lang.String toString(byte);
public static java.lang.Byte valueOf(byte);
#…略
}

# Remove - String method calls. Remove all invocations of String
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.String {
    public static java.lang.String copyValueOf(char[]);
public static java.lang.String copyValueOf(char[],int,int);
#…略
}

# Remove - StringBuffer method calls. Remove all invocations of StringBuffer
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuffer {
    public java.lang.String toString();
public char charAt(int);
#…略
}

# Remove - StringBuilder method calls. Remove all invocations of StringBuilder
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuilder {
    public java.lang.String toString();
public char charAt(int);
#…略
}

3.13 自定義配置文件說明:

3.13.1 這裏是列表文本解決Proguard的bug:「java.lang.ClassFormatError: LVTT entry for 'clazz' in class file ** does not match any LVT entry」,須要配置如下參數:

#不優化 代碼/配置/變量
-optimizations !code/allocation/variable

#忽略警告
-ignorewarnings

#忽略泛型
-keepattributes Signature

#忽略註解
-keepattributes *Annotation*

3.13.2 解決找不到引用的類是第三方包裏面的狀況,由於這種狀況會在混淆過程當中報錯,致使不能混淆代碼,須要配置如下參數:

#不要警告找不到com.alibaba.fastjson.**這個包裏面的類的相關引用
-dontwarn com.alibaba.fastjson.**

#保持com.alibaba.fastjson.**這個包裏面的全部類和全部方法而不混淆
-keep class com.alibaba.fastjson.**{*;}

3.13.3 爲了保證jar包的正常運行,咱們不混淆main函數所在的類,須要配置如下參數:

#保持com.bynear.main.**這個包裏面的全部類和全部方法而不混淆
-keep class com.bynear.main.**{*;}
#保持com.bynear.main.dispatcher.**這個包裏面的全部類和全部方法而不混淆
-keep class com.bynear.main.dispatcher.**{*;}

3.14 從新啓動ProGuard,加載配置文件test.pro,點擊左菜單「ProGuard」,而後點擊「Load configuration」,選擇以前配置好的pro文件,打開便可,如圖:

輸入圖片說明

3.15 選擇作菜單「Process」,點擊下方「View configuration」,查看配置文件內容是否正確,最後點擊下方右側「Porcess!」,程序開始進行混淆,如圖:

輸入圖片說明

3.16 出現「Processing completed successfully」,表明混淆成功!如圖:

輸入圖片說明

本文只是一個簡單的ProGuard入手操做的示例,方便你們快速上手使用,其實ProGuard還有許多自定義的內容,你們能夠在網上搜索更多關於ProGuard的內容進行了解。

相關文章
相關標籤/搜索