前言

破解僅作爲學習交流使用, 不用作任何商業目的。
以下所有描述和截圖均經過脫敏處理。

從朋友那收來了一批好玩的 IC (不方便透露 XD), 但是發現用它需要許可證, 好像還要簽保密協議之類的。
因爲自己是散戶人家肯定也不願意跟我簽的x, 所以沒辦法只能另尋他路了。

這個東西還比較小衆, 玩的人不多, 所以幾乎也沒辦法搜到太多資料。
於是抱著試一試的心態打開了 IDA, 想看看能不能找出來什麽東西。

大吃一斤

什麽? 我這麽菜的也能撿到漏? 不會吧不會吧不會吧?

來看一下它的啓動邏輯

img
img

邏輯很簡單。
啓動時會檢查一下授權, 如果授權不存在或者失效則彈出錯誤框, 並啓動一個授權配置程式並退出自己。
如果授權有效, 則加載主窗口。

不是… 就這?
在我對於破解的經驗中, 不應該是會讓我原地放棄的, 鋪天蓋地的混淆亂碼和一堆「Invalid Instructions」嗎?
怎麽今天讓我撿到漏了 (

順水推舟

既然它校驗的方法這麽簡單, 那乾脆直接爆破, 改掉 check_license 函數的返回值就可以了,
比如在這個函數頂部清棧並 ret 0 就可以實現。

但萬萬沒想到的是, 它竟然在很多地方(指各種負責次要功能的 exe) 都加了這種校驗。
那就非常棘手了, 不可能所有文件我都去打補丁嘛, 而且找起來也是非常麻煩。

而且順帶, 我發現它竟在 exe 内嵌入了一個 RSA Public Key。
img
並且驗證邏輯都是依賴於 OpenSSL 去算 RSA 簽名的。
那麽, 能不能把他的 Public 換成我們自己生成的呢? (好像是一個更優雅的辦法)

於是, 就手動生成了一個1024 位的 RSA Keypair, 再用 HXD 找到它原來 Public 的位置, 替換掉。
最後按照他驗證的方法去逆著生成一個假 License 喂給 IDE。
然後它真的能用。

於是乎, 矛頭就指向了無辜的 「OpenSSL」。 (怎麽又是你, 太慘了)
img

破解思路

反匯編上邊那個 load_key 函數,
img

畢竟破解要盡可能以保證原有功能正常為前提,
所以我的目光來到了 BIO_new_mem_buf 這個函數上。

使用它作爲破解點有幾個好處

  • 可以插入判斷 Public 的代碼, 防止破壞了原有的功能
  • 由於是動態庫上的公開 API 函數, 方便快速定位
  • 工作量小, 多個程式都會使用此 API 來加載 Public, 一処破解全部破解

經過簡單修補之後, 換上了我們自己的 Public, 最終它變成了這樣
img

大概是先判斷一下調用方傳過來的 Public 是不是我們想要的,
如果是則直接換成我們自己的, 並調用原來的 BIO_new_mem_buf, 否則不干涉原始執行流程。

典型的 MITM 攻擊 (Man In The Middle)。

試一試

換上之前生成好的假 License,
img

至此, 手動破解結束。