ClassFinal资料介绍:
根据ClassFinal的介绍可知道,需要解密ClassFinal的加密文件,前提是获取到了加密的密码。
至于如何获取到加密的密码,这里就无法具体分析了。因为ClassFinal加密的jar文件启动方式可以各种各样的触发,但是加密密码一定会在启动命令里加上,用于启动后的解密:
java -javaagent:test.jar="-pwd 123456" -jar test.jar
大家需要自己找到启动jar文件的入口才能找到具体的加密密码。
使用ClassFinal加密后,ClassFinal会将解密代码同样打包到jar文件中,但是由于ClassFinal只会加密指定的文件,不会加密自身的文件,因此可以使用ClassFinal自身的代码去解密加密的文件,
ClassFinal会将加密后的文件存放在META-INF/.classes/目录下面,运行时解密该目录下的文件。解密方法便是:net/roseboy/classfinal/JarDecryptor.class#doDecrypt
我们首先可以先反编译jar文件,得到net/roseboy/classfinal目录下的java代码,再直接使用JarDecryptor类的解密方法doDecrypt去解密文件即可。
以下是本人根据该方法写的解密方法:
/**
* classfinal加密文件破解解密
*
* @param args
*/
public static void main(String[] args) {
String projectPath = "C:\\Users\\Downloads\\jar_Decompiler";//项目路径,META-INF文件夹的父级路径
String classPath = "C:\\Users\\Downloads\\jar_Decompiler\\META-INF\\.classes";//加密文件所在的路径
char[] password = "123456".toCharArray();//加密密码
JarDecryptor jarDecryptor = JarDecryptor.getInstance();
// 获取加密文件目录下的所有文件
File directory = new File(classPath);
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
//开始解密
byte[] bytes = jarDecryptor.doDecrypt(projectPath, file.getName(), password);
File fileNew = new File(file.getName() + ".class");
IoUtils.writeFile(fileNew, bytes);
System.out.println("解密完成:" + file.getName());
}
}
} else {
System.out.println("目录为空或无法读取。");
}
System.out.println("解密完成");
}
以下是解密前后对比:
更新2025.06.18:
根据下方评论里各位朋友遇到的情况,需要在这里特别补充一点说明。
具体的如何解密是依据于如何加密而决定的,因此大家需要参考一下下面的资料。
根据官方文档的介绍,加密方式有3种(咱们排除不加密的情况):
1、启动时,启动命令直接密码解密。上方文章所遇到的例子便是这种情况,同时在这里也对各位的误导抱歉,上面说了一些“一定”这样绝对性的描述词,仅适用于这种解密方式。
2、启动时,需要在绑定机器码的电脑上,启动命令里使用密码解密。
3、启动时,启动命令不解密,然后在启动控制台里输入密码解密,或者这里也绑定了机器码。
由此可见,当密码并不写在启动命令里的时候(这里引申为泛指密码没有存在本地的场景),而是需要在控制台里输入密码的情况,那基本上就是没戏了。因为是AES加密,没办法逆推出来源文件的。密码相当于口口相传了,没密码也没办法AES解密了。
强烈建议各位去上方的链接看看官方文档,里面都有这方面的加密介绍,避免走弯路。