Sublime Text 3176 Win32版本暴力破解过程



前段时间听闻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    ;比较用户输入是否大于150044FA29    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                     ;只取150044FA3A    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长度为0x4F0044FA46    75 24           jnz short sublime_.0044FA6C         ;不是则调到退出处
0044FA48    8B39            mov edi,dword ptr ds:[ecx]          ;开始判断是否是作者故意传入的非法key
;非法key偏0x26的位置为一串0,每串0x20个,然后是一个0xA,这样一共重复90044FA4A    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                     ;循环结束后,判断是不是有90
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破解成功。