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】

简明
classfinalproguard有些类似,但不一样的是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环境启动加密包,后续会进行介绍。但使用xjarmaven插件对集成了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.propertieslogback.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

在这里插入图片描述

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...