Jar包加密,防止反编译方法

  • XJar加密工具
    • XJar功能特性
    • 使用方法(手动执行方式)
    • 使用方法(Maven插件方式)
  • exe4j加密工具
    • 使用方法
  • jvmti加密工具
    • 使用方法
  • 参考

XJar加密工具

XJar功能特性

  • 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露以及反编译。
  • 支持Maven插件
  • 加密过程需要Go环境;加密后生成Go启动器,保护密码不泄露
  • GitHub: https://github.com/core-lib/xjar

使用方法(手动执行方式)

  1. 添加Maven依赖
<!-- 添加jitpack.io仓库 -->
<repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository>
</repositories><!-- 添加XJar依赖 -->
<dependencies><dependency><groupId>com.github.core-lib</groupId><artifactId>xjar</artifactId><version>4.0.0</version></dependency>
</dependencies>
  1. 对jar包进行加密的代码
XCryptos.encryption().from("D:/jars/original.jar").use("1@3$qWeR").include("/io/xjar/**/*.class").include("/mapper/**/*Mapper.xml").exclude("/static/**/*").exclude("/conf/*").to("D:/files/encrypted.jar");
  • 方法说明
方法 参数 说明
from (String jar) 指定待加密jar包路径
from (File jar) 指定待加密jar包路径
use (String password) 设置加密密码
use (String algorithm, int keysize, int ivsize, String password) 设置加密算法及加密密码
include (String ant) 指定要加密的资源相对于classpath的ANT路径表达式
include (Pattern regex) 指定要加密的资源相对于classpath的正则路径表达式
exclude (String ant) 指定不加密的资源相对于classpath的ANT路径表达式
exclude (Pattern regex) 指定不加密的资源相对于classpath的正则路径表达式
to (String xJar) 指定加密后jar包输出路径,并执行加密
to (File xJar) 指定加密后jar包输出路径,并执行加密
  • algorithm: JDK内置加密算法,如:AES/CBC/PKCS5Padding(缺省值)和DES/CBC/PKCS5Padding
  • keysize: 密钥长度,如:56、128(缺省值)、256
  • ivsize: 密钥向量长度,如:128(缺省值)
  1. 用Go进行编译,生成Go启动器
go build xjar.go
  • 第2步执行成功之后,在指定目录下会输出加密的jar包以及一个xjar.go文件
  • 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件,其中Windows下文件名为 xjar.exe 而Linux下为 xjar
  • 用于编译的机器需要安装 Go 环境,用于运行的机器则可不必安装 Go 环境
  • 由于启动器自带JAR包防篡改校验,故启动器无法通用,即便密码相同也不行
  1. 启动运行
xjar java -jar /path/to/encrypted.jar
  • 在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包
  • 仅支持通过 -jar 方式启动,不支持-cp或-classpath的方式

使用方法(Maven插件方式)

Maven项目可通过集成 xjar-maven-plugin 以免去每次加密都要执行一次上述的代码,随着Maven构建自动生成加密后的JAR和Go启动器源码文件。

  1. 添加 xjar-maven-plugin
<project><!-- 设置 jitpack.io 插件仓库 --><pluginRepositories><pluginRepository><id>jitpack.io</id><url>https://jitpack.io</url></pluginRepository></pluginRepositories><!-- 添加 XJar Maven 插件 --><build><plugins><plugin><groupId>com.github.core-lib</groupId><artifactId>xjar-maven-plugin</artifactId><version>4.0.0</version><executions><execution><goals><goal>build</goal></goals><phase>package</phase><!-- 或使用<phase>install</phase>--><configuration><!-- 建议password不要在pom文件中指定 --><password>io.xjar</password><!-- optional<algorithm/><keySize/><ivSize/><includes><include/></includes><excludes><exclude/></excludes><sourceDir/><sourceJar/><targetDir/><targetJar/>--></configuration></execution></executions></plugin></plugins></build>
</project>

对于Spring Boot 项目或模块, 该插件要后于 spring-boot-maven-plugin 插件执行, 有两种方式

  • 将插件放置于 spring-boot-maven-plugin 的后面, 因为其插件的默认 phase 也是 package
  • 将插件的 phase 设置为 install(默认值为:package), 打包命令采用 mvn clean install

也可以通过Maven命令执行

