iStat Menus 6 逆向分析實戰 | Makito Log

iStat Menus 6 逆向分析實戰

文內不含布丁下載,推薦購買正版或進行舊版升級。

前言#

最近我的 iStat Menus 從第五版更新到了第六版,新版的確較舊版加入了很多很棒的功能,但因升級改動較大,需要付費進行升級(詳見官方解答)。進入新版,還是熟悉的“試用——倒計時——到期要求輸入授權碼”的模式。閒着也是閒着,就研究了幾天做了個破解布丁出來。

初探#

第一件事情肯定是反編譯了,不然就是佛系調試法了。拿到彙編之後根據 RBQ 字符串,定位到相關函數,順便理清授權碼的驗證流程。

經過簡單分析和理清驗證流程後,可以說 iStat Menus 6(後略稱 ISM 6)和前幾版有所不同。如下圖所示,這個版本的授權碼的工作原理類似於數字簽名。

授權碼驗證流程
授權碼驗證流程

另外也可以看到 ISM 6 調用了 Security 框架提供的一系列函數,如下。

...
mov rdi, [rbp+var_50]
mov rsi, r15
call _SecVerifyTransformCreate
mov rbx, rax
...
mov rdi, rbx
mov rsi, [rbp+var_48]
mov rdx, [rbp+var_30]
call _SecTransformSetAttribute
...
mov rax, cs:_kSecDigestSHA1_ptr
mov rdx, [rax]
xor ecx, ecx
mov rdi, rbx
call _SecTransformSetAttribute
...

這也證明了它的驗證環節確實與公鑰有一些關聯,但如果授權碼是以如上分析的方式簽發的話,在沒有私鑰的情況下,我們沒有必要也無法自己簽發授權碼。也正因爲如此,網絡上 ISM 6 的 Keygen 類軟件較爲難覓蹤跡,多數爲 ISM 5.X 的 Keygen,可見這個舉措在一定程度上也遏制了 Keygen 的開發。

篇幅有限,更多的細節就不講啦。

鬥智鬥勇#

事實上,ISM 6 不僅在驗證方式上有所不同,它也在傳遞敏感信息(Public Key 在它眼中也算是敏感數據了)的時候用了一些迷惑眼球的手段。

使用 lldb 調試過程中,可以發現一個奇怪的現象:在授權碼驗證環節或是註冊頁面中,ISM 6 都使用 NSMutableDictionary 來傳遞一些數據,它們有時候看起來是下面這樣的:

{
  version: '<SecKeyRef: 0xBLAHBLAH>'
}

有時候看起來是這樣的:

{
    CPU: "<SecKeyRef: 0xBLAHBLAH>",
    memory: 1517411649
}

(╯‵□′)╯︵┻━┻ 騙誰呢!名字和數據類型都對不上好伐。這個 SecKeyRef 看起來就很可疑,推測極有可能就是公鑰。

跟進中發現 RegistrationController 的 keys 初始爲 {},其會在某一時刻變爲從 AppDelegate 的 extras 取到的如上述般的結構。

在無數次重新下斷點之後,終於找到了縮在一角的 BASE64 編碼的字串,還經過了 AES256 加密。

找到密碼,解密即得到公鑰。

-----BEGIN PUBLIC KEY-----
MIHxMIGoBgcqhkjOOAQBMIGcAkEAmmr4W1k2iv2niCB7c8CSbQfu8L1GX1qEF4UE
0tDdSsX1QBj8s3UGNJOP72Bju/Fi69k5HGSWYDQGMTh/bS/srwIVAOpDWd8Vlhfh
BKXEef81VyMSyi/lAkBuON8PM5r7aHIZFyGFav/5afqML18Cp+LbzWU9XmAzOS9c
t/ybKfWxel7e/aRmNZsb9S6JmW8l9CUubMTiZhmQA0QAAkEAiO2fAqqMg/mHjSRw
AxiSoUOsAL4Uwgpy73FMFHuJnV0wwuyJY9xMKGSh2CEG3ah0sUcZFCIAFyDlajIJ
ZE9tRw==
----- END PUBLIC KEY -----

雖然也沒啥用的感覺。

敏感字符串總歸會有被恢復出來的可能,怎麼處理就只能各憑本事了。

布丁程序#

接下來說說布丁吧,猴急的孩子們可以直接看這裏,上面也提到了沒有私鑰去做 Keygen 不太現實,於是我就做了一個 Patcher 來完成挑戰。

安裝 ISM 6#

首先啓動新安裝的 ISM 6,並且完成初次使用安裝步驟,若這一步沒有完成,布丁醬將無法找到正確的布丁注入點。

完成初次使用安裝
完成初次使用安裝

可以看到,ISM 6 現在是待註冊試用狀態,左下右上均有相關提示。

試用狀態
試用狀態

用完試用天數就會這個樣子:

管理面板
管理面板

系統托盤內菜單也因使用結束而出現提示
系統托盤內菜單也因使用結束而出現提示

應用布丁#

布丁自用,以下僅展示截圖,不提供下載。

布丁雙擊即可運行:

正常情況下只需要點擊 Patch 按鈕即可自動應用布丁。

在應用布丁之前,需要運行一次 ISM 6 讓其完成安裝
在應用布丁之前,需要運行一次 ISM 6 讓其完成安裝

在應用過程中可能會出現提示授權的窗口:

這是因爲 ISM 6 分爲 /Applications/iStat Menus_app/Contents/MacOS/iStat Menus/Library/Application Support/iStat Menus 6/iStat Menus Status_app/Contents/MacOS/iStat Menus Status 兩部分,前者則是管理設置面板,後者控制系統托盤菜單,對後者的修改和替換需要進行鑑權。路徑包含空格,此處爲防止 .app 被解析爲域名,替換爲了 _app

那麼如果不想要鑑權呢?

把上述位置的 iStat MenusiStat Menus Status 拖放到這個區域中就可以應用布丁,應用後記得把文件替換回原有的位置(操作前建議備份)。

最後的工作#

替換之後,在管理面板中點擊按鈕禁用再啓用一下托盤菜單,就可以完成托盤菜單部分的破解啦。

然後再使用 CMD + Q 退出管理面板(kill -9 也可以總之開心就好),重新啓動 ISM 6 管理面板,此時已經不會有授權狀態檢查了,至此破解完成。

已破解的管理面板
已破解的管理面板

後記#

這次可以說也是把逆向和破解軟件當成了一次挑戰,在試用天數的倒計時下破解軟件還是蠻刺激的。不同於閱讀開源項目的代碼,這種分析代碼的方式帶給我的是一個站在不同的角度看代碼「如何實現」的機會,去進一步瞭解調用約定、X86_64 寄存器工作原理等,也在其中更靈活地思考。同時也確實體會到了代碼的安全性只能是相對的,並且只能以時間成本來換取相對的「安全」。要是遇到真正的閒人就不好說了。

但是,破解也並非好事。同爲個人開發者,還是希望個人開發者們可以多多受到支持,精心打磨的軟件必然少不了時間和經歷的投入,並且大多數開發者也是興趣驅動,經濟收入只能說是錦上添花,畢竟,沒有全身上下都是肝的肝帝

文中可能存在錯誤之處,歡迎交流。

轉載本篇文章前請先聯繫我,謝謝。