Исследование защиты программы Sublime Text


Скриншот программы Sublime Text

Sublime Text - продвинутый редактор для программистов с множеством полезных функций, подсветкой синтаксиса различных языков программирования, автодополнением, а также с практически неограниченными возможностями по расширению функционала при помощи Python. Особых триальных ограничений в нем нет, за исключением наг-окна, которое может рандомно появиться при сохранении файла. Но мне очень не понравились комментарии на одном популярном IT-ресурсе, где этот редактор разрекламировали. Терпилы писали, что можно и потерпеть это окно, какие-то беспредельщики задвигали телеги, что "рабочий инструмент надо обязательно покупать", и все в таком духе. А правильным пацанам я сейчас расскажу как все сделать правильно.

Скачиваем с офсайта дистрибутив (а под раздачу в этой статье попадает портативная версия для 32-битных систем), распаковываем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его в дизассемблер, а пока тот работает, поищем текст надоедливого наг-окна. Ничего сложного, все лежит в открытом виде:


Нехорошая строка найдена

Возвращаемся к дизассемблеру, а именно к тому месту, где этот текст появляется. Все очень красиво оформлено в виде отдельной процедуры:
.text:004C6C50                 sub     esp, 8
; Проверка байта, если он не равен 0, то сразу выход из процедуры
.text:004C6C53                 cmp     byte_772F8C, 0
.text:004C6C5A                 jnz     loc_4C6CF3
.text:004C6C60                 push    esi
.text:004C6C61                 push    edi
.text:004C6C62                 call    sub_408F00
.text:004C6C67                 mov     esi, eax
.text:004C6C69                 sub     eax, dword_772FA0
.text:004C6C6F                 mov     edi, edx
.text:004C6C71                 mov     ecx, edi
.text:004C6C73                 sbb     ecx, dword_772FA4
.text:004C6C79                 mov     [esp+10h+var_4], ecx
.text:004C6C7D                 js      short loc_4C6CF1
.text:004C6C7F                 jg      short loc_4C6C88
.text:004C6C81                 cmp     eax, 0A4CB80h
.text:004C6C86                 jb      short loc_4C6CF1
.text:004C6C88 loc_4C6C88:
.text:004C6C88                 inc     dword_772F9C
; Наг-окно появляется рандомно, тут выполняется проверка показывать или нет
.text:004C6C8E                 call    ds:rand
.text:004C6C94                 and     eax, 8000000Fh
.text:004C6C99                 jns     short loc_4C6CA0
.text:004C6C9B                 dec     eax
.text:004C6C9C                 or      eax, 0FFFFFFF0h
.text:004C6C9F                 inc     eax
.text:004C6CA0 loc_4C6CA0:
.text:004C6CA0                 mov     eax, dword_772F9C
.text:004C6CA5                 jnz     short loc_4C6CAC
.text:004C6CA7                 cmp     eax, 2
.text:004C6CAA                 jg      short loc_4C6CB1
.text:004C6CAC loc_4C6CAC:
.text:004C6CAC                 cmp     eax, 8
.text:004C6CAF                 jle     short loc_4C6CF1
.text:004C6CB1 loc_4C6CB1:
.text:004C6CB1                 push    offset aPurchase ; "Purchase"
.text:004C6CB6                 push    offset aThisIsAnUnregi
; "This is an unregistered copy"
.text:004C6CBB                 push    offset aHelloThanksFor
; "Hello! Thanks for trying out Sublime Te"...
.text:004C6CC0                 push    0
.text:004C6CC2                 mov     dword_772F9C, 0
.text:004C6CCC                 mov     dword_772FA0, esi
.text:004C6CD2                 mov     dword_772FA4, edi
.text:004C6CD8                 call    sub_41D160
.text:004C6CDD                 add     esp, 10h
.text:004C6CE0                 test    al, al
.text:004C6CE2                 jz      short loc_4C6CF1
; Если пользователь нажал "Купить", то перейти на страницу покупки
.text:004C6CE4                 push    offset aHttpWww_sublim
; "http://www.sublimetext.com/buy"
.text:004C6CE9                 call    sub_414C30
.text:004C6CEE                 add     esp, 4
.text:004C6CF1 loc_4C6CF1:
.text:004C6CF1                 pop     edi
.text:004C6CF2                 pop     esi
.text:004C6CF3 loc_4C6CF3:
.text:004C6CF3                 add     esp, 8
.text:004C6CF6                 retn

В самом начале интересные строчки. Проверяется байт в памяти по адресу 00772F8C и, если он не равен нулю, то никаких окон не показывается. Есть мнение, что это и есть флажок "зарегистрировано". Поищем, в дизассемблере, где он инициализируется:


Перекрестные ссылки на байт регистрации

Очевидно, что инициализация с предварительной проверкой может быть только в двух местах, где в байт заносится значение регистра AL. Вот первое место:
.text:004C71E7                 push    ecx
.text:004C71E8                 call    sub_4C6A50
.text:004C71ED                 add     esp, 4
.text:004C71F0                 mov     byte_772F8C, al
.text:004C71F5                 test    al, al
.text:004C71F7                 jz      loc_4C730B

и очень похожее второе:
.text:004CAC24                 call    sub_4C6A50
.text:004CAC29                 add     esp, 4
.text:004CAC2C                 lea     ecx, [esp+34h+var_28]
.text:004CAC30                 mov     byte_772F8C, al

В обеих случаях сперва вызывается функция по адресу 004C6A50 и ее результат в регистре AL является признаком зарегистрированности программы. Патчить или кейгенить? Теперь небольшое отклонение от темы. Окно ввода серийника большое, значит он наверняка состоит из нескольких строчек. Как правило, такое бывает, если используются криптоалгоритмы. Плагин для PEiD подтверждает эту догадку. Наворочено и того, и другого, и даже без хлеба.


Найденные криптоалгоритмы

Чтобы не тратить время, пропатчим функцию проверки серийного номера, записав в ее начало команды MOV AL,1 и RET. Сохраняем изменения, проверяем что получилось. Надпись "UNREGISTERED" в заголовке окна пропала, надоедливое окно не появляется, а программа теперь принимает любой регистрационный ключ:


Программа успешно "зарегистрирована"

Вот теперь все правильно. Барыги посрамлены, терпилы могут терпеть дальше, а правильным пацанам остается только внимательно изучить процедуру проверки регистрации, выделить сигнатуру для поиска и сделать универсальный патч, чтобы больше никогда не платить деньги за этот инструмент.
Теги:
защита, взлом
Добавлено: 17 Сентября 2013 03:40:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...