Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Sublime Text
Скриншот программы Sublime Text

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

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

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

Возвращаемся к дизассемблеру, а именно к тому месту, где этот текст появляется. Все очень красиво оформлено в виде отдельной процедуры:
  1. .text:004C6C50                 sub     esp, 8
  2. ; Проверка байта, если он не равен 0, то сразу выход из процедуры
  3. .text:004C6C53                 cmp     byte_772F8C, 0
  4. .text:004C6C5A                 jnz     loc_4C6CF3
  5. .text:004C6C60                 push    esi
  6. .text:004C6C61                 push    edi
  7. .text:004C6C62                 call    sub_408F00
  8. .text:004C6C67                 mov     esi, eax
  9. .text:004C6C69                 sub     eax, dword_772FA0
  10. .text:004C6C6F                 mov     edi, edx
  11. .text:004C6C71                 mov     ecx, edi
  12. .text:004C6C73                 sbb     ecx, dword_772FA4
  13. .text:004C6C79                 mov     [esp+10h+var_4], ecx
  14. .text:004C6C7D                 js      short loc_4C6CF1
  15. .text:004C6C7F                 jg      short loc_4C6C88
  16. .text:004C6C81                 cmp     eax, 0A4CB80h
  17. .text:004C6C86                 jb      short loc_4C6CF1
  18. .text:004C6C88 loc_4C6C88:
  19. .text:004C6C88                 inc     dword_772F9C
  20. ; Наг-окно появляется рандомно, тут выполняется проверка показывать или нет
  21. .text:004C6C8E                 call    ds:rand
  22. .text:004C6C94                 and     eax, 8000000Fh
  23. .text:004C6C99                 jns     short loc_4C6CA0
  24. .text:004C6C9B                 dec     eax
  25. .text:004C6C9C                 or      eax, 0FFFFFFF0h
  26. .text:004C6C9F                 inc     eax
  27. .text:004C6CA0 loc_4C6CA0:
  28. .text:004C6CA0                 mov     eax, dword_772F9C
  29. .text:004C6CA5                 jnz     short loc_4C6CAC
  30. .text:004C6CA7                 cmp     eax, 2
  31. .text:004C6CAA                 jg      short loc_4C6CB1
  32. .text:004C6CAC loc_4C6CAC:
  33. .text:004C6CAC                 cmp     eax, 8
  34. .text:004C6CAF                 jle     short loc_4C6CF1
  35. .text:004C6CB1 loc_4C6CB1:
  36. .text:004C6CB1                 push    offset aPurchase ; "Purchase"
  37. .text:004C6CB6                 push    offset aThisIsAnUnregi
  38. ; "This is an unregistered copy"
  39. .text:004C6CBB                 push    offset aHelloThanksFor
  40. ; "Hello! Thanks for trying out Sublime Te"...
  41. .text:004C6CC0                 push    0
  42. .text:004C6CC2                 mov     dword_772F9C, 0
  43. .text:004C6CCC                 mov     dword_772FA0, esi
  44. .text:004C6CD2                 mov     dword_772FA4, edi
  45. .text:004C6CD8                 call    sub_41D160
  46. .text:004C6CDD                 add     esp, 10h
  47. .text:004C6CE0                 test    al, al
  48. .text:004C6CE2                 jz      short loc_4C6CF1
  49. ; Если пользователь нажал "Купить", то перейти на страницу покупки
  50. .text:004C6CE4                 push    offset aHttpWww_sublim
  51. ; "http://www.sublimetext.com/buy"
  52. .text:004C6CE9                 call    sub_414C30
  53. .text:004C6CEE                 add     esp, 4
  54. .text:004C6CF1 loc_4C6CF1:
  55. .text:004C6CF1                 pop     edi
  56. .text:004C6CF2                 pop     esi
  57. .text:004C6CF3 loc_4C6CF3:
  58. .text:004C6CF3                 add     esp, 8
  59. .text:004C6CF6                 retn
В самом начале интересные строчки. Проверяется байт в памяти по адресу 00772F8C и, если он не равен нулю, то никаких окон не показывается. Есть мнение, что это и есть флажок "зарегистрировано". Поищем, в дизассемблере, где он инициализируется:

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

Очевидно, что инициализация с предварительной проверкой может быть только в двух местах, где в байт заносится значение регистра AL. Вот первое место:
  1. .text:004C71E7                 push    ecx
  2. .text:004C71E8                 call    sub_4C6A50
  3. .text:004C71ED                 add     esp, 4
  4. .text:004C71F0                 mov     byte_772F8C, al
  5. .text:004C71F5                 test    al, al
  6. .text:004C71F7                 jz      loc_4C730B
