ProGuard使用简要介绍

2019-07-06 08:28 来源:未知

  去官方网站下载,解压后,得到的lib包里有三个jar包文件,其中一个proguardgui.jar,是图形界面程序。

简介

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

图片 1

image.png

1、压缩(Shrink):检测并移除无用的类、字段、方法和属性。
2、优化 (Optimize):对字节码进行优化,移除无用指令。
3、混淆(obfuscate):对类、方法、变量、属性进行重命名。
4、预检(preverify):对Java代码进行预检,以确保代码可以执行。

  运行方法:在同样的目录中,建一个批处理文件(bat文件),内容就一句:java -jar proguardgui.jar,保存文件,双击鼠标运行这个文件,图形界面就出现了。

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 FilesJavajdk1.8.0_91jrelibrt.jar'
-libraryjars libHdrHistogram-2.1.6.jar
-libraryjars libactivation-1.1.jar
-libraryjars libapacheds-i18n-2.0.0-M15.jar
-libraryjars libapacheds-kerberos-codec-2.0.0-M15.jar
-libraryjars libapi-asn1-api-1.0.0-M20.jar
-libraryjars libapi-util-1.0.0-M20.jar
-libraryjars libasm-3.1.jar
-libraryjars libavro-1.7.4.jar
-libraryjars libcom.ai.aus.counter-1.0.2.jar
-libraryjars libcom.ai.aus.dataprocess.comm-1.1.0.jar
-libraryjars libcom.ai.common.environmentvar-1.0.0.jar
-libraryjars libcom.ai.common.warning-1.1.1.jar
-libraryjars libcommons-beanutils-1.8.0.jar
-libraryjars libcommons-cli-1.2.jar
-libraryjars libcommons-codec-1.4.jar
-libraryjars libcommons-collections-3.2.1.jar
-libraryjars libcommons-compress-1.4.1.jar
-libraryjars libcommons-configuration-1.9.jar
-libraryjars libcommons-daemon-1.0.13.jar
-libraryjars libcommons-el-1.0.jar
-libraryjars libcommons-httpclient-3.1.jar
-libraryjars libcommons-io-2.4.jar
-libraryjars libcommons-lang-2.3.jar
-libraryjars libcommons-lang3-3.5.jar
-libraryjars libcommons-logging-1.1.1.jar
-libraryjars libcommons-math3-3.1.1.jar
-libraryjars libcommons-net-3.1.jar
-libraryjars libcompiler-0.9.3.jar
-libraryjars libelasticsearch-5.0.0.jar
-libraryjars libezmorph-1.0.6.jar
-libraryjars libguava-11.0.2.jar
-libraryjars libhadoop-annotations-2.5.1.jar
-libraryjars libhadoop-auth-2.5.1.jar
-libraryjars libhadoop-client-2.5.1.jar
-libraryjars libhadoop-common-2.5.1.jar
-libraryjars libhadoop-hdfs-2.5.1.jar
-libraryjars libhadoop-mapreduce-client-app-2.5.1.jar
-libraryjars libhadoop-mapreduce-client-common-2.5.1.jar
-libraryjars libhadoop-mapreduce-client-core-2.5.1.jar
-libraryjars libhadoop-mapreduce-client-jobclient-2.5.1.jar
-libraryjars libhadoop-mapreduce-client-shuffle-2.5.1.jar
-libraryjars libhadoop-yarn-api-2.5.1.jar
-libraryjars libhadoop-yarn-client-2.5.1.jar
-libraryjars libhadoop-yarn-common-2.5.1.jar
-libraryjars libhadoop-yarn-server-common-2.5.1.jar
-libraryjars libhppc-0.7.1.jar
-libraryjars libhttpasyncclient-4.1.2.jar
-libraryjars libhttpclient-4.2.5.jar
-libraryjars libhttpcore-4.2.4.jar
-libraryjars libhttpcore-nio-4.4.5.jar
-libraryjars libjackson-core-2.8.1.jar
-libraryjars libjackson-core-asl-1.9.13.jar
-libraryjars libjackson-dataformat-cbor-2.8.1.jar
-libraryjars libjackson-dataformat-smile-2.8.1.jar
-libraryjars libjackson-dataformat-yaml-2.8.1.jar
-libraryjars libjackson-jaxrs-1.9.13.jar
-libraryjars libjackson-mapper-asl-1.9.13.jar
-libraryjars libjackson-xc-1.9.13.jar
-libraryjars libjasper-runtime-5.5.23.jar
-libraryjars libjaxb-api-2.2.2.jar
-libraryjars libjdk.tools-1.8.jar
-libraryjars libjersey-client-1.9.jar
-libraryjars libjersey-core-1.9.jar
-libraryjars libjersey-server-1.9.jar
-libraryjars libjetty-6.1.26.jar
-libraryjars libjetty-util-6.1.26.jar
-libraryjars libjline-0.9.94.jar
-libraryjars libjna-4.2.2.jar
-libraryjars libjoda-convert-1.2.jar
-libraryjars libjoda-time-2.9.4.jar
-libraryjars libjopt-simple-5.0.2.jar
-libraryjars libjson-lib-jdk15-2.4.jar
-libraryjars libjsp-api-2.1.jar
-libraryjars libjsr305-1.3.9.jar
-libraryjars libjunit-3.8.1.jar
-libraryjars liblang-mustache-client-5.0.0.jar
-libraryjars libleveldbjni-all-1.8.jar
-libraryjars liblog4j-1.2.17.jar
-libraryjars liblog4j-api-2.7.jar
-libraryjars liblog4j-core-2.7.jar
-libraryjars liblog4j-over-slf4j-1.7.5.jar
-libraryjars liblucene-analyzers-common-6.2.0.jar
-libraryjars liblucene-backward-codecs-6.2.0.jar
-libraryjars liblucene-core-6.2.0.jar
-libraryjars liblucene-grouping-6.2.0.jar
-libraryjars liblucene-highlighter-6.2.0.jar
-libraryjars liblucene-join-6.2.0.jar
-libraryjars liblucene-memory-6.2.0.jar
-libraryjars liblucene-misc-6.2.0.jar
-libraryjars liblucene-queries-6.2.0.jar
-libraryjars liblucene-queryparser-6.2.0.jar
-libraryjars liblucene-sandbox-6.2.0.jar
-libraryjars liblucene-spatial-6.2.0.jar
-libraryjars liblucene-spatial-extras-6.2.0.jar
-libraryjars liblucene-spatial3d-6.2.0.jar
-libraryjars liblucene-suggest-6.2.0.jar
-libraryjars libnetty-3.6.2.Final.jar
-libraryjars libnetty-buffer-4.1.5.Final.jar
-libraryjars libnetty-codec-4.1.5.Final.jar
-libraryjars libnetty-codec-http-4.1.5.Final.jar
-libraryjars libnetty-common-4.1.5.Final.jar
-libraryjars libnetty-handler-4.1.5.Final.jar
-libraryjars libnetty-resolver-4.1.5.Final.jar
-libraryjars libnetty-transport-4.1.5.Final.jar
-libraryjars liborg.apache.servicemix.bundles.commons-codec-1.3_2.jar
-libraryjars liborg.apache.servicemix.bundles.commons-httpclient-3.1_7.jar
-libraryjars libparanamer-2.3.jar
-libraryjars libpercolator-client-5.0.0.jar
-libraryjars libprotobuf-java-2.5.0.jar
-libraryjars libreindex-client-5.0.0.jar
-libraryjars librest-5.0.0.jar
-libraryjars libsecuresm-1.1.jar
-libraryjars libservlet-api-2.5.jar
-libraryjars libslf4j-api-1.7.5.jar
-libraryjars libslf4j-log4j12-1.7.5.jar
-libraryjars libsnakeyaml-1.15.jar
-libraryjars libsnappy-java-1.0.4.1.jar
-libraryjars libsolr-solrj-6.0.0.jar
-libraryjars libstax-api-1.0-2.jar
-libraryjars libt-digest-3.0.jar
-libraryjars libtransport-5.0.0.jar
-libraryjars libtransport-netty3-client-5.0.0.jar
-libraryjars libtransport-netty4-client-5.0.0.jar
-libraryjars libxmlenc-0.52.jar
-libraryjars libxz-1.0.jar
-libraryjars libzookeeper-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.在"Input/Output"页签中,设置好要混淆的jar包,设置好混淆结果包的名字,指定好编译这个包需要的jar包,注意,jar包不要同意包含接口jar包及接口的实现jar包,Proguard会个定义重复的错。

