DBeaver-EE注册分析
最近拿电脑上另一块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

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



为了搞清楚类之间的调用关系,我们可以用IDEA的反编译器,其核心是FernFlower.
关于如何用IDEA反编译JAR以及如何进行调试我会写另外一篇文章来介绍.
从 LicenseImportDiaglog可以看到从文本中导入许可的方法(方法名:importLicenseFromText),那么我们就在IDEA中追下去.


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

选择第一个

跟下去,发现是从JAR读取

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


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

庐山真面目

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

方法反编译如下

其实没啥好说的,标准的Java RSA处理.
Java Security中的Key对象应该是一个泛型?
因为这个方法返回的对象是 PublicKey 但是 getDecryptionKey 要求返回的是 Key.中间没看到任何强制转换,所以我猜测 Key 对象可以包含 PrivateKey 和 PublicKey 两种对象.
分析完 Key 读取接下来分析如何解密许可

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

有内味了.这里应该就是许可的具体数据了.
在构造方法中看到了解密

好 跟下去看解密

哦 标准的 RSA/ECB/PKCS1Padding 加解密啊.
至此,解密流程已经清楚了. 用一句话概括就是Base64解密以后再用 RSA/ECB/PKCS1Padding 进行解密.
0x02 许可格式分析
下面就是如何读取许可数据了,是一个字节数组. 代码截图过长我就不放了.下面只放结果
貌似B站这个编辑器里没看到表格? 那我只能放截图了



至于然后就是一些对类内变量的Getter和Setter,没啥好说的.
下面还有一些方法是做判定的,没有细读,就不放出来了.
0x03 联网验证分析
从 com.dbeaver.lm.core 包中找到的 com.dbeaver.lm.validate.PublicServiceClient 类记录了联网验证.
这里说一下FernFlower的特性(Bug x
如果定义了 public static final String 或者其他什么带有 P/S/F 三种特性的常量,并且在下面有调用的话. FernFlower会用变量内容替换掉下面的变量名.


主要的联网验证有三个方法
ping 应该是用来测试服务器的. 返回内容是"pong".
checkCustomerEmail 检查用户邮箱和许可是否符合? 正确的话返回用户id
generateTrialLicense 申请试用许可,下文再谈
checkLicenseStatus 检查许可状态,符合返回 "VALID: Ok".不符合返回示例"INVALID: License 'DB-ZS1MPZK4--FVC' not found"
接下来说一下他是如何申请试用许可的.
调用 generateLicenseRequest 方法来一段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许可和注册就分析到这里.更多内容见稍后发布的视频.

