maven打包实现源码加密防止使用JD-GUI等工具的反编译
迪丽瓦拉
2025-05-29 21:12:26
0次

前言
最近一段时间没有怎么写原著文章了,转载了不少文章,主要还是因为文章作者写的太好就直接摘抄了。本文算安全方面的应用,在工作过程中应该会有所遇到,主要就是关于程序员完成项目之后对源码的处理,像java开发中就会遇到,为了避免源码被反编译来揣测项目的业务原理,往往都会做一些操作,比如混淆源码【proguard】,如果隐藏方法体【classfinal】,还有直接加密jar包避免被工具直接看到的【xjar】,本文主要介绍这三种方式,接下来是截图和源码的展示,毕竟这是我写作的一贯作风主要还是为了大家更好的观看。

一、代码混淆【proguard】强烈不推荐

简明
将源码的类名方法名用字母进行替换,并且同步修改所有相关的类方法及属性名,但可以看到具体的实现,只是对于有严格命名规范的书写方式来说看起来很头疼,但花时间看还是能看明白。但是混淆之后再来启动jar包的时候你会发现启动不了了,然后又得去配置文件添加更多的配置来规避一些类,依次搞定还好,多几次说实话你就会感觉非常的难受了。

1. 添加配置文件【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.Application {public static void main(java.lang.String[]);}

注意
下列代码是springboot项目的启动类,表示启动类不混淆

-keep public class com.example.Application {public static void main(java.lang.String[]);}
2. 添加pom.xml
com.github.wvengenproguard-maven-plugin2.6.0packageproguard${project.build.finalName}.jar${project.build.finalName}.jartrue${project.basedir}/proguard.cfg${java.home}/lib/rt.jar${java.home}/lib/jce.jar${java.home}/lib/jsse.jar!META-INF/**,!META-INF/versions/9/**.class${project.basedir}/targetorg.springframework.bootspring-boot-maven-pluginrepackagecom.example.Application

3. 使用mvn clean install打包

下列是混淆的部分日志
在这里插入图片描述

4. 使用JD-GUI打开混淆的jar包

下面提出混淆效果图,对于关键字的都是保留了的,并且对于接口的都是保留了的,配置文件里有相应的配置信息
在这里插入图片描述
在这里插入图片描述

二、代码隐藏【classfinal】

简明
classfinal和proguard有些类似,但不一样的是classfinal会隐藏方法体,但不会重命名包名,类名,方法名,如果要隐藏配置文件这类关键的信息,不是一定能够处理成功的,存在各种各样的bug,我试过隐藏application.properties,和logback.xml,前者隐藏不影响系统启动和使用,但后者被隐藏之后,无法解析,项目无法启动,另外如果项目使用了flument-mybatis的框架也是无法被加密的,打包期间会报错,并且对任何文件都没有加密

1. 直接在pom.xml加代码
net.roseboyclassfinal-maven-plugin1.2.1com.example*.properties,*.xmlorg.springpackageclassFinal

2. 直接使用mvn clean install打包

以下是打包日志,打包完成之后会有两个jar,一个是正常的jar,一个是加密的jar,加密的jar会在最后加【-encrypted】
在这里插入图片描述

3. 使用JD-GUI打开加密的jar包

下面是使用工具反编译的效果图,类名方法名都没有被重命名,但方法体没有了,但是构造函数的方法体并没有被隐藏,所以classfinal总体来说还是存在缺陷
在这里插入图片描述
在这里插入图片描述

4. 启动命令
java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar

在这里插入图片描述

然后输入密码:`r123456`

在这里插入图片描述

三、使用xjar实现jar包的加密【推荐】

简明
xjar可以直接加密整个jar,也可以加密重要的部分,像一些开源的其实是不需要加密的,xjar加密的内容是不能使用JD-GUI等反编译工具打开的,他会生成一个以.xjar为后缀的包和一个以.go为后缀的包,前一个包就是加密的后的包,后一个是可以用于执行加密包的可执行程序,但需要在go环境下才能使用,当然也可以不用go环境启动加密包,后续会进行介绍。但使用xjar的maven插件对集成了flument-mybatis框架的项目不能正常加密,单独加密jar包我没有试过,可以自行操作。

1. 在pom.xml文件中加入打包的插件xjar-maven-plugin
com.github.core-libxjar-maven-plugin4.0.1buildinstall/com/example/**/*.class/mapper/**/*.xml/*.properties/*.xml/templates/**.*/static/**.*

2. 在pom.xml文件中加上资源库的渠道
jitpack.iohttps://jitpack.io

3. 使用命令mvn clean install -Dxjar.password=yourPassword进行打包在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. 使用JD-GUI工具反编译
  • 第一步先修改xjar的后缀,改为jar
    在这里插入图片描述
  • 第二步使用JD-GUI反编译jar包,发现根据看不到class的内容,并且application.properties和logback.xml都已经被加密,被更改为二进制文件了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
3.启动项目有两种方式,一种是使用go环境启动,另一种不需要go环境

方法一:通过go环境启动项目【本文介绍windows环境】

  • 安装go环境,前往官网下载并安装,安装流程不做讲述
https://golang.google.cn/dl/
  • 通过命令编译xjar.go
go build xjar.go

在这里插入图片描述

  • 启动加密的包
xjar.exe java -jar xxx-en.jar

在这里插入图片描述
方法二:直接使用java -jar 启动加密包

java -jar xxx-en.xjar

然后在控制台依次输入【算法,密钥长度,向量长度,密码】

  • 算法
AES/CBC/PKCS5Padding
  • 密钥长度
128
  • 向量长度
128
  • 密码
r123456

在这里插入图片描述

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...