Xjar加密破解后续

Xjar加密破解后续


背景

之前对部分系统做灰盒测试,研究过xjar的破解,但是上篇文章写的部分内容有些笼统,这里需要详细再描述一下,给部分同学做一下答疑。

解密以后乱码

部分系统使用以下代码进行解密:

1
2
3
4
5
6
7
public static void main(String[] args) throws Exception {
String password = "temp";
XKey xKey = XKit.key(password);
String jarpath = "E:\\work\\security\\xjarTest\\src\\main\\resources\\web.jar";
String decryptJarpath = "E:\\work\\security\\xjarTest\\src\\main\\resources\\web.jar";
XBoot.decrypt(jarpath, decryptJarpath, xKey);
}

使用以上这种解密方式,会将jar包中所有的字节码文件、静态资源文件都进行解密,如果在该jar加密的时候并未对这部分文件进行加密,那么在解密的过程中就会对这些未加密的文件进行解密处理,对正常编码的文件进行处理,你会得到一个无法识别的文件,比如:
20211127-01.png

解决这个问题的方法也很简单,在解密过程中指定排除的文件,或者指定解密的文件,使用使用Ant表达式,例如:

1
2
3
io/xjar/**
com/company/project/**
mapper/*Mapper.xml

解密的代码也很简单,直接调用官方的解密接口进行解密就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import io.xjar.XCryptos;
import io.xjar.XKit;
import io.xjar.key.XKey;

public class EcryptXjar {
public static void main(String[] args) throws Exception {
String password = "temp";
XKey xKey = XKit.key(password);
String jarpath = "E:\\pentest\\xjarTest\\src\\main\\resources\\web.jar";
String decryptJarpath = "E:\\pentest\\xjarTest\\src\\main\\resources\\web.jar";
XCryptos.encryption()
.from(jarpath)
.use(password)
.include("/io/xjar/**/*.class")
.include("/mapper/**/*Mapper.xml")
.exclude("/static/**/*")
.exclude("/conf/*")
.to(decryptJarpath);
}
}
方法名称参数列表是否必选方法说明
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包输出文件, 并执行解密.
  • 指定解密算法的时候密钥长度以及向量长度必须在算法可支持范围内, 具体解密算法的密钥及向量长度请自行百度或谷歌。
  • include 和 exclude 同时使用时即解密在include的范围内且排除了exclude的资源。
  • 如果解密以后发现文件仍然无法打开,确定密钥是否正确,确定文件是否被排除在外,或者文件是否被加密。

使用密钥进行解密

目前,XJAR内置AES/CBC/PKCS5Padding 和 DES/CBC/PKCS5Padding两种算法,如果获取的是密钥,而不是密码,相关解密的代码应该进行调整,参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import io.xjar.XCryptos;
import io.xjar.XKit;
import io.xjar.key.XKey;

import java.nio.charset.StandardCharsets;

public class EcryptXjar {
public static void main(String[] args) throws Exception {
String algorithm = "AES/CBC/PKCS5Padding";
Integer keysize = 128;
Integer ivsize = 128;
String password = "temp";
String jarpath = "E:\\pentest\\xjarTest\\src\\main\\resources\\web.jar";
String decryptJarpath = "E:\\pentest\\xjarTest\\src\\main\\resources\\web.jar";
XCryptos.decryption()
.from(jarpath)
.use(algorithm,keysize,ivsize,password)
.include("/io/xjar/**/*.class")
.include("/mapper/**/*Mapper.xml")
.exclude("/static/**/*")
.exclude("/conf/*")
.to(decryptJarpath);
}
}
  • 其中算法,密钥长度,偏移量的长度根据实际情况进行填写即可。

使用xjar加密项目

这个参考github上的介绍即可,我这里直接使用maven进行打包。比如以下命令:

1
mvn xjar:build -Dxjar.password=io.xjar

如果在pom.xml build中引入xjar的插件,配置完成,直接使用 maven clean build 构建项目即可,官方不推荐这种方式,容易泄露打包密码,各位同学根据实际情况食用即可。

参考