前段时间听闻Sublime出了新版本,一直忙于实习任务没有跟进。最近项目进入收敛期,正好写文档搞得头晕脑胀的,遂利用工作之余看看作者在3176版本中都给我们准备了哪些惊喜。
先说结论吧,此版的注册机制、干扰和暗桩等于上一版一模一样,不知道作者是不是觉得在上一版中加入的一些干扰机制和暗桩已经卓有成效了,亦或是作者已经放弃治疗了?
无论如何,可将上一版的破解成果和步骤直接用于本版本中。由于上次已经比较详细记录了破解和排除暗桩的过程,因此这里主要只对关键步骤进行记录。之前的破解记录请移步:
Sublime Text 3143 Win32版本破解后续——排除暗桩与完美注册
Sublime Text 3143 Win32版本暴力破解过程
Sublime Text 3126 Win32版本暴力破解过程
还是按上次破解3143版本时最后成功的套路,根据字符串查找到“关于”中拼接字符串之处,Unregistered字样赫然在目。据此找到存储注册信息的结构,一切都还是那么熟悉。
进IDA里看看:
相较于上个版本,果然一点都没变。看来作者要么就是对在上个版本中加入的干扰项和暗桩很有信心,要么就是已经放弃治疗了。先输入注册码,然后对这个注册信息结构所在内存下写入断点,点击注册,断点命中,此时已在注册函数附近了。
这是一个用全0对结构进行清空的逻辑,在其下面即是CheckKey了:
在此处下断,重启程序,观察是否传入虚假注册码:
果然又来了。于是决定按上次的方案修改注册函数逻辑,将原本该输入注册码的窗口作为注册用户名的输入之处(代码直接用了上一篇破解记录中的代码,其中跳转到显示的地址肯定是不对的,需要根据实际情况修改)
0044FA0E 55 push ebp
0044FA0F 53 push ebx
0044FA10 56 push esi
0044FA11 57 push edi
0044FA12 B8 FB967600 mov eax,sublime_.007696FB ;这里有重定位信息,该语句保留不动
0044FA17 8BEC mov ebp,esp
0044FA19 83EC 38 sub esp,0x38
0044FA1C 33C0 xor eax,eax
0044FA1E 40 inc eax ;默认情况下设置返回值为1(注册成功)
0044FA1F 85D2 test edx,edx ;是否传入了全局注册信息结构
0044FA21 74 1F je short sublime_.0044FA42 ;没传入,作者在挖坑,单独处理
0044FA23 8BFA mov edi,edx ;传入了,将注册信息复制为用户名
0044FA25 8079 10 0F cmp byte ptr ds:[ecx+0x10],0xF ;比较用户输入是否大于15位
0044FA29 7F 08 jg short sublime_.0044FA33 ;大于15位,则[ECX]中为指针
0044FA2B 8BF1 mov esi,ecx ;小于15位,直接存在ecx指向的缓冲区中
0044FA2D 0FB649 10 movzx ecx,byte ptr ds:[ecx+0x10] ;待拷贝长度设置为输入字符串长度
0044FA31 EB 07 jmp short sublime_.0044FA3A
0044FA33 8B31 mov esi,dword ptr ds:[ecx] ;大于15位,取指针为字符串
0044FA35 B9 0F000000 mov ecx,0xF ;只取15位
0044FA3A FC cld ;通用过程,拷贝字符串到注册信息中
0044FA3B 894A 10 mov dword ptr ds:[edx+0x10],ecx
0044FA3E F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
0044FA40 EB 2A jmp short sublime_.0044FA6C ;拷贝完后,跳到退出处
0044FA42 8079 10 4F cmp byte ptr ds:[ecx+0x10],0x4F ;从上面判断edx处跳来,判断是不是作者构造的非法key(该key长度为0x4F)
0044FA46 75 24 jnz short sublime_.0044FA6C ;不是则调到退出处
0044FA48 8B39 mov edi,dword ptr ds:[ecx] ;开始判断是否是作者故意传入的非法key
;非法key偏0x26的位置为一串0,每串0x20个,然后是一个0xA,这样一共重复9组
0044FA4A 8D7F 26 lea edi,dword ptr ds:[edi+0x26] ;从第一组0开始
0044FA4D 50 push eax ;暂存返回值
0044FA4E B0 30 mov al,0x30 ;找'0'
0044FA50 B9 29010000 mov ecx,0x129 ;最多找0x129次(到达末尾了)
0044FA55 8BF7 mov esi,edi ;暂存edi到esi
0044FA57 F3:AE repe scas byte ptr es:[edi] ;扫描目标串,直到ecx为0或找到非'0'字符
0044FA59 57 push edi ;暂存edi
0044FA5A 2BFE sub edi,esi ;求'0'串长,
0044FA5C 83FF 21 cmp edi,0x21 ;'0'串长若是0x20(向后挪了一格)
0044FA5F 5F pop edi ;恢复edi的值
0044FA60 75 03 jnz short sublime_.0044FA65 ;'0'串长若是0x20(向后挪了一格)
0044FA62 42 inc edx ;循环计数器自增,能跳到这个分支edx定为0
0044FA63 ^ EB F0 jmp short sublime_.0044FA55 ;跳回去继续执行(模拟了一个for循环)
0044FA65 83FA 09 cmp edx,0x9 ;循环结束后,判断是不是有9组0
0044FA68 58 pop eax ;恢复返回值
0044FA69 75 01 jnz short sublime_.0044FA6C ;如果不是,则是恰巧0x4F的串,返回1
0044FA6B 40 inc eax ;否则就是作者构造的用于钓鱼的串,返回2
0044FA6C 8BE5 mov esp,ebp
0044FA6E 5F pop edi
0044FA6F 5E pop esi
0044FA70 5B pop ebx
0044FA71 5D pop ebp
0044FA72 C3 retn
下面就是干掉网络验证了。在之前的版本中,通过分析可知在注册成功分支下面,有个CreateThread函数,其启动的线程正是进行http验证序列号的函数,将其干掉即可。
在启动时,也有用于检查版本更新的函数会捎带上传Key相关信息,对InternetOpenW下断后运行,断点命中时再该函数头部下断即可。至此,Sublime破解成功。