背景
由于最近 cyberleek 的行为,不禁让我想起之前我还有个 Hacker Dream…
下面是 Typora 最新版的破解教程,大佬可直接到进阶查看。
搜索
这种包含 license 的程序,思路大概就是让获取 license 的变量恒为 true。把二进制拖进 Hopper,搜索 license。
分析

可以看到一个 License Manager 类,这玩意儿十有八九有搞头。然后注意到一个叫做 hasLicense 的方法,
打开伪代码一看,我们直接让这个函数 return true 不就好了吗?
/* @class LicenseManager */ |
修改 hasLicense
找到两处需要修改的地方




ldr x0, [x0, #0x18] -> mov w0, #1 |
由于我的 Hopper 是 Demo 版,没办法保存,所以只能用 vi 修改,硬生生撸二进制….
上述图中标注的 00 0c 40 f9 和 40 00 00 b4 就是原始命令对应的十六进制,所以只要把它们修改成需要的 20 00 80 52 和 c0 03 5f d6 即可。

图中标红的就是我们修改的 所以我们去二进制文件根据对应位置修改就好了
坑点
- Hopper 中显示的地址与文件偏移不完全一致。
- 解决办法:可以用相邻的关键字匹配。
- 不要直接修改
/Applications/Typora.app/Contents/MacOS/Typora,先复制到用户目录操作。(macOS 最新的安全限制会导致此处只能读取,无法直接修改。)- 解决办法:
cp /Applications/Typora.app/Contents/MacOS/Typora ~/Downloads/Typora && vi ~/Downloads/Typora
- 解决办法:
进入 vi 后,使用 :%!xxd 查看十六进制,然后使用 /<keywords> 搜索关键字。

找到我们需要修改的地方替换就好了
00 0c 40 f9 -> 20 00 80 52 |
然后使用 :%!xxd -r 转回二进制,再执行 :wq 保存退出。
重签名

打开钥匙串,然后通过屏幕左上角菜单栏创建证书,选择自签名和代码签名,一直继续即可。
使用 codesign -f -s gdb-cert ~/Downloads/Typora 进行签名,然后把二进制移回原位置,打开即可。
进阶
前面的步骤简述一下:找到 hasLicense,然后让这个函数恒定返回 true。

其实这里解决的是激活弹窗不再主动弹出,能够正常使用问题解决的七七八八了,但是呢会有一个很不爽的点.下方有一个未激活的icon 以及确实我们没有彻底破解还是没有激活 只是绕了一下.
中国有句老话:来都来了 那就顺手修了吧
我们接着分析,发现还有两个地方会读取是否存在 license,分别是 readLicenseInfo 和 unfillLicense。
readLicenseInfo

代码片段太长了,但是这里面有一个突出的点:r0 = [NSNumber numberWithBool:r20];,所以这里还是那个思路,返回 true 即可。

把 mov x2, x20 变成 mov x2, #1 即可。

记录一下十六进制的变化:
readLicenseInfo: e2 03 14 aa -> 22 00 80 d2 |
unfillLicense
/* @class LicenseManager */ |
看到代码敏感肌又起来了…. ___kCFBooleanFalse,不过看了一下,这个地方没办法直接赋值 #1,所以得逆向思维一下:如果有 kCFBooleanFalse,那么就有 kCFBooleanTrue,对吧?

结果一搜果然有 那还说啥了 偷梁换柱….


记录一下十六进制变化:
08 9d 41 f9 -> 08 a1 41 f9 |
验证结果
根据上述位置修改之后,会发现下方未激活的 icon 也不见了。然后在菜单栏点击“我的许可证”。


发现已经激活。点击查看序列号,没错,破解完成 🎉 🎉 🎉 🎉
总结
破解的第一款软件,记录一下 ✌️