简介
Java代码很容易被反编译,为了防止代码被反编译,需要对Java代码进行混淆,比如用a,b ,c 等变量名代替有意义的变量名。ProGuard是开源的混淆Java的工具,可以通过proguardgui来单独混淆Jar,
也可以通过集成到maven中自动混淆Java代码。
ProGuard具有以下四个功能:
1、压缩(Shrink):检测并移除无用的类、字段、方法和属性。
2、优化 (Optimize):对字节码进行优化,移除无用指令。
3、混淆(obfuscate):对类、方法、变量、属性进行重命名。
4、预检(preverify):对Java代码进行预检,以确保代码可以执行。
MAVEN配置说明
Proguard的配置可以完全放在maven的pom.xml配置文件里面,也可以作为单独的文件引用,为了更清晰期间我做成外部文件形式。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.10</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardVersion>5.2</proguardVersion>
<obfuscate>true</obfuscate>
<!-- attachArtifactClassifier>pg</attachArtifactClassifier> -->
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<!-- 添加依赖,这里你可以按你的需要修改 -->
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
<dependencies>
<!-- 使用版本来混淆 -->
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
说明:<proguardInclude>${basedir}/proguard.conf</proguardInclude>引用外部的配置文件,配置文件和pom.xml在目录上平级。
proguard.conf文件内容如下:
#只进行混淆提高速度
-dontshrink
-dontoptimize
-dontpreverify
#输出生成信息
-verbose
#混淆时应用侵入式重载
-overloadaggressively
#确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
-libraryjars 'D:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar'
-libraryjars lib\HdrHistogram-2.1.6.jar
-libraryjars lib\activation-1.1.jar
-libraryjars lib\apacheds-i18n-2.0.0-M15.jar
-libraryjars lib\apacheds-kerberos-codec-2.0.0-M15.jar
-libraryjars lib\api-asn1-api-1.0.0-M20.jar
-libraryjars lib\api-util-1.0.0-M20.jar
-libraryjars lib\asm-3.1.jar
-libraryjars lib\avro-1.7.4.jar
-libraryjars lib\com.ai.aus.counter-1.0.2.jar
-libraryjars lib\com.ai.aus.dataprocess.comm-1.1.0.jar
-libraryjars lib\com.ai.common.environmentvar-1.0.0.jar
-libraryjars lib\com.ai.common.warning-1.1.1.jar
-libraryjars lib\commons-beanutils-1.8.0.jar
-libraryjars lib\commons-cli-1.2.jar
-libraryjars lib\commons-codec-1.4.jar
-libraryjars lib\commons-collections-3.2.1.jar
-libraryjars lib\commons-compress-1.4.1.jar
-libraryjars lib\commons-configuration-1.9.jar
-libraryjars lib\commons-daemon-1.0.13.jar
-libraryjars lib\commons-el-1.0.jar
-libraryjars lib\commons-httpclient-3.1.jar
-libraryjars lib\commons-io-2.4.jar
-libraryjars lib\commons-lang-2.3.jar
-libraryjars lib\commons-lang3-3.5.jar
-libraryjars lib\commons-logging-1.1.1.jar
-libraryjars lib\commons-math3-3.1.1.jar
-libraryjars lib\commons-net-3.1.jar
-libraryjars lib\compiler-0.9.3.jar
-libraryjars lib\elasticsearch-5.0.0.jar
-libraryjars lib\ezmorph-1.0.6.jar
-libraryjars lib\guava-11.0.2.jar
-libraryjars lib\hadoop-annotations-2.5.1.jar
-libraryjars lib\hadoop-auth-2.5.1.jar
-libraryjars lib\hadoop-client-2.5.1.jar
-libraryjars lib\hadoop-common-2.5.1.jar
-libraryjars lib\hadoop-hdfs-2.5.1.jar
-libraryjars lib\hadoop-mapreduce-client-app-2.5.1.jar
-libraryjars lib\hadoop-mapreduce-client-common-2.5.1.jar
-libraryjars lib\hadoop-mapreduce-client-core-2.5.1.jar
-libraryjars lib\hadoop-mapreduce-client-jobclient-2.5.1.jar
-libraryjars lib\hadoop-mapreduce-client-shuffle-2.5.1.jar
-libraryjars lib\hadoop-yarn-api-2.5.1.jar
-libraryjars lib\hadoop-yarn-client-2.5.1.jar
-libraryjars lib\hadoop-yarn-common-2.5.1.jar
-libraryjars lib\hadoop-yarn-server-common-2.5.1.jar
-libraryjars lib\hppc-0.7.1.jar
-libraryjars lib\httpasyncclient-4.1.2.jar
-libraryjars lib\httpclient-4.2.5.jar
-libraryjars lib\httpcore-4.2.4.jar
-libraryjars lib\httpcore-nio-4.4.5.jar
-libraryjars lib\jackson-core-2.8.1.jar
-libraryjars lib\jackson-core-asl-1.9.13.jar
-libraryjars lib\jackson-dataformat-cbor-2.8.1.jar
-libraryjars lib\jackson-dataformat-smile-2.8.1.jar
-libraryjars lib\jackson-dataformat-yaml-2.8.1.jar
-libraryjars lib\jackson-jaxrs-1.9.13.jar
-libraryjars lib\jackson-mapper-asl-1.9.13.jar
-libraryjars lib\jackson-xc-1.9.13.jar
-libraryjars lib\jasper-runtime-5.5.23.jar
-libraryjars lib\jaxb-api-2.2.2.jar
-libraryjars lib\jdk.tools-1.8.jar
-libraryjars lib\jersey-client-1.9.jar
-libraryjars lib\jersey-core-1.9.jar
-libraryjars lib\jersey-server-1.9.jar
-libraryjars lib\jetty-6.1.26.jar
-libraryjars lib\jetty-util-6.1.26.jar
-libraryjars lib\jline-0.9.94.jar
-libraryjars lib\jna-4.2.2.jar
-libraryjars lib\joda-convert-1.2.jar
-libraryjars lib\joda-time-2.9.4.jar
-libraryjars lib\jopt-simple-5.0.2.jar
-libraryjars lib\json-lib-jdk15-2.4.jar
-libraryjars lib\jsp-api-2.1.jar
-libraryjars lib\jsr305-1.3.9.jar
-libraryjars lib\junit-3.8.1.jar
-libraryjars lib\lang-mustache-client-5.0.0.jar
-libraryjars lib\leveldbjni-all-1.8.jar
-libraryjars lib\log4j-1.2.17.jar
-libraryjars lib\log4j-api-2.7.jar
-libraryjars lib\log4j-core-2.7.jar
-libraryjars lib\log4j-over-slf4j-1.7.5.jar
-libraryjars lib\lucene-analyzers-common-6.2.0.jar
-libraryjars lib\lucene-backward-codecs-6.2.0.jar
-libraryjars lib\lucene-core-6.2.0.jar
-libraryjars lib\lucene-grouping-6.2.0.jar
-libraryjars lib\lucene-highlighter-6.2.0.jar
-libraryjars lib\lucene-join-6.2.0.jar
-libraryjars lib\lucene-memory-6.2.0.jar
-libraryjars lib\lucene-misc-6.2.0.jar
-libraryjars lib\lucene-queries-6.2.0.jar
-libraryjars lib\lucene-queryparser-6.2.0.jar
-libraryjars lib\lucene-sandbox-6.2.0.jar
-libraryjars lib\lucene-spatial-6.2.0.jar
-libraryjars lib\lucene-spatial-extras-6.2.0.jar
-libraryjars lib\lucene-spatial3d-6.2.0.jar
-libraryjars lib\lucene-suggest-6.2.0.jar
-libraryjars lib\netty-3.6.2.Final.jar
-libraryjars lib\netty-buffer-4.1.5.Final.jar
-libraryjars lib\netty-codec-4.1.5.Final.jar
-libraryjars lib\netty-codec-http-4.1.5.Final.jar
-libraryjars lib\netty-common-4.1.5.Final.jar
-libraryjars lib\netty-handler-4.1.5.Final.jar
-libraryjars lib\netty-resolver-4.1.5.Final.jar
-libraryjars lib\netty-transport-4.1.5.Final.jar
-libraryjars lib\org.apache.servicemix.bundles.commons-codec-1.3_2.jar
-libraryjars lib\org.apache.servicemix.bundles.commons-httpclient-3.1_7.jar
-libraryjars lib\paranamer-2.3.jar
-libraryjars lib\percolator-client-5.0.0.jar
-libraryjars lib\protobuf-java-2.5.0.jar
-libraryjars lib\reindex-client-5.0.0.jar
-libraryjars lib\rest-5.0.0.jar
-libraryjars lib\securesm-1.1.jar
-libraryjars lib\servlet-api-2.5.jar
-libraryjars lib\slf4j-api-1.7.5.jar
-libraryjars lib\slf4j-log4j12-1.7.5.jar
-libraryjars lib\snakeyaml-1.15.jar
-libraryjars lib\snappy-java-1.0.4.1.jar
-libraryjars lib\solr-solrj-6.0.0.jar
-libraryjars lib\stax-api-1.0-2.jar
-libraryjars lib\t-digest-3.0.jar
-libraryjars lib\transport-5.0.0.jar
-libraryjars lib\transport-netty3-client-5.0.0.jar
-libraryjars lib\transport-netty4-client-5.0.0.jar
-libraryjars lib\xmlenc-0.52.jar
-libraryjars lib\xz-1.0.jar
-libraryjars lib\zookeeper-3.4.6.jar
#忽视告警
#-ignorewarnings
#不告警不混淆一下类,不然有告警进行不下去
-dontwarn org.**
-keep class org.**{*;}
-dontwarn org.codehaus.jackson.map.**
-keep class org.codehaus.jackson.map.**{*;}
-dontwarn com.fasterxml.**
-keep class com.fasterxml.**{*;}
-dontwarn io.**
-keep class io.**{*;}
-dontwarn groovy.**
-keep class groovy.**{*;}
-dontwarn junit.**
-keep class junit.**{*;}
-dontwarn nu.xom.**
-keep class nu.xom.**{*;}
-dontwarn java.**
-keep class java.**{*;}
-dontwarn javax.**
-keep class javax.**{*;}
-dontwarn com.sun.**
-keep class com.sun.**{*;}
-dontwarn com.github.**
-keep class com.github.**{*;}
-dontwarn com.ai.aus.dataprocess.plugin.readToHdfs.*
-keep public class com.ai.aus.dataprocess.plugin.readToHdfs.conf.*{*;}
-keepclassmembers public class com.ai.aus.dataprocess.plugin.readToHdfs.ReadToHDFSComponent
-dontnote javax.*
-dontnote org.*
-dontnote io.*
-dontnote sun.*
-dontnote com.sun.*
#混淆时候保存源文件名 行和注解信息异常好调试
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*
#打印混淆信息
#-printmapping proguardMapping.txt
# 枚举类不能被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
ProGuard命令对Jar进行混淆
ProGuard 可以下载它的工具,利用proguardgui.bat 或proguardgui.sh来启动界面,利用界面的方式对jar进行混淆。
1、启动界面后如下
可以加载配置文件,也可以按照步骤生成配置文件
2、添加输入的Jar和输出的Jar和依赖的jar
说明:对于maven,可以通过maven build.. 弹出界面,Goals中输入dependency:copy-dependencies -DoutputDirectory=lib 如下,这样可以导出所有依赖的Jar到lib下面,然后就可以在上图中下面的Add位置添加所有依赖Jar了。
3 勾选shrink为进行压缩
Keep 勾选Application则说明保留带有main方法的在压缩和混淆阶段保留。
右下角的add可以设置你保留的类:
4 混淆
1)需要混淆
2)混淆输出映射文件
3)保留文件行异常等信息,便于在异常时候查问题。
4)保留特定的类的特定方法不混淆
5、优化
未进行JVM指令优化,此处未勾选
6、输出
1)未进行校验。
2)输出为jdk1.8版本。
7、执行
1)可以查看自动生成的配置文件
2)可以保存配置文件
3)可以执行本次配置进行混淆
生成配置文件格式和我刚才在maven中自己写的非常类似。
比较
1)maven插件形式: 优点是不需要单独的步骤在maven install同时就进行混淆了;缺点:需要更改pom.xml文件;生成速度很慢,慢的需要4-5分钟,只进行混淆也需要2-3分钟。
2)界面形式:优点不破坏原来的pom.xml文件结构;缺点:每个都需要在编译生成好原始jar后单独操作。
参考
Java1.8版本问题:http://blog.csdn.net/testcs_dn/article/details/45623211
配置信息放maven:http://blog.csdn.net/pltuyuhong/article/details/50971734
ProGuard界面:http://blog.csdn.net/aloh_a/article/details/50942751
配置文件说明:https://www.guardsquare.com/en/proguard/manual/usage#classspecification
导出maven的jar:http://blog.csdn.net/tterminator/article/details/53502745
proGuard 说明: http://www.cnblogs.com/cr330326/p/5534915.html
http://blog.csdn.net/zhangdaiscott/article/details/45368261
工具
proguard5.3.3.zip
jd-gui-windows-1.4.0.zip
遇到问题
1、自动生成依赖jar
pom工程最好用
dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile
生成依赖的jar不然有一堆没有引用的错误,
另外在操作时候把pom的依赖改成compile,如果不改的话,可能会漏生成jar。
2、Unhandled error
java.lang.VerifyError: Expecting a stackmap frame at branch target 84
如果遇到这个错误,请对生成的文件进行预校验,不预校验可能会有这类错误。
3、Exception in thread "main" java.lang.ClassFormatError: LVTT entry for 'list'
有时候是优化引起的,尽量在混淆jar的时候不优化不压缩。