预备工具:

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

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

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

位置机器码汇编变量
000000000000c41055pushrbp
000000000000c4114889E5movrbp, rsp
000000000000c414488B05ADB40100movrax, qword [ds:_OBJCIVAR$_FNProductStatus._productLicense]

则二进制机器码为554889E5488B05ADB40100.

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

位置机器码汇编变量
000000000000c41031C0xoreax,eax
000000000000c412FFC0inceax
000000000000c414C3ret
000000000000c4158B05ADB40100moveax, dword [ds:_OBJCIVAR$_FNProductStatus._productLicense]

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

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