и очень похожее второе:
  1. .text:004CAC24                 call    sub_4C6A50
  2. .text:004CAC29                 add     esp, 4
  3. .text:004CAC2C                 lea     ecx, [esp+34h+var_28]
  4. .text:004CAC30                 mov     byte_772F8C, al
В обоих случаях сперва вызывается функция по адресу 004C6A50 и ее результат в регистре AL является признаком зарегистрированности программы. Патчить или кейгенить? Теперь небольшое отклонение от темы. Окно ввода серийника большое, значит он наверняка состоит из нескольких строчек. Как правило, такое бывает, если используются криптоалгоритмы. Плагин для PEiD подтверждает эту догадку. Наворочено и того, и другого, и даже без хлеба.

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

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

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

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

Поделиться ссылкой ВКонтакте
Просмотров: 10971 | Комментариев: 40

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Илья (13.01.2023 в 20:33):
Извините, что спамлю, т.к. нет функции изменить сообщение. Я считаю, что может быть полезно для будущих поколений.
Слово "UNREGISTERED" в главном окне программы закодировано просто сдвигом символов юникода на 11 и получилось "@[GPR\\FAPGPQ". При желании, можно туда таким же образом вписать, например, своё имя, что я и сделал.
Илья (13.01.2023 в 18:05):
Слово "UNREGISTERED" в главном окне программы было закодировано. В коде вместо него было "@[GPR\\FAPGPQ". Это на примере версии Sublime Text Build 3211 x64. Рассмотрел ещё парочку других версий, там то же самое или похожая схема.
Илья (13.01.2023 в 01:46):
Проблему выскакивающего окна при сохранении я решил довольно топорно, просто в месте проверки поменял jz на jnz (или наоборот). Для интереса разобрал две версии программы (3211 x32) и (4143 x64). В обеих версиях схема одна и та же и работает. И можно было бы на этом успокоиться со взломом этой программы в 2023 году, но как в заголовок основного окна попадает строка "(UNREGISTERED)", я так и не нашел, даже полнотекстовый поиск hiew не дал результатов. Неужели отдельными символами как-то подгружает и конкатенирует?
ManHunter (12.01.2023 в 01:14):
Цитатаrcx

Еще разок, специально для тех, кто в танке. Мне безразличнв 64-битные системы.
Илья (11.01.2023 в 23:44):
А что делать если не как у вас, конкретный байт в памяти сравнивается (cmp     byte_772F8C, 0), а вот такая строка:

cmp     byte ptr [rcx+5], 0

Уже так просто по перекрёстным ссылкам его не найти, где он инициализируется и вычислить функцию проверки. А как его найти, не подскажете?
ManHunter (08.10.2015 в 23:21):
Я не вижу ни одной причины для перехода с x86 на что-то другое. Более-менее весомый аргумент - поддержка 4+ гигов памяти, но под мои задачи и 4 гига выше крыши. Кроме этого мне пока никто не привел ни одного разумного довода, чем 64 бита вот прям настолько лучше и почему надо обновляться.
hatmaster (08.10.2015 в 22:31):
Цитата64-битные системы меня не волнуют. По крайней мере на ближайшие много-много лет.


Ретроград :) А если серьезно, почему так? Как бэ будущее за х64...
ManHunter (07.10.2015 в 00:23):
64-битные системы меня не волнуют. По крайней мере на ближайшие много-много лет.
hatmaster (07.10.2015 в 00:16):
Цитатапропатчим функцию проверки серийного номера, записав в ее начало команды MOV AL,1 и RET.

Для х64 версии данный патч актуален? Или там другие регистры используются?
ManHunter (17.01.2015 в 21:26):
Если что-то не нравится, то всегда можно найти любой другой интересный сайт, где заголовки совпадают с содержимым. Интернет же прям ломится от обилия полезной и уникальной информации. А еще лучше - вычеркнуть из жизни недельку-другую, но зато написать офигенно крутую статью и привести ее в качестве примера.
Крестик в правом верхнем углу браузера весьма эффективно решает все внутренние конфликты и диссонансы.
Дмитрий (17.01.2015 в 21:05):
Рабочий, неплохой блог, поэтому тут и задержался, быстро отвечаете.
Ну незнаю каким именно терминам вы удивились. Я указал
1. несоответсвие названия статьи и ее содержания. Согласитесь что исследование защиты подразумевает совсем другое?
2. также мне понравился ваш комментарий про программирование и искусство, но согласитесь что можно хотябы 30% описанных вами программ докопать до самого конца, не оставив ни одного черного пятна? Но вы этого не сделали. Возникает вопрос - почему? (вопрос возникает как раз в связи с понравившейся мне фразой)
3. И хочу напомнить, что исследование не подразумевает решения
P.S. ;-) означает улыбку, не сарказм.
ManHunter (17.01.2015 в 20:44):
Ох ты, какие термины в ход пошли. Ну ок, сбруть RSA-1024 в обозримое время, потом продолжим беседу про красивый реверсинг, перерезание проводов и отрубание головы.
Дмитрий (17.01.2015 в 20:24):
Понравился ваш комментарий:
>> Программирование - это не ремесло, а искусство,
>> но сейчас об этом почти забыли.
Это говорит тот, кто лечит человека отрубанием головы ;-) Причем как вижу не только для данной программы, но и в других статьях про “исследование”. Исследования конечно тут никакого нет, это с натяжкой можно назвать “обход защиты”.
Думаю все же под словосочетанием "исследованием защиты" должно скрываться более, чем анализ системы как черного ящика с перерезанием одного выходящего из него провода. Реверсинг (часть понятия программирование) тоже самое искусство, но кто хочет тратить на это время и усилия, если можно перерезать проводок с тем же результатом ;-) ?
GoodCat (19.12.2014 в 12:20):
ахах афтар мощный чел "терпилы", "беспредел", "пацаны"...
ManHunter (02.02.2014 в 01:52):
Одно из окон IDA
Nops (02.02.2014 в 01:47):
ManHunter, что за программа для поиска перекрестных ссылок на скрине?
disciple27 (30.03.2013 в 09:20):
подсветочка, правда допиливать надо
https://github.com/Shirk/Sublime-FASM-x86
ManHunter (01.09.2012 в 21:30):
nikolas, каждый имеет право на свое мнение. Но перечитай еще раз про donationware, и про альтернативные источники доходов тоже. Не жалко денег - отдай, но сделай это тихонько и тем более не надо этим гордиться. А вообще я просто презираю людей, которые покупают софт, и не надо ждать от меня какого-то иного отношения к ним.
nikolas (01.09.2012 в 20:41):
ManHunter, согласен насчет бесплатности, но ... Есть дизайнеры, есть программисты, менеджеры и черта в ступе. То есть существует КУЧА людей, которые физически ничего не создают, но тратят на работу свои деньги, нервы и прочая-прочая.
Это я к тому, что для работы дома, для ХОББИ вполне можно использовать и платный софт. А если уж с помощью софта хочешь что-то производить, что принесет тебе $$$ - оплати труд человека, вложившего в него свое Я.
Меня вообще твоя фраза "... просто офигел, сколько там мудаков, желающих покупать софт. Самые натуральные дятлы и терпилы." вогнала в ступор...
Если провести аналогию с фильмами, есть такие шедевры, которым не жалко отдать деньги (в правильной пропорции, конечно))
Я к тому, что не надо призывать НЕ покупать ничего. Эй, мы ведь здесь "for fun" или как?
ManHunter (21.08.2012 в 08:31):
Видишь как здорово, теперь ты совершенно бесплатно прокачал свой экспиренс по основам IDA. А так бы тупо получил адрес для патча и ничему бы не научился. Последняя сборка, кстати, 2.0.1 build 2217 stable.
Артём (21.08.2012 в 02:06):
Смешной ты)) Да я лучше освою азы IDA, Hiew чтобы выяснить, что в build 2216 (x32; windows) необходимо по адресу .text:[deleted] записать MOV al,1 ;)
ManHunter (19.08.2012 в 23:31):
50$
Артём (19.08.2012 в 23:26):
Привет! Поможите веб-программисту, не шарящему в крекинге поломать build 2216. Единственное что я могу сделать — это открыть EXEшник в HEXeditor и немного его отредактировать))
ManHunter (30.06.2012 в 16:27):
Так можно ж немного напрячься и сделать самому. Примеры валяются в папке "Pristine Packages", список ассемблерных команд для подсветки можно выдрать из hiew, остальное дело техники. Всей работы на пару часов, может даже меньше. Автокомплит основных конструкций языка не менее легко добивается сниппетами. Тут придется повозиться чуть подольше, зато один раз и надолго.
Mr. Done (30.06.2012 в 16:24):
еще бы найти подсветку асм синтаксиса и автокомплит, и можно кодить :)
ManHunter (29.06.2012 в 16:32):
Софт должен распространяться без каких-либо ограничений (триала, окон и прочей херни). Если пользователю софт нравится, то он перечисляет разработчику денежку, столько, сколько считает нужным. Это схема donationware, но не принудительного, как иногда бывает, а абсолютно добровольного. И вообще, софт можно запросто писать в свободное от основной работы время, в свое удовольствие и на благо остальных людей. Программирование - это искусство, а не ремесло.

