惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈
exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈
Mr.Potato · 2025-01-16 · via 牛牛技术客栈

Mr.Potato Java 教程, Java

前言

之前给客户写了个 springboot 服务插件,是运行在 win端的一个程序,由于是 Java8 ,所以使用的是 exe4jjar 打包成 .exe 格式。exe4j 打包教程可自行百度或谷歌,如果是 Java14+ 可以参考我这篇文章:Java打包exe教程 。

后来想到如果直接这样给安装包给到客户的话就直接等于是给了源码(发现程序运行当中jar包会暴露在 %temp% 临时目录中,可以直接拷贝出来进行反编译拿到源码),于是就想到对jar包进行加密处理,这里使用的是 classfinal 进行加密处理,起码能够有效防止反编译破解,增加破解难度。

ClassFinal 加密

这里使用的是maven方式加密

<plugin>
    <!--
        1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描
        2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容
        3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件
        4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行
        5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
        6. 有密码启动方式,java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar
    -->
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <password>123456</password>
        <packages>
            com.example.*
        </packages>
        <cfgfiles>example.yml</cfgfiles>
        <libjars>
            example.jar
        </libjars>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>classFinal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

exe4j打包

加密后不能直接启动jar包,需要使用 java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar 命令启动加密后的jar,固需要在 exe4j VM Parameters 修改 jar 包的启动方式,命令如下:

-javaagent:%EXE4J_TEMPDIR%/service.jar="-pwd 123456" -XX:-DisableAttachMechanism
注意⚠️:为了保证项目在运行时的安全,启动jvm时请加参数: -XX:+DisableAttachMechanism

20250116092551060.webp

打包完成后运行 exe ,然后 %temp% 临时目录中的jar 就是加密过的jar