破解macOS应用程序(Inklet)

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

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

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

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

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

工具准备

  • brew

  • vim
    不会用的话用 Hex Friend

  • otx

    brew cask install otx
    

可选工具:

  • class-dump

  • gdb

    brew install gdb
    
  • Hopper Disassembler

开始破解

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

反汇编程序

  • 使用otx

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

    打开inklet.asm

  • 使用class-dump

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

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

我先查找了license

class-dump -f license  /Applications/Inklet.app/Contents/MacOS/Inklet
@interface InkletWelcomeLicense : InkletWelcomeBase
- (long long)licenseUpgradeState;

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

inklet.asm中:

-(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动态测试

gdb inklet
> b *0x000000010002856f   #InkletRegisterPreferences函数开始地址
> r
> set *0x0000000100028573 = 0x000001b8
> set *0x0000000100028577 = 0x0fc35d00
> set *0x000000010002857b = 0x0000441f
> disas 0x000000010002856f, +10
> continue

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

修改二进制文件

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

参考文章

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