背景

项目要部署到第三方服务器上,于是研究了一下jar包加密的方式,其中在github上有一个项目XJar,挺多使用用户,也搜到了破解的教程,于是研究了一下。详细说下如何加密、破解。这些加密只能说“防君子不防【小人】”,大神总有办法,只要项目有足够的价值,那其他都不值一提。

原理

可以查看github源码,作者也说了原理:基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案, 避免源码泄露以及反编译。总结一下,大致就是:

  1. 通过加密程序设置加密参数后,生成加密后的jar包(会扩展ClassLoader),eg:tuine-1.0.0.jar
  2. 根据作者的go文件,修改相同的加密参数后,生成exe文件(eg:tuineStart.exe),用于启动程序
  3. 启动命令:tuienStart.exe 程序A(java) 参数 -jar tuine-1.0.0.jar 参数

说明

  • go文件中包含了密码、jar包的md5、sha1校验,可以防止密码不正确、篡改jar包。详细可查看 go源文件
  • 启动程序会把加密参数通过标准输入流写入到执行程序A中,jvm接受到参数,通过扩展的ClassLoader动态解密字节码。

加密

  1. 把代码打包为jar包
  2. 引入xjar依赖,设置程序jar包位置、加密的文件、加密算法、加密密码
  3. 生成加密文件

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

XCryptos.encryption().from("/path/to/read/tuine-1.0.0.jar.jar").use("tuinepassword").include("/io/xjar/**/*.class").include("/mapper/**/*Mapper.xml").exclude("/static/**/*").exclude("/conf/*").to("/path/to/save/tuine-1.0.0.jar.jar");
  1. 修改go文件中对应的秘密信息然后编译启动程序:go build xjar.go
  2. 启动运行即可。
/path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]/path/to/xjar /path/to/javaw [OPTIONS] -jar /path/to/encrypted.jar [ARGS]nohup /path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]

破解-解密

既然知道了加密原理,而且还有源码,所以破解思路就清晰很多了,如果没有源码的话,还是能难道一大批人的,若需应用到项目中,可以根据作者的项目进行优化升级形成自己的加密程序,这样来说更安全。

破解方式1-获取密码

明确了“密码信息”是通过流的方式输入给程序A的,而且go程序没有前置校验程序A,所以这里来个弄巧成拙,把程序A替换为其他程序,并且把流信息打印出来就可以查看到密码信息了!

dec.php

<?php
var_dump(file_get_contents('php://stdin'));

执行程序及结果:

破解方式2-直接获取解密后的class

解密在jvm内存中进行,所有堆内的class文件肯定是解密后的,所以理论上完全可以通过查看堆内文件信息来获取class文件。

JAVA官方提供了可视化工具HSDB,可以下载class文件。

  1. 查看程序进程ID:jps -l,查找对应程序的ID
  2. 启动HSDB:
    jdk9之前使用:java -cp your_javahome_path/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
    jdk9之后使用:your_javahome_path/bin/jhsdb.exe hsdb
  3. 选择File-Attatch to HotSpot process-输入进程号即可进入
  4. 查看class:Tools-Class Browser,可以进行搜索,然后进行下载

关于报错:Create .class File java.io.IOException: 系统找不到指定的路径。

说明碰到的一个问题,下载class文件报错:Create .class File java.io.IOException: 系统找不到指定的路径。原因就是系统没有权限,当时考虑windows应该不涉及权限问题啊。后来google也搜不到解决方案,然后仔细想了一下,如果在执行下载,也没让选择保存目录,那只能基于我执行的当前目录去相对路径创建,因为java安装在C盘的Program Files目录,而我是进入到javahome目录中后执行的命令(C:\Program Files\Java\jdk1.8.0_251\lib> java -cp .\sa-jdi.jar sun.jvm.hostspot.HSDB)所以考虑极有可能是系统目录权限的问题。

于是改为:java -cp C:\Program Files\Java\jdk1.8.0_251\lib\sa-jdi.jar sun.jvm.hostspot.HSDB。果然执行成功,验证了猜想。而下载的文件则是在当前执行目录下,并且按照包名进行创建的文件夹。

破解方式3-内存中获取密码

既然能够在内存中获取class文件并下载出来,并且是扩展ClassLoader实现的,于是查看xjar的源代码ClassLoader部分得知,XKey类中包含了密码的各种信息:

    public XBootClassLoader(URL[] urls, ClassLoader parent, XDecryptor xDecryptor, XEncryptor xEncryptor, XKey xKey) throws Exception {super(urls, parent);this.xBootURLHandler = new XBootURLHandler(xDecryptor, xEncryptor, xKey, this);this.urlClassPath = XReflection.field(URLClassLoader.class, "ucp").get(this).value();this.getResource = XReflection.method(urlClassPath.getClass(), "getResource", String.class).method();this.getCodeSourceURL = XReflection.method(getResource.getReturnType(), "getCodeSourceURL").method();this.getCodeSigners = XReflection.method(getResource.getReturnType(), "getCodeSigners").method();}

