当前位置:   article > 正文

springboot防止反编译proguard+xjar

springboot防止反编译

一、背景

项目组核心代码模块部署于用户服务器上,直接甩jar包到服务器的方式,极有可能导致数据泄露和代码泄露,为了防止有技术能力的用户反编译我们的程序,采用了proguard和xjar两种方式来混淆和加密jar包,注:加密技术只是提高别人获取你的代码的门槛,没有绝对安全的加密方式,而安全等级越高,程序开发、运维、部署的成本就越高,所以,合适的加密技术就是最好的。

二、简介

1. ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android开发用于混淆最终的项目,增加项目被反编译的难度。
2. Xjar

  • Spring Boot JAR 安全加密运行工具, 同时支持的原生JAR
  • 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案, 避免源码泄露以及反编译.

功能特性

  • 无代码侵入, 只需要把编译好的JAR包通过工具加密即可.
  • 完全内存解密, 降低源码以及字节码泄露或反编译的风险.
  • 支持所有JDK内置加解密算法.
  • 可选择需要加解密的字节码或其他资源文件.
  • 支持Maven插件, 加密更加便捷.
  • 动态生成Go启动器, 保护密码不泄露.

3.ClassFinal是一款Java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework,可避免源码泄漏或字节码被反编译,

功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。

三、预研了classfinal

classfinal其实也可以起到代码加密的效果,功能也很强大,被classfinal加密过后的jar包,反编译了以后,方法返回值会return null或者0,方法内部会自动去掉。并且用classfinal加密过后的jar包启动方式需要用javaagnet启动。而相比较xjar,反编译以后,反编译后,直接显示Internal Error.

1.module pom文件引入

  1. <plugin>
  2. <groupId>net.roseboy</groupId>
  3. <artifactId>classfinal-maven-plugin</artifactId>
  4. <version>1.2.1</version>
  5. <configuration>
  6. <password>#</password><!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 -->
  7. <packages>com.nick.gnss</packages><!-- 加密的包名,多个包用逗号分开-->
  8. <excludes>org.spring</excludes>
  9. </configuration>
  10. <executions>
  11. <execution>
  12. <phase>package</phase>
  13. <goals>
  14. <goal>classFinal</goal>
  15. </goals>
  16. </execution>
  17. </executions>
  18. </plugin>

2.启动方式

1)无密码启动

java -jar gnss-server-1.0.0-encrypted.jar

2)有密码启动

java -javaagent:gnss-server-1.0.0-encrypted.jar="-pwd 123456" -jar gnss-server-1.0.0-encrypted.jar

3.反编译后的效果

所有的方法,return 0 或者 null. 方法体内部是空的。

四、引入proguard混淆

1.module中增加proguard.cfg文件

  1. #指定Java的版本
  2. -target 1.8
  3. #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
  4. -dontshrink
  5. #是否关闭字节码级别的优化,如果不开启则设置如下配置
  6. -dontoptimize
  7. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  8. -dontusemixedcaseclassnames
  9. # 对于类成员的命名的混淆采取唯一策略
  10. -useuniqueclassmembernames
  11. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  12. -dontusemixedcaseclassnames
  13. #混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
  14. -adaptclassstrings
  15. #对异常、注解信息予以保留
  16. -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
  17. # 此选项将保存接口中的所有原始名称(不混淆)-->
  18. -keepnames interface ** { *; }
  19. # 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
  20. #-keep interface * extends * { *; }
  21. #保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
  22. -keepparameternames
  23. # 保留枚举成员及方法
  24. -keepclassmembers enum * { *; }
  25. # 不混淆所有的set/get方法
  26. -keepclassmembers public class * {void set*(***);*** get*();}
  27. # 不混淆所有包含Component等注解的类
  28. -keep @org.springframework.context.annotation.Bean class * {*;}
  29. -keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
  30. -keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
  31. -keep @org.springframework.stereotype.Service class * {*;}
  32. -keep @org.springframework.stereotype.Component class * {*;}
  33. -keep @org.springframework.web.bind.annotation.RestController class * {*;}
  34. -keep @org.springframework.context.annotation.Configuration class * {*;}
  35. #忽略warn消息
  36. -ignorewarnings
  37. #忽略note消息
  38. -dontnote
  39. #打印配置信息
  40. -printconfiguration
  41. #启动类不需要混淆
  42. -keep class com.nick.GnssApplication {
  43. public static void main(java.lang.String[]);
  44. }

