欢迎光临散文网 会员登陆 & 注册

DBeaver-EE注册分析

2020-02-01 17:35 作者:GCC酱_0ff1c1a1  | 我要投稿

最近拿电脑上另一块SSD装了Fedora玩.在寻找数据库管理软件Navicat替代品的时候发现了DBeaver. 而且EE版太强大,所以我就想要破解看看.

就是这个玩意

0x00 下手

申请一个Trial然后看看许可格式.以下是使用许可.


GcEVPtVH+fzyCX3Jw/b2iDGHIYe20IwwGGzvCaSvgN+SOLyeOfmhTgIXkhhuJsCi7Ov/7Sy2Hpk3

VdHjehLS727GlKOKKKkZ6s9C8bt+Aw4WEhDsivOJpQt5eLUjvDLhZC0ols4R9kIXHRo1KcS5AaHy

8EWhdiuxPOJdHTR01waJUvb4RdH8Ldi2m2CNB93sv1OTMvzoDX1oWUnWGN8mL7K0UU+3ksy06a0O

/AU8wueD1yaXHQp9OML5WmBDZapiuSKoQUH/dPhu6C7XRj1EAiTueNibb9rSfbhlUYKgA/1is4nW

42xwiN3+jzQrBYO1NQIYAlGHxlsJ0+IxqVLHCw==

很明显是Base64编码的内容.根据我之前破GitLab和ElasticSearch的经验来看,里面肯定有加密.那么接下来就分析一下如何加解密.

0x01 静态分析

一般来说我会先用Bytecode-Viewer(下简称BV)来反编译JAR.首选三大反编译器是

  • CFR

  • FernFlower

  • JD-GUI

BV的好处就是可以同时使用多种反编译器进行对比.

那么先进入DBeaver文件夹康康. 找license关键词找不到任何结果,但是有几个东西引起了我的注意. 

事实上这些就是跟许可验证相关的包. 拖入BV

许可验证的包

中了中了. 那随便拉几个类看看?

PublicServiceClient.class
LMEncryption.class
LicenseImportDiaglog.class

为了搞清楚类之间的调用关系,我们可以用IDEA的反编译器,其核心是FernFlower.

关于如何用IDEA反编译JAR以及如何进行调试我会写另外一篇文章来介绍.


从 LicenseImportDiaglog可以看到从文本中导入许可的方法(方法名:importLicenseFromText),那么我们就在IDEA中追下去.

导入
转到实现 用Ctrl+Alt+B

之前说过许可一定是经过加密的,所以下面这个方法就显得非常重要了

导入解密Key

选择第一个

选择

跟下去,发现是从JAR读取

这是一个新的JAR 我们打开看看

找到公钥

Nice,这应该就是解密用的公钥了

读取加密的字符串

庐山真面目

读取加密字符串

其实就是逻辑很简单.如果这一行不是 - 或者 # 开头,就把它读入结果,当读取完成时,将这些内容Base64解密送回.

回来以后就要跟踪这个方法了

从读出来的数据中获取PublicKey

方法反编译如下

其实没啥好说的,标准的Java RSA处理.

Java Security中的Key对象应该是一个泛型? 

因为这个方法返回的对象是 PublicKey 但是 getDecryptionKey 要求返回的是 Key.中间没看到任何强制转换,所以我猜测 Key 对象可以包含 PrivateKey 和 PublicKey 两种对象.

分析完 Key 读取接下来分析如何解密许可


new了一个LMLicense实例

LMLicense.class反编译内容过长,这里我就只放出类内变量

LMLicense类内变量

有内味了.这里应该就是许可的具体数据了.

在构造方法中看到了解密

解密方法

好 跟下去看解密

哦 标准的 RSA/ECB/PKCS1Padding 加解密啊.

至此,解密流程已经清楚了. 用一句话概括就是Base64解密以后再用 RSA/ECB/PKCS1Padding 进行解密.

0x02 许可格式分析

下面就是如何读取许可数据了,是一个字节数组. 代码截图过长我就不放了.下面只放结果

貌似B站这个编辑器里没看到表格? 那我只能放截图了

许可格式

许可格式2
许可格式3

至于然后就是一些对类内变量的Getter和Setter,没啥好说的.

下面还有一些方法是做判定的,没有细读,就不放出来了.

0x03 联网验证分析

从 com.dbeaver.lm.core 包中找到的 com.dbeaver.lm.validate.PublicServiceClient 类记录了联网验证.

这里说一下FernFlower的特性(Bug x

如果定义了 public static final String 或者其他什么带有 P/S/F 三种特性的常量,并且在下面有调用的话. FernFlower会用变量内容替换掉下面的变量名.

FernFlower
CFR

主要的联网验证有三个方法

  • ping 应该是用来测试服务器的. 返回内容是"pong".

  • checkCustomerEmail 检查用户邮箱和许可是否符合? 正确的话返回用户id

  • generateTrialLicense 申请试用许可,下文再谈

  • checkLicenseStatus 检查许可状态,符合返回 "VALID: Ok".不符合返回示例"INVALID: License 'DB-ZS1MPZK4--FVC' not found"

接下来说一下他是如何申请试用许可的.

调用 generateLicenseRequest 方法来一段XML.


XML生成

生成的XML大概样子如下

<?xml version="1.0" encoding="UTF-8"?>

<request license="trial" productId="dbeaver-ee" productVersion="6.3">

<customer email="宁の邮箱" firstName="XXX" lastName="XXX" company=""></customer>

</request>

发送到 https://dbeaver.com/lmp/generateTrialLicense

请求试用许可

这里图中的utilmate只是自己随便玩乱写的,实际上写什么获取到的都是Trial许可.

0x04 动态调试

嘛,没什么好说的,给DBeaver加上Java的启动参数 然后IDEA连接到调试即可.

在已知的几个地方下断点,然后导入一份试用许可去看流程.

主要是跟踪一下他导入密钥的全过程,梳理一遍而已.

0x05 总结

DBeaver许可和注册就分析到这里.更多内容见稍后发布的视频.

DBeaver-EE注册分析的评论 (共 条)

分享到微博请遵守国家法律