记录一次破解xjar加密的经历

背景

手上有一个项目是java写的,但是被用xjar(关于xjar是什么可以打开github了解一下)加密了,class被加密了,并且做了md5和sha1的校验,无法替换class。项目启动的时候有一个验证过程,会通过将机器码通过http请求发送到服务端校验是否合法,然后通过了才能启动项目。最开始的破解思路是自己写一个服务端,模拟返回数据,但是发现请求是https的,本地请求没办法通过根证书的校验无法通过,于是开始了破解项目,寻求其他方法。

xjar原理和破解思路

通过查看xjar项目的源码发现,项目使用对称加密算法加密class字节码,项目通过一个go写的启动器,将秘钥通过标准输入流写到jvm中,然后通过jvm的classloader动态解密字节码,所以是纯jvm内存的解密。
破解思路是获取加解密秘钥,然后修改启动器重新编译,去掉md5校验那块,这样就可以愉快的替换class模块,达到破解的目的了。

记录一次破解xjar加密的经历

获取秘钥

通过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 协议》,转载必须注明作者和本文链接
wojianishanghaojiugoujia
讨论数量: 5

请问能拿到class反编译后的源码吗?

3年前 评论
wojianishanghaojiugoujia (楼主) 3年前

Xjar破解方案很多。朋友 有推荐的加密方案么

3年前 评论
wojianishanghaojiugoujia (楼主) 3年前

没有启动器 xjar.exe 怎么办?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!