1.
准备工具
* IDA :强大的反汇编工具,目前最新的可用的版本是6.1, 可以到我的共享下载
IDA6.1
* winhex : 强大的十六进制编辑器,为了实现爆破必须有一个可用的十六进制编辑器。额,在这里用Vim确实不方便。可以到我的共享下载
winhex 17.2
* sublime text原程序,到官网下载吧,我推荐下载Protable版,解压后即可用。对MacOS用户,道理是一样的,下载dmg镜像文件后直接解压即可得到名为Sublime Text的可执行程序
2.
体验sublime text,发现突破点
下面我的说明都是以sublime text windows 32位的程序为例进行说明,在其他平台上的表现完全一致。
打开sublime text程序,相信你已经把准备工作做好了。打开程序后新建文件随便写一些文字,然后狂按Ctrl+S进行保存,这时就会弹出注册对话框。如下图:
看看这个对话框的标题:
This is an unregistered copy,这就是我们的突破口。
下面就开始搞。
3.
分析程序,找到关键位置
- 用IDA加载sublime text可执行程序,你应该知道自己把可执行程序放哪里了。IDA分析程序要正经花些时间,等分析完了按一下Space键,就是按一下空格键。(感觉自己很麻婆)
- 在IDA里找菜单Search-->text(Alt+t), 打开搜索文本对话框,在搜索框内输入This is an,开始搜索,如下图:
- 现在程序跳到了.text:004C3FE2位置,这是一个很关键的函数,咱们对这个函数稍微分析一下,在IDA里面按F5,把汇编程序编译为C程序。
按F5得到:
看到最顶上的if语句了吗?if (byte_788D90) ....
这个byte_788D90在源代码里叫做g_valid_license,现在知道这个全局变量有多重要了吧。
下面就要对byte_788D90下手。
- 切到IDA View-A 汇编窗口, 往上滚动屏幕,找到byte_788D90,在byte_788D90上右键,然后选X。打开byte_788D90引用窗口.
看到标记为w的条目,现在我鼠标双击第6行,跳到.text:0049DE29
这一段是什么意思呢? 按F5,看到
这里的意思是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,跳到函数里面。然后滚动鼠标往下拉,很快看到大片的这种执行判断的代码:
相信你已经猜到这里是干什么了。继续往下拉,一直到这个函数的返回位置:
代码:
.text:004C3D12 mov eax, edi
.text:004C3D14 call sub_4F9CAE
.text:004C3D19 retn
其中,
mov eax, edi 就是设置函数的返回值。
我们要把eax强制置为0。文章最后我会解释为什么设置为0, 而不是1. 记下这里的位置
004C3D12.
好了,现在找到要修改的位置,也知道改成什么样了,那现在就开始改可执行程序。
4.
修改可执行程序
- 计算偏移值
刚才,我们记下了两个位置: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
然后把文件另存,现在你另存的文件就是一个完美破解了的可执行程序,也许需要自己添加可执行权限。
5.
最后
阅读这篇文章大概要花30分钟,但是动手操作起来实际用不了10分钟,以上的方法对于sublime text 3056和最新的3061完全适用。
6.
补充
* sub_4C35AD为什么必需返回0 ?
答:返回0可以保证无需输入注册码却能被sublime text识别为**Unlimited User License**, 无限制用户,岂不很爽。
* `byte_788D90 = sub_4C35AD() != 0 ? byte_788D90 : 0` 从这一步看sub_4C35AD返回1才对啊。
答:对,这就是3059这一版的高明之处,sub_4C35AD要在注册的时候返回0才表明注册码有效,而在程序启动的时候它却应该返回1. 我也很无奈啊。
本文原文还张贴在我的博客上:
http://apneng.net/2013/12/24/crack-s...0-minutes.html
欢迎交流学习。