长亭百川云 - 文章详情

xjar破解续

代码审计SDL

71

2024-07-13

背景

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

解密以后乱码

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

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加密的时候并未对这部分文件进行加密,那么在解密的过程中就会对这些未加密的文件进行解密处理,对正常编码的文件进行处理,你会得到一个无法识别的文件,比如:

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

io/xjar/**com/company/project/**mapper/*Mapper.xml

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

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两种算法,如果获取的是密钥,而不是密码,相关解密的代码应该进行调整,参考代码如下:

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进行打包。比如以下命令:

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

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

总结

xjar是一套优秀的基于对JAR包内资源的加密以及扩展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案,如果没有获取go启动客户端,通过暴力破解相关信息是相当困难的事情,本篇文章并不是对xjar方案的否定,反而是很乐意推广给相关研发人员进行使用。在攻防对抗过程中,启动器和jar都获取的概率很低,这套方案也是可以继续推广的。

参考

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2