mvn xjar:build -Dxjar.password=io.xjar
mvn xjar:build -Dxjar.password=io.xjar -Dxjar.targetDir=outputDir/encrypted.jar

但通常情况下是让XJar插件绑定到指定的phase中自动执行,这样就能在项目构建的时候自动构建出加密的包

mvn clean package -Dxjar.password=io.xjar
mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar

强烈建议
不要在 pom.xml 的 xjar-maven-plugin 配置中写上密码,这样会导致打包出来的 xjar 包中的 pom.xml 文件保留着密码,极其容易暴露密码!强烈推荐通过 mvn 命令来指定加密密钥!

exe4j加密工具

使用方法

  1. 下载exe4j工具并安装
    官网下载地址:https://exe4j.apponic.com/

  2. 安装完成后打开软件,填写Name, Company 和 Licence key. Name 和 Company 随便填,Licence key 网上搜一个即可,如 A-XVK258563F-1p4lv7mg7sav

  3. 点击 Next, 选择 “JAR in EXE” mode

  4. 点击 Next, 填写输出exe文件的名称和输出路径

  5. 点击 Next, 进行exe程序配置;如需要兼容64位操作系统,需点击 “Advanced Options”, 选择 “32-bit or 64-bit”, 进入设置页面,勾选 “Generate 64-bit executable” 选项

  6. 点击 Next, 进入 “Java invocation” 页面;点击右侧 “+” 图标,添加项目jar包以及所有依赖jar包;添加后点击下方 “…” 图标选择程序启动的 Main class;并输入启动参数(如需要)

  7. 点击 Next, 填写JRE版本;点击 “Advanced Options”, 选择 “Search sequence”, 点击右侧 “+” 图标,添加本地java安装路径下的jre路径;添加后把jre路径移到第一项(或者把默认的三项删掉)

  8. 一直点击 Next, 直到进入 “Finished” 页面;点击上方按钮可测试exe程序运行

  9. 保存 & 完成

jvmti加密工具

采用jvmti方式对Class文件进行加密,使用C++生成加密和解密库,先用加密库对Jar包进行加密,将加密后的Jar包及解密库文件发布出去,执行时候需要JVM引入解密库文件,解密后执行

使用方法

  1. 下载加密程序压缩包:JarEncrypt2
    解压后目录及文件如下:
./JarEncrypt2/encrypt   ## 加密库
—– encrypt.cpp
—– Makefile./JarEncrypt2/decrypt    ## 解密库
—–decrypt.cpp
—– Makefile./JarEncrypt2/Encrypt.java   ## Java加密执行文件
  1. 修改 encrypt 和 decrypt 下的Makefile文件,修改其中的 "INCLUDEDIR"为实际jdk路径
INCLUDEDIR = -I /home/jdk1.8/include -I /home/jdk1.8/include/linux
  1. 根据需要加密的代码,修改 Encrypt.java 和 decrypt.cpp 文件
