记录一次破解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 协议》,转载必须注明作者和本文链接
推荐文章: