Java 代码很容易被反编译,为了防止代码被反编译,需要对 Java 代码进行混淆,比如用 a,b ,c 等变量名代替有意义的变量名。ProGuard 是开源的混淆 Java 的工具,可以通过 proguardgui 来单独混淆 Jar,也可以通过集成到 maven 中自动混淆 Java 代码。ProGuard 具有以下四个功能:
1、压缩(Shrink):检测并移除无用的类、字段、方法和属性。
2、优化 (Optimize):对字节码进行优化,移除无用指令。
3、混淆(obfuscate):对类、方法、变量、属性进行重命名。
4、预检(preverify):对 Java 代码进行预检,以确保代码可以执行。
Proguard 的配置可以完全放在 maven 的 l 配置文件里面,也可以作为单独的文件引用,为了更清晰期间我做成外部文件形式。
<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><transformerimplementation="org.apache.maven.source.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}/f</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}/f引用外部的配置文件,配置文件和 l 在目录处于平级。f 文件内容如下:
#只进行混淆提高速度
-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.unter-1.0.2.jar
-libraryjars libcom.ai.aus.dataprocessm-1.1.0.jar
-libraryjars libvironmentvar-1.0.0.jar
-libraryjars libcom.aimon.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 ls-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.bundlesmons-codec-1.3_2.jar
-libraryjars liborg.apache.servicemix.bundlesmons-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 dehaus.jackson.map.**
-keep class dehaus.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.adToHdfs.*
-keep public class com.ai.aus.f.*{*;}
-keepclassmembers public class com.ai.aus.adToHdfs.ReadToHDFSComponent
-dontnote javax.*
-dontnote org.*
-dontnote io.*
-dontnote sun.*
-dontnote com.sun.*#混淆时候保存源文件名 行和注解信息异常好调试
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*
#打印混淆信息
#-printmapping
# 枚举类不能被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
ProGuard 可以下载它的工具,利用 proguardgui.bat 或 proguardgui.sh 来启动界面,利用界面的方式对 jar 进行混淆。
可以加载配置文件,也可以按照步骤生成配置文件
说明:
对于 maven,可以通过 maven build.. 弹出界面,Goals 中输入 dependency:copy-dependencies -DoutputDirectory=lib 如下,这样可以导出所有依赖的 Jar 到 lib 下面,然后就可以在上图中下面的 Add 位置添加所有依赖 Jar 了。
Keep 勾选 Application 则说明保留带有 main 方法的在压缩和混淆阶段保留。右下角的 add 可以设置你保留的类:
1)需要混淆
2)混淆输出映射文件
3)保留文件行异常等信息,便于在异常时候查问题 4)保留特定的类的特定方法不混淆
未进行 JVM 指令优化,此处未勾选
1)未进行校验。2)输出为 jdk1.8 版本。
1)可以查看自动生成的配置文件 2)可以保存配置文件 3)可以执行本次配置进行混淆
生成配置文件格式和我刚才在 maven 中自己写的非常类似。
maven 插件形式:
优点: 是不需要单独的步骤在 maven install 同时就进行混淆了;
缺点: 需要更改 l 文件;生成速度很慢,慢的需要 4-5 分钟,只进行混淆也需要 2-3 分钟。
界面形式:
优点: 不破坏原来的 l 文件结构;
缺点: 每个都需要在编译生成好原始 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 版本问题: maven: 界面:: maven 的 jar: 说明: .html
对酒
[近代] 秋瑾
不惜千金买宝刀,貂裘换酒也堪豪。
一腔热血勤珍重,洒去犹能化碧涛。
本文发布于:2024-01-27 22:51:55,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063671163126.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |