
Скриншот программы 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" в заголовке окна пропала, надоедливое окно не появляется, а программа теперь принимает любой регистрационный ключ:

Программа успешно "зарегистрирована"
Вот теперь все правильно. Барыги посрамлены, терпилы могут терпеть дальше, а правильным пацанам остается только внимательно изучить процедуру проверки регистрации, выделить сигнатуру для поиска и сделать универсальный патч, чтобы больше никогда не платить деньги за этот инструмент.