当前位置: 代码网 > it编程>编程语言>Java > Springboot打包代码,反编译后代码混淆方式(防止还原代码)

Springboot打包代码,反编译后代码混淆方式(防止还原代码)

2024年11月25日 Java 我要评论
前言在我们写完springboot程序后,打完jar包,放置服务器进行部署,若有人将服务器上jar包拉取下来,进行反编译,是可以还原代码的,那么我们有没有比较好的方法、方案或者措施不让反编译还原原始代

前言

在我们写完springboot程序后,打完jar包,放置服务器进行部署,若有人将服务器上jar包拉取下来,进行反编译,是可以还原代码的,那么我们有没有比较好的方法、方案或者措施不让反编译还原原始代码呢,今天我们一起研究、探讨一下jar包混淆。

一、 什么是编译

就是把代码跑一下,然后我们的代码 .java文件 就被编译成了 .class 文件。

二、什么是反编译

针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的原始代码。

比较常用的反编译工具 jd-gui ,直接把编译好的jar丢进去,大部分都能反编译看到源码:

三、混淆反编译后原始代码

代码混淆 ,是其中一种手段。

第一步, 在项目路径下,新增一份文件 proguard.cfg :

  • proguard.cfg
#指定java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用class.forname('classname')之类的地方进行相应替代
-adaptclassstrings
 
#对异常、注解信息予以保留
-keepattributes exceptions,innerclasses,signature,deprecated,sourcefile,linenumbertable,*annotation*,enclosingmethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
                        @org.springframework.context.annotation.bean *;
                        @org.springframework.beans.factory.annotation.autowired *;
                        @org.springframework.beans.factory.annotation.value *;
                        @org.springframework.stereotype.service *;
                        @org.springframework.stereotype.component *;
                        }
 
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep public class com.example.myproguarddemo.myproguarddemoapplication {
        public static void main(java.lang.string[]);
    }

第二步,在pom文件上 加入proguard 混淆插件 

  • build标签里面改动加入一下配置
 <build>
        <plugins>
            <plugin>
                <groupid>com.github.wvengen</groupid>
                <artifactid>proguard-maven-plugin</artifactid>
                <version>2.6.0</version>
                <executions>
                    <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 就是输入jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
                    <injar>${project.build.finalname}.jar</injar>
                    <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
                    <outjar>${project.build.finalname}.jar</outjar>
                    <!-- 是否混淆 默认是true -->
                    <obfuscate>true</obfuscate>
                    <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
                    <proguardinclude>${project.basedir}/proguard.cfg</proguardinclude>
                    <!-- 额外的jar包,通常是项目编译所需要的jar -->
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                        <lib>${java.home}/lib/jsse.jar</lib>
                    </libs>
                    <!-- 对输入jar进行过滤比如,如下配置就是对meta-info文件不处理。 -->
                    <inlibsfilter>!meta-inf/**,!meta-inf/versions/9/**.class</inlibsfilter>
                    <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
                    <outputdirectory>${project.basedir}/target</outputdirectory>
                    <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
                    <options>
                        <!-- 可以在此处写option标签配置,不过我上面使用了proguardinclude,故而我更喜欢在proguard.cfg中配置 -->
                    </options>
                </configuration>
            </plugin>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <mainclass>com.example.myproguarddemo.myproguarddemoapplication</mainclass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

然后点击package,正常执行编译打包流程就可以 :

**然后可以看到jar的生成: **

看看效果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com