破解 Sublime Text 4200 ARM64

1 TL;DR

1
2
3
4
5
6
# 修改文件
perl -pi -e 's/\x09\x15\x40\x39\x4a\x00\x80\x52\x3f\x01\x00\x71\xe9\x13\x8a\x1a/\x29\x00\x80\x52\x09\x15\x00\x39\x09\x00\x80\x52\x4a\x00\x80\x52/' \
/Applications/Sublime\ Text.app/Contents/MacOS/sublime_text

# 重新签名
sudo codesign --sign - --force --deep /Applications/Sublime\ Text.app

2 序

其实 4200 版本在半年前就出来了,但是我一直懒得更新,最近它开始频繁弹提示了,我才准备更新。

打算翻翻 Github Gist 上的破解方法,却发现帖子被删了,看来还是写在自己的地盘最靠谱,就让我再水一篇吧。

3 破解

3.1 顺藤

在 4200 版本,原有的 x64 的破解方法失效了,不过新的方法也很容易找:

搜索二进制数据:

1
0F B6 51 05 83 F2 01

替换为:

1
C6 41 05 01 31 D2 90

看看这次改了什么?

修改前:

1
2
3
4
5
; 从 rcx + 5 指向的内存读取 1 字节数据,存到寄存器 edx。
0F B6 51 05 movzx edx, byte ptr [rcx + 5]

; 将 edx 与 1 做异或运算,并将结果存在 edx 。
83 F2 01 xor edx, 1

修改后:

1
2
3
4
5
6
7
8
; 将 rcx + 5 指向的 1 字节内存设置为 1。
C6 41 05 01 mov byte ptr [rcx + 5], 1

; 将寄存器 edx 设置为 0。
31 D2 xor edx, edx

; 空指令。
90 nop

再用 Cutter 看一下上下文代码:

一切都是那么的熟悉,和上个版本的思路可以说是分毫不差,连修改的函数都没变。

结论:

  • 破解关键在 edit_window::on_update_state 函数内。
  • rcx + 5 指向的 1 字节内存,存储着全局注册状态,1 表示已注册。
  • 寄存器 edx 存储临时注册状态,0 表示已注册。

3.2 摸瓜

接下来反编译 arm64 版本,找到 edit_window::on_update_state 函数,来到这段:

翻译翻译:

1
2
3
4
5
6
7
8
9
; 从 x8 + 5 指向的内存读取 1 字节数据,存到寄存器 w9。
0x10020dcb4 09 15 40 39 ldrb w9, [x8, 5]

; w10 = 2
0x10020dcb8 4a 00 80 52 mov w10, 2

; w9 = (w9 != 0)? 0 : w10
0x10020dcbc 3f 01 00 71 cmp w9, 0
0x10020dcc0 e9 13 8a 1a csel w9, wzr, w10, ne

参考 x64 版本的汇编代码,可以得出推论:x8 + 5 指向的 1 字节内存即为全局注册状态。

假定用户已注册,则指令执行到 0x10020dcc0 处时,寄存器 w9 存储的值应该为 0。

那么,修改后的汇编代码就是:

1
2
3
4
5
6
7
8
9
; 借用 w9,将 x8 + 5 指向的 1 字节内存修改为 1。
29 00 80 52 mov w9, 1
09 15 00 39 strb w9, [x8, 5]

; w9 = 0
09 00 80 52 mov w9, 0

; 保持不变,下移 2 行。
4a 00 80 52 mov w10, 2

破解方法:

搜索二进制数据:

1
09 15 40 39 4a 00 80 52 3f 01 00 71 e9 13 8a 1a

替换为:

1
29 00 80 52 09 15 00 39 09 00 80 52 4a 00 80 52

4 参考资料

同上篇博文。