今天中午打开 Sublime Text 时,弹出了升级对话框。看了一眼官网,4213 刚发布,距离上一个稳定版 4200(2025 年 5 月 21 日)过去了 16 个月。

这次挑几项更新简单说说:

  • 插件运行环境从 Python 3.8 升级到 Python 3.14
  • 新增文件图标主题和打开外部终端的命令
  • 改进语法高亮,提升批量保存和 Git 状态查询的性能

Sublime Text 官方下载页:Build 4213 与下载入口

官网下载与完整更新日志:Sublime Text Download。

升级后,窗口标题里显示 UNREGISTERED,想沿用以前的十六进制替换方法,结果旧版本的那几串字节都搜不到了。

折腾了一下,找到了这份程序对应的修改位置,只需要替换 7 个字节。早期版本的替换记录整理好放在了文末。

Build 4213 怎么改

先在 Help → About Sublime Text 中确认版本。我的环境是 Windows 版 Build 4213(x64)。

保存文件并退出 Sublime Text,备份原始的 sublime_text.exe,先修改副本再替换。毕竟数据无价,改错了也方便恢复。

在 010 Editor 中可以这样操作:

  1. 用 010 Editor 打开副本,按 Ctrl + R 调出替换栏。
  2. 把 Find 和 Replace 两处的数据类型都选为 十六进制(Hex Bytes),填入下方对应的字节。
  3. 先查找全部匹配项,确认只有 1 处,且文件偏移为 0x46C86,再替换这一处。
  4. 按 Ctrl + S 保存。修改前后都是 7 字节,整个文件的大小也应保持不变。

查找:

1
0F B6 51 0C 83 F2 01

替换为:

1
C6 41 0C 01 31 D2 90

这里填的是十六进制字节,数据类型选成 Text 就会按普通文字去找。查找不到、出现多处结果,或者偏移不一致时,先确认版本和文件是否与本文的测试对象一致,不要缩短字节后直接全部替换。测试文件的信息放在文末。快捷键和数据类型可对照 010 Editor 的替换说明与查找说明。

修改后的效果

测试时复制了两份完整的程序目录,各自创建独立的 Data 文件夹,用来区分原版和修改后的行为。只拿一个 EXE 去运行不够,还需要同目录里的 DLL、Packages 等文件。

实际检查到的结果是:

  • 窗口标题里的 UNREGISTERED 消失。
  • Help 菜单出现 Remove License,关于窗口显示 Registered to、Unlimited User License,注册人姓名为空。
  • 中英文编辑、保存和读回正常,退出后重新启动,保存的文本仍在,标题也没有恢复成未注册状态。

副本验证通过后,又把同一份修改后的文件应用到正式安装目录,并从正式路径启动复验,窗口正常响应,标题里没有 UNREGISTERED。

这次验证的是本地状态显示、基本编辑保存和一次重启,没有验证服务器授权、长期使用或所有插件的兼容性。

这 7 个字节改了什么

旧版的完整字节在 4213 中没有匹配,不能直接把旧方案里的 05 猜着改成 0C。这次是从当前文件里 Unregistered 等字符串的引用入手,结合反汇编找到候选位置,再通过副本运行确认效果。

原来的 7 字节对应两条指令:

1
2
movzx edx, byte ptr [rcx + 0x0C]
xor edx, 1

可以把 RCX 理解为存着一个地址,EDX 则临时存放数值。第一条读取这个地址往后偏移 0x0C 处的一个字节,第二条把读到的值与 1 做异或。字段取值是 0 或 1 时,结果就是 0 → 1、1 → 0。

修改后变成:

1
2
3
mov byte ptr [rcx + 0x0C], 1
xor edx, edx
nop

意思是把那个状态字节设为 1,把 EDX 清零,再用一个 NOP 补齐剩余空间。这样既保持了原来的 7 字节长度,也让后续代码拿到的 EDX 与原逻辑读到状态 1 时一致,后面的指令不需要挪动。

注意,0x0C 是运行时对象里的字段偏移,0x46C86 才是这段指令在 EXE 文件中的位置,两者不是同一个概念。

怎么恢复到 Build 4200

原文件的备份要留好。这次完整比对后,确认只有 0x46C86 到 0x46C8C 这连续 7 个字节不同,反向还原后与原文件逐字节一致。

需要恢复时,先保存并退出 Sublime Text,同时关闭 010 Editor 中打开目标 EXE 的标签,然后用 4213 原始备份覆盖回安装目录。已经升级到其他版本时,就不能再拿这份旧备份覆盖了。

修改 EXE 会使原厂数字签名失效,恢复时应使用未修改的原始备份。

早期版本:十六进制快捷替换

下面是以前留下的几组 Windows EXE 替换记录,这次没有重新逐一测试旧版本。操作仍然是在 010 Editor 中打开文件,按 Ctrl + R,把查找和替换的数据类型都选为 十六进制(Hex Bytes),再填入对应版本的两串字节。

先备份,再核对完整匹配,确认后替换并保存。一次只使用当前版本对应的那一组,不要把几组内容连续套在同一个文件上。

Build 4180 及以前

旧记录标注为“4180 及以前”,更早的版本没有逐一复测。

查找和替换的方式与上面相同,下面列出对应的字节。

查找:

1
80 78 05 00 0F 94 C1

替换为:

1
C6 40 05 01 48 85 C9

Build 4192

查找:

1
80 79 05 00 0F 94 C2

替换为:

1
C6 41 05 01 B2 00 90

4186、4189 暂未测试,不能直接按 4192 处理。

Build 4200

查找:

1
0F B6 51 05 83 F2 01 44

替换为:

1
C6 41 05 01 31 D2 90 44

这一组前后都是 8 字节,末尾的 44 保持不变,复制时不要漏掉。4213 使用的是前面单独列出的 7 字节方案,不要混用。

测试文件的 SHA-256

下面记录的是本次测试的 Windows Build 4213(x64) sublime_text.exe,用于确认文件内容是否一致。文中的偏移和匹配次数以这份原始文件为准。

原始文件:

1
BAA7BD929534F4D133D96B5A427E2B80AF35B3346FCE4B63C098F6A6CE075F8C

修改后文件:

1
36522305D86054428C5D5E14D96658F6B58C57160F788343D19DAB3C01A96DDF