DbSchema工具分析01-解析加密的properties内容

查看 44|回复 6
作者:niwajiang   
在做数据库结构设计时一直没有趁手的工具。发现DbSchema用着还不错。好的工具都少不了收费的特征,所以准备研究下。

由于整体还挺复杂,研究时间也不完整,所以准备分帖一点点的处理。

解析加密的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]
  • 静态代码块调用方法处理resource下的properties文件
  • 读取文件流
  • 在Px.a中处理文件流
    [/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]
  • 逐行读取properties
  • 使用SimpleEncrypt.b对行内容进行解码
  • 将解码内容装置到Properties里
    [/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

    内容, 文件

  • heliotrope   

    虽然看不懂,还是支持一下!!!
    xueyinglantian   

    respect
    膜拜一下
    gy001715   

    看不太懂。
    liyaohui0000   

    厉害,支持一下
    pojie小萌新   

    我也想学,可是好像看不懂
    pedoc   

    没想到还有人分析这个软件,我也分享一下
    多年前研究了一下,在v8以上版本,验证机制就有变化,看了一下最新的是9.7.5,但是逻辑还是可用
    对于v9,核心验证逻辑位于 com.wisecoders.dbs.sys.License.class, 其中,对于license的签名校验逻辑
      private static boolean a(byte[] paramArrayOfbyte1, byte[] paramArrayOfbyte2, String paramString) {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(paramString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initVerify(publicKey);
        signature.update(paramArrayOfbyte1);
        return signature.verify(paramArrayOfbyte2);
      }
    所以对于v8.x以上版本来说,核心思想就是替换publickey,然后生成符合要求的license即可
    对于v9,多了一个额外的离线验证机制,不过这个url服务器没做什么校验,直接访问就可以拿到所谓的Response Code,填进去就行
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部