DBeaver-EE注冊(cè)分析

最近拿電腦上另一塊SSD裝了Fedora玩.在尋找數(shù)據(jù)庫(kù)管理軟件Navicat替代品的時(shí)候發(fā)現(xiàn)了DBeaver. 而且EE版太強(qiáng)大,所以我就想要破解看看.


0x00 下手
申請(qǐng)一個(gè)Trial然后看看許可格式.以下是使用許可.
GcEVPtVH+fzyCX3Jw/b2iDGHIYe20IwwGGzvCaSvgN+SOLyeOfmhTgIXkhhuJsCi7Ov/7Sy2Hpk3
VdHjehLS727GlKOKKKkZ6s9C8bt+Aw4WEhDsivOJpQt5eLUjvDLhZC0ols4R9kIXHRo1KcS5AaHy
8EWhdiuxPOJdHTR01waJUvb4RdH8Ldi2m2CNB93sv1OTMvzoDX1oWUnWGN8mL7K0UU+3ksy06a0O
/AU8wueD1yaXHQp9OML5WmBDZapiuSKoQUH/dPhu6C7XRj1EAiTueNibb9rSfbhlUYKgA/1is4nW
42xwiN3+jzQrBYO1NQIYAlGHxlsJ0+IxqVLHCw==
很明顯是Base64編碼的內(nèi)容.根據(jù)我之前破GitLab和ElasticSearch的經(jīng)驗(yàn)來(lái)看,里面肯定有加密.那么接下來(lái)就分析一下如何加解密.
0x01 靜態(tài)分析
一般來(lái)說(shuō)我會(huì)先用Bytecode-Viewer(下簡(jiǎn)稱BV)來(lái)反編譯JAR.首選三大反編譯器是
CFR
FernFlower
JD-GUI
BV的好處就是可以同時(shí)使用多種反編譯器進(jìn)行對(duì)比.
那么先進(jìn)入DBeaver文件夾康康. 找license關(guān)鍵詞找不到任何結(jié)果,但是有幾個(gè)東西引起了我的注意.?


事實(shí)上這些就是跟許可驗(yàn)證相關(guān)的包. 拖入BV

中了中了. 那隨便拉幾個(gè)類看看?



為了搞清楚類之間的調(diào)用關(guān)系,我們可以用IDEA的反編譯器,其核心是FernFlower.
關(guān)于如何用IDEA反編譯JAR以及如何進(jìn)行調(diào)試我會(huì)寫另外一篇文章來(lái)介紹.
從 LicenseImportDiaglog可以看到從文本中導(dǎo)入許可的方法(方法名:importLicenseFromText),那么我們就在IDEA中追下去.


之前說(shuō)過許可一定是經(jīng)過加密的,所以下面這個(gè)方法就顯得非常重要了

選擇第一個(gè)

跟下去,發(fā)現(xiàn)是從JAR讀取

這是一個(gè)新的JAR 我們打開看看


Nice,這應(yīng)該就是解密用的公鑰了

廬山真面目

其實(shí)就是邏輯很簡(jiǎn)單.如果這一行不是 - 或者 # 開頭,就把它讀入結(jié)果,當(dāng)讀取完成時(shí),將這些內(nèi)容Base64解密送回.
回來(lái)以后就要跟蹤這個(gè)方法了

方法反編譯如下

其實(shí)沒啥好說(shuō)的,標(biāo)準(zhǔn)的Java RSA處理.
Java Security中的Key對(duì)象應(yīng)該是一個(gè)泛型??
因?yàn)檫@個(gè)方法返回的對(duì)象是 PublicKey 但是?getDecryptionKey 要求返回的是 Key.中間沒看到任何強(qiáng)制轉(zhuǎn)換,所以我猜測(cè) Key 對(duì)象可以包含 PrivateKey 和 PublicKey 兩種對(duì)象.
分析完 Key 讀取接下來(lái)分析如何解密許可

LMLicense.class反編譯內(nèi)容過長(zhǎng),這里我就只放出類內(nèi)變量

有內(nèi)味了.這里應(yīng)該就是許可的具體數(shù)據(jù)了.
在構(gòu)造方法中看到了解密

好 跟下去看解密

哦 標(biāo)準(zhǔn)的?RSA/ECB/PKCS1Padding 加解密啊.
至此,解密流程已經(jīng)清楚了. 用一句話概括就是Base64解密以后再用?RSA/ECB/PKCS1Padding 進(jìn)行解密.
0x02 許可格式分析
下面就是如何讀取許可數(shù)據(jù)了,是一個(gè)字節(jié)數(shù)組. 代碼截圖過長(zhǎng)我就不放了.下面只放結(jié)果
貌似B站這個(gè)編輯器里沒看到表格? 那我只能放截圖了



至于然后就是一些對(duì)類內(nèi)變量的Getter和Setter,沒啥好說(shuō)的.
下面還有一些方法是做判定的,沒有細(xì)讀,就不放出來(lái)了.
0x03 聯(lián)網(wǎng)驗(yàn)證分析
從 com.dbeaver.lm.core 包中找到的?com.dbeaver.lm.validate.PublicServiceClient 類記錄了聯(lián)網(wǎng)驗(yàn)證.
這里說(shuō)一下FernFlower的特性(Bug x
如果定義了 public static final String 或者其他什么帶有 P/S/F 三種特性的常量,并且在下面有調(diào)用的話. FernFlower會(huì)用變量?jī)?nèi)容替換掉下面的變量名.


主要的聯(lián)網(wǎng)驗(yàn)證有三個(gè)方法
ping 應(yīng)該是用來(lái)測(cè)試服務(wù)器的. 返回內(nèi)容是"pong".
checkCustomerEmail 檢查用戶郵箱和許可是否符合? 正確的話返回用戶id
generateTrialLicense 申請(qǐng)?jiān)囉迷S可,下文再談
checkLicenseStatus 檢查許可狀態(tài),符合返回 "VALID: Ok".不符合返回示例"INVALID: License 'DB-ZS1MPZK4--FVC' not found"
接下來(lái)說(shuō)一下他是如何申請(qǐng)?jiān)囉迷S可的.
調(diào)用?generateLicenseRequest 方法來(lái)一段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>
發(fā)送到?https://dbeaver.com/lmp/generateTrialLicense

這里圖中的utilmate只是自己隨便玩亂寫的,實(shí)際上寫什么獲取到的都是Trial許可.
0x04 動(dòng)態(tài)調(diào)試
嘛,沒什么好說(shuō)的,給DBeaver加上Java的啟動(dòng)參數(shù) 然后IDEA連接到調(diào)試即可.
在已知的幾個(gè)地方下斷點(diǎn),然后導(dǎo)入一份試用許可去看流程.
主要是跟蹤一下他導(dǎo)入密鑰的全過程,梳理一遍而已.
0x05 總結(jié)
DBeaver許可和注冊(cè)就分析到這里.更多內(nèi)容見稍后發(fā)布的視頻.