预备工具:

  • Hopper Disassembler: 用于反汇编
  • Hex Fiend: 用于修改二进制文件

注意:由于我不知道如何使用 Hopper Disassembler 修改二进制文件,因此我需要用 Hex Fiend, 这里 Hex Fiend 不是必须的,任何十六进制编辑器都可以使用。

首先,使用 Hopper Disassembler 打开Tower.app/Contents/Frameworks/FNLicensing.framework/Versions/A/FNLicensing, 搜索FNProductStatus_productLicense方法,定位到此方法,记录下前三个汇编指令的机器码,比如

位置 机器码 汇编 变量
000000000000c410 55 push rbp
000000000000c411 4889E5 mov rbp, rsp
000000000000c414 488B05ADB40100 mov rax, qword [ds:_OBJC_IVAR_$_FNProductStatus._productLicense]

则二进制机器码为554889E5488B05ADB40100.

然后,使用 Hex Fiend 打开 Tower.app/Contents/Frameworks/FNLicensing.framework/Versions/A/FNLicensing ,搜索 554889E5488B05ADB40100,如果只有一处,则直接替换为 31C0FFC0C38B05ADB40100. 这里的关键是将554889E548 替换为 31C0FFC0C3, 后面的机器码是相通的,增加后面的机器码是为了尽可能定位到修改的位置。替换后的程序结构为

位置 机器码 汇编 变量
000000000000c410 31C0 xor eax,eax
000000000000c412 FFC0 inc eax
000000000000c414 C3 ret
000000000000c415 8B05ADB40100 mov eax, dword [ds:_OBJC_IVAR_$_FNProductStatus._productLicense]

相当于直接加入了一个return屏蔽了这个函数。

保存该文件,则 Tower 2 被破解。