本文是对上一篇记录《Sublime Text 3143 Win32版本暴力破解过程》的补充之一。
整个破解工作到目前为止,似乎一切都很顺利,随便输入一个序列号就能完成注册了。然而今早起床刷牙时猛然想起一个细节:Sublime的作者在3126版本中就已经有了对注册函数进行验证的环节,故意传入了一个全0的参数,此时作为异常情况,注册函数应该返回代表注册失败的值,当初我们第一次破解3126版本的时候就因为没发现这点而折戟沉沙。
排查遇坑
一个本就在不断对抗破解,手段越来越恶劣、套路越来越猥琐的作者,会在新版本放弃这种方式吗?我不相信这种奇迹会发生。于是在IDA中找到注册函数:0x0044FA0E,Ctrl+X查找交叉引用,可以看到如下地方调用了该函数:
一共五处调用,先看第一处:
嗨呀,看到上面一串全0字符串顿时有种不妙的感觉,吓得我赶紧打开了OD。在目标位置下断后运行程序:注册函数两次被断下,第一次传入了我们之前输入的key,而第二次,就来到了这里:
ecx中传入的是一个字符串对象,其中第一个字段即为字符串指针:
来看看是何方神圣:
哇,社会是真的险恶。这种验证码就算是闭着眼睛也知道是有问题的。调用注册码校验函数完成后,果不其然,作者开始将返回值和1匹配(在Sublime 3143版本中,注册函数返回1表示注册成功),果然城里人套路深啊!
作者的套路1
接着分析,如果我们不问青红皂白地将注册函数修改为无论合适都返回注册成功,那就中了作者的套路了,下面这段代码就会执行:
.text:00426DAE 6A 0C push 0Ch ; size_t
.text:00426DB0 E8 6E DF 2F 00 call ??2@YAPAXI@Z ; 对象大小为12
.text:00426DB5 8B 4D 6C mov ecx, [ebp+6Ch] ; ecx指向全局注册结构
.text:00426DB8 C7 04 24 00 53+mov [esp+0FCh+var_FC], 75300h
.text:00426DBF 50 push eax
.text:00426DC0 89 48 08 mov [eax+8], ecx ; 新对象第三个成员为全局对象大小
.text:00426DC3 B9 04 31 8A 00 mov ecx, offset dword_8A3104
.text:00426DC8 89 45 60 mov [ebp+6