ProGuard混淆Java代码

简介

Java代码很容易被反编译,为了防止代码被反编译,需要对Java代码进行混淆,比如用a,b ,c 等变量名代替有意义的变量名。ProGuard是开源的混淆Java的工具,可以通过proguardgui来单独混淆Jar,
也可以通过集成到maven中自动混淆Java代码。
ProGuard具有以下四个功能:

image.png

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

image.png

说明:对于maven,可以通过maven build.. 弹出界面,Goals中输入dependency:copy-dependencies -DoutputDirectory=lib 如下,这样可以导出所有依赖的Jar到lib下面,然后就可以在上图中下面的Add位置添加所有依赖Jar了。

image.png

3 勾选shrink为进行压缩

Keep 勾选Application则说明保留带有main方法的在压缩和混淆阶段保留。
右下角的add可以设置你保留的类:

image.png

4 混淆

1)需要混淆
2)混淆输出映射文件
3)保留文件行异常等信息,便于在异常时候查问题。
4)保留特定的类的特定方法不混淆

image.png
image.png

5、优化

未进行JVM指令优化,此处未勾选

image.png

6、输出

1)未进行校验。
2)输出为jdk1.8版本。

image.png

7、执行

1)可以查看自动生成的配置文件
2)可以保存配置文件
3)可以执行本次配置进行混淆

image.png

生成配置文件格式和我刚才在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的时候不优化不压缩。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,441评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,733评论 6 342
  • 声明 这篇文章更多的是做一个整理,内容来自于ProGuard官方文档以及各种博客等,相关文章的链接在参考目录里,感...
    夷陵小祖阅读 3,673评论 0 23
  • 富勒博士对竞争是强烈反对的,富勒博士认为竞争会造成很大的资源浪费。竞是让人进步,争是相互消耗。所以提出了“竞合”一...
    斯人Marco阅读 621评论 0 0