使用Java程序性能分析工具VisualVM,使用其Heap Dump功能,查看堆栈中的信息。

  1. 下载并打开程序,打开相关的程序,如图查看Monitor:
  2. 点击右上角的Heap Dump,打印堆信息。
  3. 查看堆文件搜索XBootClassLoader或者XjarClassLoader,查看成员属性可查看加密信息:

    图中密码为默认的:io.xjar

获取class文件,反编译

如经过破解方式1和3,可以拿到加密信息,则可以通过自带的解密程序进行解密:

  XCryptos.decrypt("D:\\tuine-1.0.0.jar","D:\\tmp.zip", "tuinepassword");

解压拿到的tmp.zip即为加密前的所有class文件。

反编译:

  1. 可以放到idea中直接查看,或者引入到项目中作为包,可直接查看,idea会自动反编译。
  2. 使用jad进行反编译。

引用感谢

记录一次破解xjar加密的经历
破解及修复issue
99%的人都搞错了的java方法区存储内容,通过可视化工具HSDB和代码示例一次就弄明白了

java程序jar包xjar加密及破解解密相关推荐

  1. java -jar 停止_推荐:Linux启动Java程序jar包Shell脚本

    每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar--?边敲边想着都需要追加哪些参数? 今天就推荐给大家一个几乎通用的Shell脚本,它支持Java程序Ja ...

  2. linux启动java jar文件_推荐:Linux启动Java程序jar包Shell脚本

    #!/bin/sh# 该脚本为Linux下启动java程序的脚本## author: luandy# date: 2021/1/15## 特别注意:# 该脚本使用系统kill命令来强制终止指定的jav ...

  3. 如何重启java程序jar包_windows下jar包开机自动重启的步骤

    最近做了很多项目,不同的系统,不同的部署方式,这里做个记录 1.在jar包目录新建一个start.bat  文件,然后写入启动命令 jar -jar XXXX.jar 2.仍然在此目录,新建start ...

  4. Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包

    一.建立脚本文件: 二.设置权限 三.将脚本文件放到启动目录下 四.更新优先级 cd /etc/init.d sudo update-rc.d startm.sh defaults 90 至此,开机启 ...

  5. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

  6. 使用exej4把Java 的jar包打包成exe小程序工具分享

    使用exej4把Java 的jar包打包成exe小程序的工具下载 此处给个exej4的目前最新版的安装包(已经包含注册码)下载(国外官网下载东西,速度之满大家都是知道的): 百度网盘: 链接:http ...

  7. JAVA获取程序/jar包所在路径

    public class path{public static void main(String []args){//输出本程序/jar包所在路径System.out.println(System.g ...

  8. java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...

    本文主要是将java的jar包启动的cmd命令添加到bat文件来执行,且不弹出DOS窗口,也就是后台运行java的jar包. 这里以win10为例 1.新建 一个txt文件,在文件添加以下内容.其中E ...

  9. java jar 源码乱码,java使用jar包时出现乱码的解决方法

    java使用jar包时出现乱码的解决方法 发布时间:2020-06-17 17:06:29 来源:亿速云 阅读:105 作者:元一 jar包是什么: jar(Java Archive,Java归档文件 ...

最新文章

  1. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
  2. 华为轮值主席鸿蒙,鸿蒙2.0已开源 华为轮值董事长:今年至少3亿设备搭载鸿蒙系统...
  3. php不能加载extension的奇怪问题
  4. 朴素贝叶斯算法-分类算法
  5. 用户密码到底要怎样存储?
  6. 语音识别实验报告.docx
  7. python第一行左对齐_关于Python的第一行语句
  8. strak组件(5):为列表定制预留钩子方法
  9. 使用httpclient下载网络上的图片
  10. ExtJS2.0 可编辑表格EditorGridPanel
  11. Protus 8.6 及以上如何找到library文件夹
  12. 冰点还原精灵是怎么用的
  13. 未明学院:保姆级四大par面面经和准备方法
  14. 【深度首发】死磕“2D转3D”的聚力维度,能否成为影视人工智能行业的独角兽?丨Xtecher 封面
  15. 常用颜色的RGB分布
  16. 图像变形算法:实现Photoshop液化工具箱中向前变形工具
  17. halcon变量,图像与C++的一些转换(未完待续)
  18. Ptr ds 与ptr ss
  19. 如何将您的智能手机用作Amazon Fire TV遥控器
  20. Mysql数据库分表实现

热门文章

  1. PE中添加外置程序(转载)
  2. 数据分布的一些检验方法
  3. layui分页失效问题
  4. mysql中的查询时间的语句_mysql 常用时间查询语句
  5. 【20保研】中山大学智能工程学院2019年暑期优秀大学生夏令营
  6. css画小圆有时会变形
  7. Openstack(二):keystone认证服务
  8. torch实现RBF(径向基神经网络)
  9. 第四章 Python常用模块
  10. Java后端开发快手实习面经