1、启动界面后如下

可以加载配置文件,也可以按照步骤生成配置文件

图片 2

开始

  2.在"Shriking"页签中,选择一个Keep的类型,如果是WEB工程,就选Library,应用程序就选Application,等。

2、添加输入的Jar和输出的Jar和依赖的jar

图片 3

image.png

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

图片 4

image.png

  3."Obfuscation"、"Optimization"页签中都选默认就可以了。有特殊要求,可以仔细研究一下文档。如果混淆结果使用程序功能不太正常,可以把Optimize选项关闭。反正我们最关心的是混淆,优化不优化无所谓。

3 勾选shrink为进行压缩

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

图片 5

image.png

  4."Information"页签中,有个Ignore warnings about possibly erronous input,如果混淆的时候,因为警告无法继续,可以把这个选项勾上。其它的选默认就可以了。

4 混淆

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

图片 6

image.png

图片 7

image.png

  5."Process"页签中,点"Process!"按钮进行混淆。也可以点"Save configuration..."按钮,保存配置文件。

5、优化

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

图片 8

image.png

  混淆结果还不错,可以使用jd等反编译工具检查一下,效果确实不错。

6、输出

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

图片 9

image.png

推荐阅读:

7、执行

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

图片 10

image.png

生成配置文件格式和我刚才在maven中自己写的非常类似。

如何混淆Android项目代码(ProGuard)防止反编译 http://www.linuxidc.com/Linux/2011-12/50571.htm

比较

1)maven插件形式: 优点是不需要单独的步骤在maven install同时就进行混淆了;缺点:需要更改pom.xml文件;生成速度很慢,慢的需要4-5分钟,只进行混淆也需要2-3分钟。
2)界面形式:优点不破坏原来的pom.xml文件结构;缺点:每个都需要在编译生成好原始jar后单独操作。

使用ProGuard需要注意的几个地方 http://www.linuxidc.com/Linux/2013-08/88156.htm

参考

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

ProGuard 的详细介绍:请点这里
ProGuard 的下载地址:请点这里

工具

proguard5.3.3.zip
jd-gui-windows-1.4.0.zip

图片 11

遇到问题

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的时候不优化不压缩。

TAG标签: 韦德娱乐1946
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于韦德国际1946官网,转载请注明出处:ProGuard使用简要介绍