Java混淆工具 ProGuard之初体验


声明:本文转载自https://my.oschina.net/u/3705740/blog/1561030,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

本文发表于2017年11月05日 16:36
(c)注:本文转载自https://my.oschina.net/u/3705740/blog/1561030,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2098 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1