Typora V1.14.9 破解

背景

由于最近 cyberleek 的行为,不禁让我想起之前我还有个 Hacker Dream…
下面是 Typora 最新版的破解教程,大佬可直接到进阶查看。

搜索

这种包含 license 的程序,思路大概就是让获取 license 的变量恒为 true。把二进制拖进 Hopper,搜索 license。

分析

Typora License Manager

可以看到一个 License Manager 类,这玩意儿十有八九有搞头。然后注意到一个叫做 hasLicense 的方法,
打开伪代码一看,我们直接让这个函数 return true 不就好了吗?

/* @class LicenseManager */
-(bool)hasLicense {
r0 = self[0x3];
if (r0 != 0x0) {
r0 = [r0 boolValue];
}
else {
r0 = 0x1;
}
return r0;
}

修改 hasLicense

找到两处需要修改的地方

Typora License Manager
Typora License Manager
Typora License Manager
Typora License Manager

ldr x0, [x0, #0x18]  ->  mov w0, #1
cbz x0, -[LicenseManager hasLicense]+12 -> ret

由于我的 Hopper 是 Demo 版,没办法保存,所以只能用 vi 修改,硬生生撸二进制….

上述图中标注的 00 0c 40 f9 和 40 00 00 b4 就是原始命令对应的十六进制,所以只要把它们修改成需要的 20 00 80 52 和 c0 03 5f d6 即可。

Typora License Manager

图中标红的就是我们修改的 所以我们去二进制文件根据对应位置修改就好了

坑点

  • Hopper 中显示的地址与文件偏移不完全一致。
    • 解决办法:可以用相邻的关键字匹配。
  • 不要直接修改 /Applications/Typora.app/Contents/MacOS/Typora,先复制到用户目录操作。(macOS 最新的安全限制会导致此处只能读取,无法直接修改。)
    • 解决办法:cp /Applications/Typora.app/Contents/MacOS/Typora ~/Downloads/Typora && vi ~/Downloads/Typora

进入 vi 后,使用 :%!xxd 查看十六进制,然后使用 /<keywords> 搜索关键字。

Typora License Manager

找到我们需要修改的地方替换就好了

00 0c 40 f9 -> 20 00 80 52
40 00 00 b4 -> c0 03 5f d6

然后使用 :%!xxd -r 转回二进制,再执行 :wq 保存退出。

重签名

Typora License Manager

打开钥匙串,然后通过屏幕左上角菜单栏创建证书,选择自签名和代码签名,一直继续即可。

使用 codesign -f -s gdb-cert ~/Downloads/Typora 进行签名,然后把二进制移回原位置,打开即可。

进阶

前面的步骤简述一下:找到 hasLicense,然后让这个函数恒定返回 true。

Typora License Manager

其实这里解决的是激活弹窗不再主动弹出,能够正常使用问题解决的七七八八了,但是呢会有一个很不爽的点.下方有一个未激活的icon 以及确实我们没有彻底破解还是没有激活 只是绕了一下.

中国有句老话:来都来了 那就顺手修了吧

我们接着分析,发现还有两个地方会读取是否存在 license,分别是 readLicenseInfo 和 unfillLicense。

readLicenseInfo

Typora License Manager

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

Typora License Manager

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

Typora License Manager
记录一下十六进制的变化:

readLicenseInfo: e2 03 14 aa -> 22 00 80 d2

unfillLicense

/* @class LicenseManager */
-(void)unfillLicense {
var_10 = r20;
decomp_var_8 = r19;
r31 = r31 + 0xffffffffffffffe0;
saved_fp = r29;
decomp_var_m8 = r30;
r19 = self;
r20 = [self hasLicense];
r0 = r19[0x3];
r19[0x3] = *___kCFBooleanFalse;
[r0 release];
r0 = objc_opt_new();
r8 = r19[0x1];
r19[0x1] = r0;
[r8 release];
[r19[0x1] setObject:r19[0x2] forKeyedSubscript:@"installDate"];
[r19 writeLicenseInfo];
[r19 writeLicenseInfoOld];
if (r20 != 0x0) {
[r19 postNotification];
}
return;
}

看到代码敏感肌又起来了…. ___kCFBooleanFalse,不过看了一下,这个地方没办法直接赋值 #1,所以得逆向思维一下:如果有 kCFBooleanFalse,那么就有 kCFBooleanTrue,对吧?

Typora License Manager

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

Typora License Manager

Typora License Manager

记录一下十六进制变化:

08 9d 41 f9 -> 08 a1 41 f9

验证结果

根据上述位置修改之后,会发现下方未激活的 icon 也不见了。然后在菜单栏点击“我的许可证”。

Typora License Manager

Typora License Manager
发现已经激活。点击查看序列号,没错,破解完成 🎉 🎉 🎉 🎉

总结

破解的第一款软件,记录一下 ✌️

参考