由于整体还挺复杂,研究时间也不完整,所以准备分帖一点点的处理。
解析加密的properties内容
操作入口一般都从提示关键词开始,奈何它的properties文件内容都做了编码,所以这一篇主要是解析properties内容。

1.png (79.3 KB, 下载次数: 0)
下载附件
2025-5-11 08:33 上传

2.png (124.41 KB, 下载次数: 0)
下载附件
2025-5-11 08:33 上传
可以看到properties都是很规整的放到对应模块的resource目录下,以License.properties为例,它的内容是被编码隐藏起来了。
处理结果如图
读取文件,并对其进行解析。

3.png (163.83 KB, 下载次数: 0)
下载附件
2025-5-11 08:33 上传
定位入口
com.wisecoders.dbs.cli.command.Dictionary 是个字典类。
这个处理逻辑很简单:
[ol]
[/ol]
其中有段代码如下:
public class Dictionary {
public static final List a = new ArrayList();
public static final List b = new ArrayList();
public Dictionary() {
}
private static void a(String var0, boolean var1) {
Properties var2 = new Properties();
//2.读取文件流
try (InputStream var3 = AbstractConsole.class.getResourceAsStream(var0)) {
if (var3 == null) {
throw new IOException("Missing commands.properties file");
}
//3.处理文件流
Px.a(var2, var3);
}
}
//1.静态代码块调用方法处理resource下的properties文件
static {
try {
a("connectivity.properties", true);
a("schema.properties", true);
a("data.properties", true);
a("scripting.properties", true);
a("system.properties", true);
a("sql.properties", false);
a("license.properties", false);
} catch (IOException var1) {
Log.a("Error opening commands.properties file. ", var1);
System.out.println("Error opening commands.properties file. " + var1.toString());
}
}
}
装载properties定义信息
com.wisecoders.dbs.sys.Px
[ol]
[/ol]
public class Px {
public static void a(Properties var0, InputStream var1) {
if (var1 != null) {
try (InputStreamReader var2 = new InputStreamReader(var1, StandardCharsets.UTF_8)) {
StringBuilder var3 = new StringBuilder();
String var5;
try (BufferedReader var4 = new BufferedReader(var2)) {
//1.逐行读取properties
//2.对行内容进行解码
//3.将解码内容装置到Properties里
for(; (var5 = var4.readLine()) != null; var3.append(SimpleEncrypt.b(var5))) {
if (!var3.isEmpty()) {
var3.append("\n");
}
}
}
try (StringReader var13 = new StringReader(var3.toString())) {
var0.load(var13);
}
}
}
}
}
解码器
com.wisecoders.dbs.project.store.SimpleEncrypt
目测这个自己实现的规则就是Base64编解码,核心方法如下
public class SimpleEncrypt {
public SimpleEncrypt() {
}
public static String b(String var0) {
if (var0 == null) {
return null;
} else if (var0.isEmpty()) {
return "";
} else {
int var1 = 0;
for (int var2 = var0.length() - 1; var0.charAt(var2) == '='; --var2) {
++var1;
}
int var8 = var0.length() * 6 / 8 - var1;
byte[] var3 = new byte[var8];
int var4 = 0;
for (int var5 = 0; var5 > 8 * (2 - var7) & 255);
}
var4 += 3;
}
return new String(var3, StandardCharsets.UTF_8);
}
}
private static int a(char var0) {
if (var0 >= 'A' && var0 = 'a' && var0 = '0' && var0
进行解析
public class ScriptTest {
public static void main(String[] args) {
String path = ScriptTest.class.getClassLoader().getResource("").getPath();//注意getResource("")里面是空字符串
String filePath = path + "License_zh_CN.properties";
// String filePath = path + "FxWelcome_zh_CN.properties";
try (InputStream inputStream = new FileInputStream(filePath)) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
// 方式一 调用SimpleEncrypt中实现的代码
// String b = b(line);
// System.out.println(b);
// 方式二 按照Base64进行测试
System.out.println(new String(Base64.getDecoder().decode(line)));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String b(String var0) {
if (var0 == null) {
return null;
} else if (var0.isEmpty()) {
return "";
} else {
int var1 = 0;
for (int var2 = var0.length() - 1; var0.charAt(var2) == '='; --var2) {
++var1;
}
int var8 = var0.length() * 6 / 8 - var1;
byte[] var3 = new byte[var8];
int var4 = 0;
for (int var5 = 0; var5 > 8 * (2 - var7) & 255);
}
var4 += 3;
}
return new String(var3, StandardCharsets.UTF_8);
}
}
private static int a(char var0) {
if (var0 >= 'A' && var0 = 'a' && var0 = '0' && var0