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 分为 /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 寄存器工作原理等,也在其中更灵活地思考。同时也确实体会到了代码的安全性只能是相对的,并且只能以时间成本来换取相对的「安全」。要是遇到真正的闲人就不好说了。

但是,破解也并非好事。同为个人开发者,还是希望个人开发者们可以多多受到支持,精心打磨的软件必然少不了时间和经历的投入,并且大多数开发者也是兴趣驱动,经济收入只能说是锦上添花,毕竟,没有全身上下都是肝的肝帝

文中可能存在错误之处,欢迎交流。

转载本篇文章前请先联系我,谢谢。