记录一次破解xjar加密的经历
背景#
手上有一个项目是 java 写的,但是被用 xjar(关于 xjar 是什么可以打开 github 了解一下) 加密了,class 被加密了,并且做了 md5 和 sha1 的校验,无法替换 class。项目启动的时候有一个验证过程,会通过将机器码通过 http 请求发送到服务端校验是否合法,然后通过了才能启动项目。最开始的破解思路是自己写一个服务端,模拟返回数据,但是发现请求是 https 的,本地请求没办法通过根证书的校验无法通过,于是开始了破解项目,寻求其他方法。
xjar 原理和破解思路#
通过查看 xjar 项目的源码发现,项目使用对称加密算法加密 class 字节码,项目通过一个 go 写的启动器,将秘钥通过标准输入流写到 jvm 中,然后通过 jvm 的 classloader 动态解密字节码,所以是纯 jvm 内存的解密。
破解思路是获取加解密秘钥,然后修改启动器重新编译,去掉 md5 校验那块,这样就可以愉快的替换 class 模块,达到破解的目的了。
获取秘钥#
通过 xjar.go 发现启动器只校验了是否包含 - jar,和 jar 的 md5,所以可以写一个简单的 php 项目把标准输入流打印出来就知道是什么了。
首先新建 a.php
:
<?php
var_dump(file_get_contents('php://stdin'));
启动器为 xjar.exe,执行
$ xjar.exe php a.php -jar file.jar
即可在控制台查看到输出的秘钥了。
破解,重写启动器#
拿到秘钥就简单了,通过替换 xjar.go 中的秘钥,然后修改 xjar.go 中校验 md5 和 sha1 的逻辑,然后重新编译启动器。剩下的就简单了,启动器已经可以不校验 jar 的 md5 值了,这时候可以解压 jar,替换其中的部分 class,就可以达到破解的目的了。
结语#
在调试过程中也学会了使用 hsdb、jvisualvm 等工具,使用 jvisualvm 也可以在堆中看到对应 XjarClassLoader 中对应的秘钥,但是显然上面通过一个 php 脚本的方式更简单。了解了 jvm 的启动逻辑,虽然 xjar 在安全性上没办法起到很大的保障,但是在技术层面还是很牛逼的,很多地方值得学习,通过源码也可以学习很多。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: