Java混淆工具 ProGuard之初体验 Java混淆工具 ProGuard之初体验

来源:
三产
最后修订:
2017年11月06日 10:45:28
 1457

1.混淆工具版本

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

本文转载自:Java混淆工具 ProGuard之初体验 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的内容进行了解。