// Encrypt.java
// 只对特定类型和package下的文件加密
if (name.endsWith(".class") && name.startsWith("com/du/")) {
// decrypt.cpp
// 设置需要解密的package
if (name && strncmp(name, "com/du/", 7) == 0) {
  1. 分别进入 encrypt 和 decrypt 目录,执行 make,生成 libencrypt.so 和 liblinux.so 库文件
  2. 编译并运行Encrypt.java;生成 test_encrypt.jar 文件
javac Encrypt.java
java -Djava.library.path=./encrypt/ -cp . Encrypt -src test.jar
  1. 生成的加密jar包无法直接运行和反编译,直接运行会出现ClassFormatError,用jd-gui工具反编译会显示 // INTERNAL ERROR //
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 3455696313 in class file
  1. 使用解密库文件 liblinux.so 解密运行
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/JarEncrypt2/decrypt
java -agentlib:linux -jar test_encrypt.jar
  1. 完成;发布的时候需要把 test_encrypt.jar 和 liblinux.so 一起发布,启动时按上一步操作

参考

  • XJar: Spring-Boot JAR 包加密运行工具,避免源码泄露以及反编译
  • java:编写jar包加密工具,防止反编译
  • Java加密Jar包和Class文件-防止反编译

Jar包加密,防止反编译相关推荐

  1. 基于bat+jad.exe实现jar包批量反编译

    不耗时,不费力,简单好用,看过来!! 最近遇到一个问题: 项目进行安全渗透测试的时候,被爆出使用了过期的非安全的类,但是团队成员分析过后,坚定已经完全剔除了所有的非安全的类,但是工具就是报这么一个警告 ...

  2. java axmlprinter_安卓xml配置文件解析工具-AXMLPrinter2.jar(androidmanifest.xml 反编译)下载官方最新版-西西软件下载...

    AXMLPrinter2.jar apk分析APK文件,取得APK文件中的 包名.版本号及图标,很强大的工具,再一次感受到了批处理的牛逼.可以将android安卓编译过的二进制XML文件(binary ...

  3. Eclipse中Jar包的反编译(通过jar包查看源码)

    很多时候我们在公司工作时,在Eclipse引用其他人封装好的jar包时是看不到源码的,这样一来就不能很好得理解他人的意图,于是就需要借助反编译的帮助了.好了,下面是反编译的正确使用方法. 一.下载ne ...

  4. 如何修改可运行Jar包,如何反编译Jar包

    将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All  ...

  5. java如何转成jar包,修改及反编译可运行Jar包实现过程详解

    将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All S ...

  6. idea 项目jar反编译java_带你上手阿里开源的 Java 诊断利器:Arthas

    本文适合有 Java 基础知识的人群. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款阿里开源的 Java 诊断利器 Art ...

  7. IDEA—使用插件反编译jar包

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在产品上线后,如果遇到问题阻塞,我们第一步要做的就是去查看日志,但是代码不是一个人写的,说不定就会遇到没有日志的,遇到这种情况, ...

  8. 使用IDEA插件反编译jar包文件

    1. 简介 查看日志报错行数时,发现现有代码又和线上的代码不一致,这个时候我们就需要反编译,本文介绍一下如何通过我们神奇的Idea软件进行反编译jar包. 使用到IDEA一个重要的插件:java-de ...

  9. 在命令行下,如何使用JAD反编译jar文件

    在工作中,我们经常需要对遗留系统或其他的第三方系统进行维护,如果我们没有java源文件的情况下,一般都需要将其中的jar文件进行反编译. 本文将以如何用命令来反编译一个test.jar文件为例,你可以 ...

  10. java jar反编译后保存_java根据jar包反编译后修改再打包回jar的做法

    1. 得到一个待要修改的jar包 2. 我的环境是windows,然后解压这个jar包,得到一堆class文件,这时候就找到你需要的那个class文件 3. 我首先是使用jd-gui工具看一下这个cl ...

最新文章

  1. [译] RxJS: 避免 takeUntil 造成的泄露风险
  2. 优米网:创业传记——傅盛
  3. C#Winform版获取Excel文件的内容
  4. 如何结合SharePoint Designer 2010 与Visio 2010 创建工作流?
  5. 网络编程6_multiprocess模块.锁.队列
  6. MATLAB 读取 各类文件
  7. Mujoco平面双足机器人模拟
  8. tbopen链接生成工具_愚人节必备工具,有了它们就是朋友圈最靓的仔
  9. 中国音频放大器市场现状研究分析与发展前景分析报告
  10. Node.js 整合 Express 框架实现微信支付和支付宝支付
  11. 【财务_会计3_1】会计科目的概念
  12. Windows自定义域名跳转指定网址
  13. bundle包是什么意思_bundle与package区别与联系
  14. phinx武林秘籍(上)
  15. python怎么实现打开摄像头_python开启摄像头以及深度学习实现目标检测方法
  16. strcpy()的使用注意事项
  17. 基于51单片机实现4位数码管动态显示
  18. OLAP、OLTP的介绍和比较
  19. 新手C语言开发详细教程
  20. 西南大学统考英语计算机有答案吗,西南大学666教育学 初试398分经验贴(含统考科目英语政治.......

热门文章

  1. centos7 挂载fat32格式的u盘和ntfs格式的移动硬盘
  2. Gridea 配置Gitalk 的异常:Error Bad credentials 和 Error Not Found
  3. 将.ini配置文件转换为.xml文件格式
  4. android lottie api,Lottie Android 初探
  5. (转载)Linux一句话精彩
  6. [STM32]PID恒温加热台(DIY回流焊)
  7. 全国政协委员荣洋:成立创新中心,推动北斗系统深化应用
  8. lynx最新版本下载地址-2015-7
  9. 在MySQL查询中计算一个人的年龄
  10. 写了一个开机启动,监听通话的demo