更新

经过了差不多半年,Sublime Text的作者又开始更新了,可惜今年的更新频率远比不上前些年。难道作者不想玩了?
2014年5月5号,作者在Dev频道上放出了更新Build 3062, 功能略有增加。
下面是我修改过的sublime text, 包括了Windows 32/64, Linux 32/64 及 MacOS:

下载 Sublime Text Build 3062

下载 Sublime Text Build 3059

全部版本下载

3059,3061下载链接请转到:sublime text 完美破解

准备工具

  • IDA :强大的反汇编工具,目前最新的可用的版本是6.1, 可以到我的共享下载IDA6.1
  • winhex : 强大的十六进制编辑器,为了实现爆破必须有一个可用的十六进制编辑器。额,在这里用Vim确实不方便。可以到我的共享下载winhex 17.2
  • sublime text原程序,到官网下载吧,我推荐下载Protable版,解压后即可用。对MacOS用户,道理是一样的,下载dmg镜像文件后直接解压即可得到名为Sublime Text的可执行程序

体验sublime text,发现突破点

下面我的说明都是以sublime text windows 32位的程序为例进行说明,在其他平台上的表现完全一致。

打开sublime text程序,相信你已经把准备工作做好了。打开程序后新建文件随便写一些文字,然后狂按Ctrl+S进行保存,这时就会弹出注册对话框。如下图: This is an unregistered copy
看看这个对话框的标题:This is an unregistered copy,这就是我们的突破口。

下面就开始搞。

分析程序,找到关键位置

  • 用IDA加载sublime text可执行程序,你应该知道自己把可执行程序放哪里了。IDA分析程序要正经花些时间,等分析完了按一下Space键,就是按一下空格键。(感觉自己很麻婆)

  • 在IDA里找菜单Search–>text(Alt+t), 打开搜索文本对话框,在搜索框内输入This is an,开始搜索,如下图: Text search

  • 现在程序跳到了.text:004C3FE2位置,这是一个很关键的函数,咱们对这个函数稍微分析一下,在IDA里面按F5,把汇编程序编译为C程序。

unregistered copy

in c program

看到最顶上的if语句了吗?if (byte_788D90) ….

这个byte_788D90在源代码里叫做g_valid_license,现在知道这个全局变量有多重要了吧。 下面就要对byte_788D90下手。

  • 切到IDA View-A 汇编窗口, 往上滚动屏幕,找到byte_788D90,在byte_788D90上右键,然后选X。打开byte_788D90引用窗口。

xref to byte_788D90

看到标记为w的条目,现在我鼠标双击第6行,跳到.text:0049DE29

g_valid_license

这一段是什么意思呢?按F5,看到

xx

这里的意思是byte_788D90的值要根据函数sub_4C35AD而重置 byte_788D90 = sub_4C35AD() != 0 ? byte_788D90 : 0 我们要让这一句失效,就是把and byte_788D90, al改为nop nop nop nop nop nop。

好,现在我们记下and byte_788D90, al的位置:0049DE29

  • 从上一步我们还看到函数sub_4C35AD也很重要,在源代码里,它的名字叫check_license_file()

这一步我们就动手改函数sub_4C35AD。 双击call sub_4C35AD,跳到函数里面。然后滚动鼠标往下拉,很快看到大片的这种执行判断的代码:

check_number

相信你已经猜到这里是干什么了。继续往下拉,一直到这个函数的返回位置:

.text:004C3D12          mov     eax, edi
.text:004C3D14          call    sub_4F9CAE
.text:004C3D19          retn

其中,mov eax, edi就是设置函数的返回值。我们要把eax强制置为0。文章最后我会解释为什么设置为0,而不是1。 记下这里的位置004C3D12。 好了,现在找到要修改的位置,也知道改成什么样了,那现在就开始改可执行程序。

修改可执行程序

  • 计算偏移值

刚才,我们记下了两个位置:0049DE29, 004C3D12 现在我们要这样计算代码在文件中的偏移

  • 第一个偏移:49DE29 - 401000 + 400 = 9D229, 从这里开始的6个字符改为汇编nop,即90 90 90 90 90 90, Linux的程序要改7个90

  • 第二个偏移:4C3D12 - 401000 + 400 = C3112, 从这里开始的2个字符改为汇编xor eax, eax 即31C0

  • 用winhex打开sublime text可执行程序,按Alt+G,跳到上面的两个偏移位置 9D229和C3112,然后用键盘输入上面的十六进制代码

    • 在9D229的位置开始输入6个90
    • 在C3112的位置开始输入31C0 然后把文件另存,现在你另存的文件就是一个完美破解了的可执行程序,也许需要自己添加可执行权限。

DONE

最后

阅读这篇文章大概要花30分钟,但是动手操作起来实际用不了10分钟,以上的方法对于sublime text 3056和最新的3061完全适用。

补充

  • sub_4C35AD为什么必需返回0 ?
    答:因为我们在第一个补丁中已经把 and byte_788D90, al 改成了 nop,这意味着 byte_788D90(即 g_valid_license)永远不会被清零。因此 sub_4C35AD 的返回值实际上已经不影响最终结果了——让它返回 0 只是为了让程序显示 Unlimited User License(无限制用户授权),而不是出于逻辑需要。
  • 那为什么还要改 sub_4C35AD?
    答:虽然 byte_788D90 已经不会被重置,但 sub_4C35AD 本身在注册流程中还有其他副作用(比如影响弹窗逻辑),强制返回 0 可以让注册流程彻底静默。