Бабло можно отбивать на платной техподдержке, на реализации внеплановых заказов на какие-либо новые фичи и на корпоративных клиентах. А для частного использования любой софт должен быть абсолютно бесплатным.

И я не слышал, чтобы кто-то из нормальных разработчиков прекращал разработку из-за взломов. Бывают, конечно, какие-то обиженные школьники, которые накорябали стопицотый вариант платного медиа-конвертера, а их на следующий день зарелизили. Но обиженных ебут, это всем известно.
Руслан (29.06.2012 в 16:27):
Ну я как бы тоже не понимаю зачем платить, если можно бесплатно. Но с другой стороны, разработчик прекратит разработку без мотивации...
ManHunter (27.06.2012 в 16:01):
Зафиналили, можно патчить :) Почитал "популярный IT-ресурс" и просто офигел, сколько там мудаков, желающих покупать софт. Самые натуральные дятлы и терпилы. Они даже гордятся и хвастаются тем, что КУПИЛИ его *facepalm*
Mr. Done (19.06.2012 в 13:19):
О, видать следующую версию пропатчу именно так:)

А то я на скорую руку в хиеве патчил два байта:
1. Чтоб не показывало дурацкое сообщение рандомно при сохранении
2. Чтоб убирало из заголовка UNREGISTERED :)
Yoshida (13.04.2012 в 14:27):
ManHunter, спасибо за развернутый ответ, это все объясняет. Сегодня уже не удивился, когда заглянул в DLL плагина к irfan view - CADImage.dll размером в 2 мб, который выдал при просмотре SVG файла "This Copy Not Registered" на все изображение. Дельфи. Может DLL действительно стоящая, на сайте производителя этой библиотеки написано, что поддерживается 30 форматов изображений, но, на мой взгляд, все преимущества сходят на нет, когда именно конечный пользователь должен платить бабки за использование этой библиотеки, а не разработчик, который ее использовал при написании своего кода. Это какой-то лохотрон получается :)

Только не подумай, что это "заказ"! Просто делюсь переживаниями о том, как много несправедливости в этой жизни.
ManHunter (13.04.2012 в 08:58):
Да вообще программ на Дельфи гораздо больше, видимо сказывается доступность и количество всяких готовых компонентов. Всяко ж проще слепить в кучу десяток мегабайт готовых кусков, чем сидеть и кропотливо отлаживать каждую строчку. После того, как будет высран очередной мультимедиа-конвертер или супер-пупер оптимизатор реестра, тут же возникает желание его продать. А как же, "программист" "трудился", пытался заставить чужие куски говна работать почти без ошибок в своей куче говна. Только за одно это весь мир уже должен ему бабосов.

Есть, конечно, действительно талантливые программисты на Дельфи и очень классные программы, только их мало. Программирование - это не ремесло, а искусство, но сейчас об этом почти забыли.
Yoshida (12.04.2012 в 23:23):
Manhunter, почему-то так сложилось, что большинство программ, которые я успел поковырять, написаны на Delphi. Создается впечатление, что люди, пишущие на Delphi, более жадные, чем программисты на других языках

Преждевременно "добавил". Так вот, собственно, хотел спросить: у тебя намного больше опыт, это действительно так, или просто так повезло? :)
vox13 (10.04.2012 в 23:54):
Не ожидал такого быстрого ответа ) Но кстати, разработчик Sublime похоже не очень то хотел защититься от хакеров..
ManHunter (10.04.2012 в 23:51):
Нет, речь идет о хабре.
vox13 (10.04.2012 в 23:49):
Я а считаю что ManHunter - красавчег. А "популярный IT-ресурс" это не хакер ру случаем? :)
unix3d (09.04.2012 в 11:24):
Всё работает и для х64 call sub_1400F31C0 патчим соответсвенно!!! Notepad++ выбор огромного числа людей )))))
ManHunter (09.04.2012 в 10:43):
AyTkACT, действительно неплохой редактор. Перейти на него пока не решаюсь, т.к. Notepad++ лично для меня все-таки рулит, но портативный вариант буду держать под рукой.
AyTkACT (09.04.2012 в 09:46):
Sublime Text стоил тех 2х минут затраченных на патчинг или очередной говнософтец?
ManHunter (08.04.2012 в 19:34):
Лучше тренируйся на крякмисах: http://crackmes.de , они специально для этого делаются. Их там немеряно, любой сложности и на любом языке программирования. А потом уже сам выберешь реальную программу для ковыряния.
2 (08.04.2012 в 18:51):
:)
а можете посоветовать какие-нибудь проги для того чтоб потренится во взломе, на которые вам было лень писать статью? )) мне кажется таких куча ))

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0048 сек.) / Память: 4.5 Mb
Наверх