破解macOS应用程序(Inklet)

Inklet 是一个可以把笔记本触摸板变成简易数位板的 macOS 应用程序

软件售价 $19.98, 软件加没什么用的笔售价 $24.98 Demo 版下载 Demo 版有连续使用时间等限制

上网课我需要用到, 所以我就在网上找了个 v2.1.1 的破解版用

发现官方更新到了 v2.2.0, 但是网上找不到此版本破解版/激活码

那就自己动手吧, 先棒读:仅供学习交流使用,严禁用于商业用途,请于 24 小时内删除。请支持正版

工具准备

  • brew

  • vim 不会用的话用 Hex Friend

  • otx

    1
    brew cask install otx

可选工具:

  • class-dump

  • gdb

    1
    brew install gdb
  • Hopper Disassembler

开始破解

程序的二进制文件位于/Applications/Inklet.app/Contents/MacOS/Inklet

反汇编程序

  • 使用 otx

    1
    otx /Applications/Inklet.app/Contents/MacOS/Inklet > ~/Desktop/inklet.asm

    打开inklet.asm

  • 使用 class-dump

    1
    class-dump -H /Applications/Inklet.app/Contents/MacOS/Inklet -o ~/classdump

找到返回注册信息程序的对应位置

我先查找了license

1
class-dump -f license  /Applications/Inklet.app/Contents/MacOS/Inklet
1
2
3
4
5
6
@interface InkletWelcomeLicense : InkletWelcomeBase
- (long long)licenseUpgradeState;

@interface InkletRegisterPreferences : NSPreferencesModule
- (BOOL)licenseState;
- (BOOL)unlicensedWithPreviousLicense;

inklet.asm中:

1
2
3
4
5
6
7
-(BOOL)[InkletRegisterPreferences licenseState]:
+0 000000010002856f 55 pushq %rbp
+1 0000000100028570 4889e5 movq %rsp, %rbp
+4 0000000100028573 488b0516060500 movq 0x50616(%rip), %rax
+11 000000010002857a 0fbe0407 movsbl (%rdi,%rax), %eax
+15 000000010002857e 5d popq %rbp
+16 000000010002857f c3 retq

猜测是InkletRegisterPreferences中的(BOOL)licenseState返回注册状态, 所以只需要让它的值一直返回 True 就很可能破解成功

修改程序

持续返回 True 的程序的机器码来自这里 省事很多 ww

使用 gdb 动态测试

1
2
3
4
5
6
7
8
gdb inklet
> b *0x000000010002856f #InkletRegisterPreferences函数开始地址
> r
> set *0x0000000100028573 = 0x000001b8
> set *0x0000000100028577 = 0x0fc35d00
> set *0x000000010002857b = 0x0000441f
> disas 0x000000010002856f, +10
> continue

测试成功, 原来的时间限制已经解锁了

修改二进制文件

1
2
vim /Applications/Inklet.app/Contents/MacOS/Inklet
:%!xxd

找到554889e5488b05160605000fbe04075d 改为554889e5b8010000005dc30f1f440000

如果修改后打不开那就给它签个名试试?(我这直接就能打开了)

技术总结

收集信息和探索:对二进制文件展开成人类可读的形式后,使用关键词进行搜索,定位阻碍我们流畅使用该应用的函数。这一步耗时最长,需要仔细摆弄软件获得灵感,并且直接决定能否成功。一般搜索关键词如 activate、purchase、register、trial 之类,也可以结合具体应用和想要的效果选取。例如对于弹窗的应用,不一定非要“破解”,只要能屏蔽广告就行,那么可以使用 dialog、window 之类的关键词搜索。这个阶段使用的工具主要目的是为了把 binary format 妆换成 human-readable format,工具例如:hopper、otx、class-dump 都可以满足,class-dump 信息清晰一些。

如果上一步定位了目标函数,则需要弄清这个函数的输入输出,并撰写编译自己后面用来替换的函数。比如目标函数通过判断用户身份返回是否合法,合法 true 不合法 false。那么我们就建立一个 C 文件写一个永远返回 true 的函数编译出二进制。如果一个目标是一个返回 void 的弹窗函数,那么我们就让这个函数调用后立马 return,跳过后面花里胡哨的广告展示逻辑。这个阶段用到的工具是 C 语言编译器,如 gcc。

找到目标函数的虚拟内存地址。工具: hopper 或 otx 都可以满足。

通过上面的内存地址获取代码在二进制文件中的位置。工具: offset 脚本。

使用自己的函数逻辑替换二进制文件 offset 处原逻辑。工具:vim && xxds

测试是否成功。不成功重复上述步骤,或者 google 高阶破解技巧,或者放弃。

转自技术总结 by Zhengyu Zhang

参考文章

  • 记录一次 OSX 软件破解
  • 一个数字的魔法——破解 Mac 上 198 元的 Paw

如果没有这些文章, 这次破解将会变得非常耗时且难以成功, 感谢!