2.module pom文件引入

此处需要注意,proguard plugin需要放在repackage plugin之前,否则混淆没有效果。原理就是在打包之前将代码混淆,然后再打包。

  1. <!--代码混淆proguard-->
  2. <plugin>
  3. <groupId>com.github.wvengen</groupId>
  4. <artifactId>proguard-maven-plugin</artifactId>
  5. <version>2.6.0</version>
  6. <executions>
  7. <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
  8. <execution>
  9. <phase>package</phase>
  10. <goals>
  11. <goal>proguard</goal>
  12. </goals>
  13. </execution>
  14. </executions>
  15. <configuration>
  16. <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
  17. <injar>${project.build.finalName}.jar</injar>
  18. <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
  19. <outjar>${project.build.finalName}.jar</outjar>
  20. <!-- 是否混淆 默认是true -->
  21. <obfuscate>true</obfuscate>
  22. <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
  23. <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
  24. <!-- 额外的jar包,通常是项目编译所需要的jar -->
  25. <libs>
  26. <lib>${java.home}/lib/rt.jar</lib>
  27. <lib>${java.home}/lib/jce.jar</lib>
  28. <lib>${java.home}/lib/jsse.jar</lib>
  29. </libs>
  30. <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
  31. <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
  32. <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
  33. <outputDirectory>${project.basedir}/target</outputDirectory>
  34. <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
  35. <options>
  36. <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
  37. </options>
  38. </configuration>
  39. </plugin>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. <version>2.3.7.RELEASE</version>
  44. <configuration>
  45. <mainClass>com.nick.GnssApplication</mainClass>
  46. </configuration>
  47. <executions>
  48. <execution>
  49. <id>repackage</id>
  50. <goals>
  51. <goal>repackage</goal>
  52. </goals>
  53. </execution>
  54. </executions>
  55. </plugin>

3.反编译看效果

查看xxx.jar是否有混淆的效果,而不是xxx_proguard_base.jar(此jar是没有混淆的原jar)

 效果杠杠滴!!!需要试运行,并且注意配置proguard,否则会导致程序运行异常,这可能就是proguard的唯一缺点了吧,欢迎拍砖。。。

 4.运行查看效果

启动成功,没毛病

 五、引入xjar

1.parent pom文件引入

