maven打包实现源码加密防止使用JD-GUI等工具的反编译
创始人
2025-05-29 20:37:23
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的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...