Java混淆工具 ProGuard之初体验

1.混淆工具版本

本文使用的是ProGuard这一款Java代码混淆工具。 因为在我们实际的开发工作中,有些程序包含了公司核心产品的代码,所以为了保护自身的知识产权,避免程序包不小心外流出去,我们有必要进行一些保护措施,在程序开发完之后,需要将程序代码进行混淆。

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

2.混淆工具安装步骤

2.1下载后的文件是一个压缩包:

输入图片说明

2.2 解压压缩包

输入图片说明

3.混淆工具使用步骤

3.1 解压后,执行 bin目录下的proguardgui.bat

输入图片说明

执行proguardgui.bat后如图:

输入图片说明

注意:执行proguardgui.bat后会出现一个cmd命令框,不要关闭,最小化即可。

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的内容进行了解。

猜你喜欢

转载自my.oschina.net/u/3705740/blog/1561030