重点在最下面的xjar plugin

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.nick</groupId>
  6. <artifactId>nick-server</artifactId>
  7. <version>1.0.0</version>
  8. <name>nick-server</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. </properties>
  16. <modules>
  17. <module>gnss-server</module>
  18. </modules>
  19. <packaging>pom</packaging>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. <exclusions>
  30. <exclusion>
  31. <groupId>org.junit.vintage</groupId>
  32. <artifactId>junit-vintage-engine</artifactId>
  33. </exclusion>
  34. </exclusions>
  35. </dependency>
  36. </dependencies>
  37. <dependencyManagement>
  38. <dependencies>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-dependencies</artifactId>
  42. <version>${spring-boot.version}</version>
  43. <type>pom</type>
  44. <scope>import</scope>
  45. </dependency>
  46. </dependencies>
  47. </dependencyManagement>
  48. <build>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.apache.maven.plugins</groupId>
  52. <artifactId>maven-compiler-plugin</artifactId>
  53. <version>3.8.1</version>
  54. <configuration>
  55. <source>1.8</source>
  56. <target>1.8</target>
  57. <encoding>UTF-8</encoding>
  58. </configuration>
  59. </plugin>
  60. <!--代码加密-->
  61. <plugin>
  62. <groupId>com.github.core-lib</groupId>
  63. <artifactId>xjar-maven-plugin</artifactId>
  64. <version>v2.0.7</version>
  65. <executions>
  66. <execution>
  67. <goals>
  68. <goal>build</goal>
  69. </goals>
  70. <phase>package</phase>
  71. <configuration>
  72. <password>44889951235894612351265ABD123</password>
  73. <mode>1</mode>
  74. <sourceDir>${project.build.directory}</sourceDir>
  75. <targetJar>${project.build.finalName}_x.jar</targetJar>
  76. <includes>
  77. <include>com/nick/**</include>
  78. </includes>
  79. </configuration>
  80. </execution>
  81. </executions>
  82. </plugin>
  83. </plugins>
  84. </build>
  85. </project>

2. module pom文件引入

需要放在module pom文件plugin 最后一个,保证xjar是最后一个执行plugin

  1. <!--代码加密xjar-->
  2. <plugin>
  3. <groupId>com.github.core-lib</groupId>
  4. <artifactId>xjar-maven-plugin</artifactId>
  5. </plugin>

3.编译打包

4.反编译看效果

效果杠杠滴

 5.运行查看效果

六、proguard + xjar

将第四步和第五步融合即可,但是要注意pom文件中的plugin的先后问题,不然要么混淆失败,要么加密失败。

1.完整版的parent pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.nick</groupId>
  6. <artifactId>nick-server</artifactId>
  7. <version>1.0.0</version>
  8. <name>nick-server</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. </properties>
  16. <modules>
  17. <module>gnss-server</module>
  18. </modules>
  19. <packaging>pom</packaging>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. <exclusions>
  30. <exclusion>
  31. <groupId>org.junit.vintage</groupId>
  32. <artifactId>junit-vintage-engine</artifactId>
  33. </exclusion>
  34. </exclusions>
  35. </dependency>
  36. </dependencies>
  37. <dependencyManagement>
  38. <dependencies>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-dependencies</artifactId>
  42. <version>${spring-boot.version}</version>
  43. <type>pom</type>
  44. <scope>import</scope>
  45. </dependency>
  46. </dependencies>
  47. </dependencyManagement>
  48. <build>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.apache.maven.plugins</groupId>
  52. <artifactId>maven-compiler-plugin</artifactId>
  53. <version>3.8.1</version>
  54. <configuration>
  55. <source>1.8</source>
  56. <target>1.8</target>
  57. <encoding>UTF-8</encoding>
  58. </configuration>
  59. </plugin>
  60. <!--代码加密-->
  61. <plugin>
  62. <groupId>com.github.core-lib</groupId>
  63. <artifactId>xjar-maven-plugin</artifactId>
  64. <version>v2.0.7</version>
  65. <executions>
  66. <execution>
  67. <goals>
  68. <goal>build</goal>
  69. </goals>
  70. <phase>package</phase>
  71. <configuration>
  72. <password>44889951235894612351265ABD123</password>
  73. <mode>1</mode>
  74. <sourceDir>${project.build.directory}</sourceDir>
  75. <targetJar>${project.build.finalName}_x.jar</targetJar>
  76. <includes>
  77. <include>com/nick/**</include>
  78. </includes>
  79. </configuration>
  80. </execution>
  81. </executions>
  82. </plugin>
  83. </plugins>
  84. </build>
  85. </project>

2.完整版的poguard.cfg

  1. #指定Java的版本
  2. -target 1.8
  3. #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
  4. -dontshrink
  5. #是否关闭字节码级别的优化,如果不开启则设置如下配置
  6. -dontoptimize
  7. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  8. -dontusemixedcaseclassnames
  9. # 对于类成员的命名的混淆采取唯一策略
  10. -useuniqueclassmembernames
  11. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  12. -dontusemixedcaseclassnames
  13. #混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
  14. -adaptclassstrings
  15. #对异常、注解信息予以保留
  16. -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
  17. # 此选项将保存接口中的所有原始名称(不混淆)-->
  18. -keepnames interface ** { *; }
  19. # 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
  20. #-keep interface * extends * { *; }
  21. #保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
  22. -keepparameternames
  23. # 保留枚举成员及方法
  24. -keepclassmembers enum * { *; }
  25. # 不混淆所有的set/get方法
  26. -keepclassmembers public class * {void set*(***);*** get*();}
  27. # 不混淆所有包含Component等注解的类
  28. -keep @org.springframework.context.annotation.Bean class * {*;}
  29. -keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
  30. -keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
  31. -keep @org.springframework.stereotype.Service class * {*;}
  32. -keep @org.springframework.stereotype.Component class * {*;}
  33. -keep @org.springframework.web.bind.annotation.RestController class * {*;}
  34. -keep @org.springframework.context.annotation.Configuration class * {*;}
  35. #忽略warn消息
  36. -ignorewarnings
  37. #忽略note消息
  38. -dontnote
  39. #打印配置信息
  40. -printconfiguration
  41. #启动类不需要混淆
  42. -keep class com.nick.GnssApplication {
  43. public static void main(java.lang.String[]);
  44. }

3.完整版的module pom文件

该pom文件中注意两点 1)引入parent节点  2)需要放在最后一个plugin执行

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>nick-server</artifactId>
  6. <groupId>com.nick</groupId>
  7. <version>1.0.0</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <groupId>com.nick</groupId>
  11. <artifactId>gnss-server</artifactId>
  12. <version>1.0.0</version>
  13. <name>gnss-server</name>
  14. <description>gnss-server</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  20. <!--maven.build.timestamp保存了maven编译时间戳-->
  21. <!--在Maven 3.2.2+中, maven.build.timestamp已被重新定义,显示UTC中的时间,比中国时间慢8个小时-->
  22. <timestamp>${maven.build.timestamp}</timestamp>
  23. <!--指定时间格式-->
  24. <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-test</artifactId>
  34. <scope>test</scope>
  35. <exclusions>
  36. <exclusion>
  37. <groupId>org.junit.vintage</groupId>
  38. <artifactId>junit-vintage-engine</artifactId>
  39. </exclusion>
  40. </exclusions>
  41. </dependency>
  42. <dependency>
  43. <groupId>io.jsonwebtoken</groupId>
  44. <artifactId>jjwt</artifactId>
  45. <version>0.9.1</version>
  46. </dependency>
  47. <!-- lombok -->
  48. <dependency>
  49. <groupId>org.projectlombok</groupId>
  50. <artifactId>lombok</artifactId>
  51. <version>1.18.16</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>commons-io</groupId>
  55. <artifactId>commons-io</artifactId>
  56. <version>2.6</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>com.alibaba</groupId>
  60. <artifactId>fastjson</artifactId>
  61. <!--1.2.80以下存在安全漏洞-->
  62. <!--<version>1.2.78</version>-->
  63. <version>1.2.83</version>
  64. </dependency>
  65. <dependency>
  66. <groupId>com.google.guava</groupId>
  67. <artifactId>guava</artifactId>
  68. <version>30.1.1-jre</version>
  69. </dependency>
  70. <!--nacos-web-->
  71. <dependency>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-starter-web</artifactId>
  74. </dependency>
  75. </dependencies>
  76. <dependencyManagement>
  77. <dependencies>
  78. <dependency>
  79. <groupId>org.springframework.boot</groupId>
  80. <artifactId>spring-boot-dependencies</artifactId>
  81. <version>${spring-boot.version}</version>
  82. <type>pom</type>
  83. <scope>import</scope>
  84. </dependency>
  85. </dependencies>
  86. </dependencyManagement>
  87. <build>
  88. <plugins>
  89. <plugin>
  90. <groupId>org.apache.maven.plugins</groupId>
  91. <artifactId>maven-compiler-plugin</artifactId>
  92. <version>3.8.1</version>
  93. <configuration>
  94. <source>1.8</source>
  95. <target>1.8</target>
  96. <encoding>UTF-8</encoding>
  97. </configuration>
  98. </plugin>
  99. <plugin>
  100. <groupId>org.apache.maven.plugins</groupId>
  101. <artifactId>maven-resources-plugin</artifactId>
  102. <configuration>
  103. <delimiters>
  104. <delimiter>@</delimiter>
  105. </delimiters>
  106. <useDefaultDelimiters>false</useDefaultDelimiters>
  107. </configuration>
  108. </plugin>
  109. <!--代码混淆proguard-->
  110. <plugin>
  111. <groupId>com.github.wvengen</groupId>
  112. <artifactId>proguard-maven-plugin</artifactId>
  113. <version>2.6.0</version>
  114. <executions>
  115. <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
  116. <execution>
  117. <phase>package</phase>
  118. <goals>
  119. <goal>proguard</goal>
  120. </goals>
  121. </execution>
  122. </executions>
  123. <configuration>
  124. <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
  125. <injar>${project.build.finalName}.jar</injar>
  126. <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
  127. <outjar>${project.build.finalName}.jar</outjar>
  128. <!-- 是否混淆 默认是true -->
  129. <obfuscate>true</obfuscate>
  130. <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
  131. <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
  132. <!-- 额外的jar包,通常是项目编译所需要的jar -->
  133. <libs>
  134. <lib>${java.home}/lib/rt.jar</lib>
  135. <lib>${java.home}/lib/jce.jar</lib>
  136. <lib>${java.home}/lib/jsse.jar</lib>
  137. </libs>
  138. <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
  139. <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
  140. <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
  141. <outputDirectory>${project.basedir}/target</outputDirectory>
  142. <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
  143. <options>
  144. <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
  145. </options>
  146. </configuration>
  147. </plugin>
  148. <plugin>
  149. <groupId>org.springframework.boot</groupId>
  150. <artifactId>spring-boot-maven-plugin</artifactId>
  151. <version>2.3.7.RELEASE</version>
  152. <configuration>
  153. <mainClass>com.nick.GnssApplication</mainClass>
  154. </configuration>
  155. <executions>
  156. <execution>
  157. <id>repackage</id>
  158. <goals>
  159. <goal>repackage</goal>
  160. </goals>
  161. </execution>
  162. </executions>
  163. </plugin>
  164. <!--代码加密xjar-->
  165. <plugin>
  166. <groupId>com.github.core-lib</groupId>
  167. <artifactId>xjar-maven-plugin</artifactId>
  168. </plugin>
  169. <!--classfinal加密程序-->
  170. <!--<plugin>-->
  171. <!--<groupId>net.roseboy</groupId>-->
  172. <!--<artifactId>classfinal-maven-plugin</artifactId>-->
  173. <!--<version>1.2.1</version>-->
  174. <!--<configuration>-->
  175. <!--<password>#</password>&lt;!&ndash; #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 &ndash;&gt;-->
  176. <!--<packages>com.nick.gnss</packages>&lt;!&ndash; 加密的包名,多个包用逗号分开&ndash;&gt;-->
  177. <!--<excludes>org.spring</excludes>-->
  178. <!--</configuration>-->
  179. <!--<executions>-->
  180. <!--<execution>-->
  181. <!--<phase>package</phase>-->
  182. <!--<goals>-->
  183. <!--<goal>classFinal</goal>-->
  184. <!--</goals>-->
  185. <!--</execution>-->
  186. <!--</executions>-->
  187. <!--</plugin>-->
  188. </plugins>
  189. <resources>
  190. <resource>
  191. <directory>src/main/resources</directory>
  192. <filtering>true</filtering>
  193. </resource>
  194. </resources>
  195. </build>
  196. </project>

4.打包编译

5.反编译查看效果

 OK, 效果杠杠滴,混淆+加密。

至此,混淆+加密搞定。

花了蛮多时间测试验证,兄弟们觉得疗效好,望不吝点赞啊,也欢迎各种拍砖,哈哈~~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/483358
推荐阅读
相关标签
  

闽ICP备14008679号