一 简介
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>
说明: ${basedir}/proguard.conf引用外部的配置文件,配置文件和 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 进行混淆。
3.1、启动界面后如下
可以加载配置文件,也可以按照步骤生成配置文件
3.2 添加输入的 Jar 和输出的 Jar 和依赖的 jar
说明:
对于 maven,可以通过 maven build.. 弹出界面,Goals 中输入 dependency:copy-dependencies -DoutputDirectory=lib 如下,这样可以导出所有依赖的 Jar 到 lib 下面,然后就可以在上图中下面的 Add 位置添加所有依赖 Jar 了。
3.3 勾选 shrink 为进行压缩
Keep 勾选 Application 则说明保留带有 main 方法的在压缩和混淆阶段保留。右下角的 add 可以设置你保留的类:
3.4 混淆
1)需要混淆
2)混淆输出映射文件
3)保留文件行异常等信息,便于在异常时候查问题 4)保留特定的类的特定方法不混淆
3.5 优化
未进行 JVM 指令优化,此处未勾选
3.6 输出
1)未进行校验。2)输出为 jdk1.8 版本。
3.7 执行
1)可以查看自动生成的配置文件 2)可以保存配置文件 3)可以执行本次配置进行混淆
生成配置文件格式和我刚才在 maven 中自己写的非常类似。
四 比较
maven 插件形式:
优点: 是不需要单独的步骤在 maven install 同时就进行混淆了;
缺点: 需要更改 pom.xml 文件;生成速度很慢,慢的需要 4-5 分钟,只进行混淆也需要 2-3 分钟。界面形式:
优点: 不破坏原来的 pom.xml 文件结构;
缺点: 每个都需要在编译生成好原始 jar 后单独操作。
五 工具
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 的时候不优化不压缩。
七 参考
Java1.8 版本问题:http://blog.csdn.net/testcs_dn/article/details/45623211配置信息放 maven:http://blog.csdn.net/pltuyuhong/article/details/50971734ProGuard 界面: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/53502745proGuard 说明: http://www.cnblogs.com/cr330326/p/5534915.htmlhttp://blog.csdn.net/zhangdaiscott/article/details/45368261
八诗词欣赏
对酒
[近代] 秋瑾
不惜千金买宝刀,貂裘换酒也堪豪。
一腔热血勤珍重,洒去犹能化碧涛。