Blog. Just Blog

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

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

Texturizer - маленький и шустрый текстовый редактор с подсветкой синтаксиса около 30 языков программирования и различными фнукциями, присущими "взрослым" IDE. Что, впрочем, не мешает ему быть использованным даже в качестве замены Блокнота для редактирования текстов. А вот ограничение в месяц триального срока и двадцатка баксов за коммерческую лицензию - это как раз мешает.

На офсайте почему-то выложена старая версия редактора, более свежий дистрибутив можно найти тут. Скачиваем, устанавливаем, смотрим. Программа написана на Visual Basic, отправляем его в дизассемблер. Пока тот работает, посмотрим, как программа реагирует на неправильные регистрационные данные:

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Отлично, строка сообщения у нас есть. Поищем ее в листинге дизассемблера и посмотрим условия ее появления.
  1. .text:0051A4DE                 mov     edx, [ebp-18h]
  2. .text:0051A4E1                 push    ecx
  3. .text:0051A4E2                 push    edx
  4. .text:0051A4E3                 call    sub_519520
  5. .text:0051A4E8                 mov     ebx, ds:__vbaStrMove
  6. .text:0051A4EE                 mov     edx, eax
  7. .text:0051A4F0                 lea     ecx, [ebp-20h]
  8. .text:0051A4F3                 call    ebx ; __vbaStrMove
  9. .text:0051A4F5                 push    eax
  10. .text:0051A4F6                 call    ds:__vbaStrCmp
  11. ; Записать результат сравнения строк в регистр EDI
  12. .text:0051A4FC                 mov     edi, eax
  13. .text:0051A4FE                 lea     eax, [ebp-20h]
  14. .text:0051A501                 neg     edi
  15. .text:0051A503                 lea     ecx, [ebp-1Ch]
  16. .text:0051A506                 push    eax
  17. .text:0051A507                 sbb     edi, edi
  18. .text:0051A509                 lea     edx, [ebp-18h]
  19. .text:0051A50C                 push    ecx
  20. .text:0051A50D                 inc     edi
  21. .text:0051A50E                 push    edx
  22. .text:0051A50F                 push    3
  23. .text:0051A511                 neg     edi
  24. .text:0051A513                 call    ds:__vbaFreeStrList
  25. .text:0051A519                 lea     eax, [ebp-34h]
  26. .text:0051A51C                 lea     ecx, [ebp-30h]
  27. .text:0051A51F                 push    eax
  28. .text:0051A520                 push    ecx
  29. .text:0051A521                 push    2
  30. .text:0051A523                 call    ds:__vbaFreeObjList
  31. .text:0051A529                 add     esp, 1Ch
  32. ; Проверить содержимое регистра DI
  33. .text:0051A52C                 test    di, di
  34. ; Вывести сообщение о неправильной регистрации
  35. .text:0051A52F                 jz      loc_51A9C0
  36. .text:0051A535                 mov     edi, ds:__vbaStrCopy
  37. ...
  38. ...
  39. ...
  40. .text:0051AA0E                 call    edi ; __vbaStrCopy
  41. .text:0051AA10                 xor     edx, edx
  42. .text:0051AA12                 lea     ecx, [ebp-28h]
  43. .text:0051AA15                 call    edi ; __vbaStrCopy
  44. .text:0051AA17                 mov     edx, offset aTheUserNameOrR
  45. ; "The user name or registration code is n"...
  46. .text:0051AA1C                 lea     ecx, [ebp-24h]
  47. .text:0051AA1F                 call    edi ; __vbaStrCopy
  48. .text:0051AA21                 mov     edx, offset aError ; "Error"
  49. .text:0051AA26                 lea     ecx, [ebp-20h]
  50. .text:0051AA29                 call    edi ; __vbaStrCopy
  51. .text:0051AA2B                 mov     edx, [ebp-18h]
  52. .text:0051AA2E                 lea     ecx, [ebp-1Ch]
Что-то с чем-то сравнивается, результат сохраняется в регистр, затем это сохраненное значение проверяется, если сравнение не в нашу пользу, то выводится сообщение о неправильной регистрации. Что и с чем сравнивается узнать в статике невозможно, поэтому отправляем программу в отладчик. Ставим точку останова по адресу 0051A4F6, отпускаем программу на выполнение, офигеваем от количества выброшенных исключений и, наконец, повторив регистрацию с указанными данными, останавливаемся на брейкпоинте. Перед сравнением на стек кладутся два адреса сравниваемых строк. Если посмотреть их в памяти, то обнаружится, что при такой комбинации введенный левый серийник сравнивается со строкой "Illegal". Естественно, сравнение возвращает неравенство.

Поднимаем глаза на несколько строчек выше и смотрим, что там делается. А там готовится контрольная строка для сравнения. Более того, если посмотреть под отладчиком в пошаговом режиме, то вот тут
  1. .text:0051A4DB                 mov     ecx, [ebp-1Ch]
  2. .text:0051A4DE                 mov     edx, [ebp-18h]
  3. ; Передать на проверку серийник и регистрационное имя
  4. .text:0051A4E1                 push    ecx
  5. .text:0051A4E2                 push    edx
  6. ; Вызвать функцию проверки
  7. .text:0051A4E3                 call    sub_519520
  8. .text:0051A4E8                 mov     ebx, ds:__vbaStrMove
  9. .text:0051A4EE                 mov     edx, eax
передаются введенные серийник и имя, затем функция проверки возвращает строку, которая, в свою очередь, используется для сравнения с серийником. Если посмотреть функцию генерации контрольной строки повнимательнее, то обнаружится следующий код:
  1. .text:005195C6                 push    1
  2. .text:005195C8                 lea     ecx, [ebp+var_34]
  3. ; Список запрещенных символов в имени
  4. .text:005195CB                 push    offset a?_0     ; "/\\!?#"
  5. .text:005195D0                 push    ecx
  6. .text:005195D1                 push    eax
  7. .text:005195D2                 push    edx
  8. .text:005195D3                 mov     [ebp+var_2C], 1
  9. .text:005195DA                 mov     [ebp+var_34], 2
  10. .text:005195E1                 call    ds:rtcMidCharBstr
  11. .text:005195E7                 mov     edx, eax
  12. .text:005195E9                 lea     ecx, [ebp+var_24]
  13. .text:005195EC                 call    edi ; __vbaStrMove
  14. .text:005195EE                 push    eax
  15. .text:005195EF                 push    esi
  16. ; Проверяемый символ встречается в имени?
  17. .text:005195F0                 call    ds:__vbaInStr
  18. .text:005195F6                 mov     esi, eax
  19. .text:005195F8                 lea     ecx, [ebp+var_24]
  20. .text:005195FB                 neg     esi
  21. .text:005195FD                 sbb     esi, esi
  22. .text:005195FF                 neg     esi
  23. .text:00519601                 neg     esi
  24. .text:00519603                 call    ebx ; __vbaFreeStr
  25. .text:00519605                 lea     ecx, [ebp+var_34]
  26. .text:00519608                 call    ds:__vbaFreeVar
  27. .text:0051960E                 test    si, si
  28. .text:00519611                 jnz     short loc_519626
  29. .text:00519613                 mov     ecx, [ebp+var_18]
  30. .text:00519616                 mov     eax, 1
  31. .text:0051961B                 add     ecx, eax
  32. .text:0051961D                 xor     esi, esi
  33. .text:0051961F                 mov     [ebp+var_18], ecx
  34. .text:00519622                 mov     eax, ecx
  35. .text:00519624                 jmp     short loc_5195B7
  36. .text:00519626 ; ----------------------------------------------------
  37. .text:00519626 loc_519626:
  38. .text:00519626                 mov     esi, ds:__vbaStrCat
  39. .text:0051962C                 push    offset dword_42CF7C
  40. .text:00519631                 push    offset aIllegal ; "Illegal"
  41. ; Если в имени обнаружился хоть один запрещенный символ, то 
  42. ; записать в контрольную строку слово "Illegal"
  43. .text:00519636                 call    esi ; __vbaStrCat
  44. .text:00519638                 mov     edx, eax
  45. .text:0051963A                 lea     ecx, [ebp+var_24]
  46. .text:0051963D                 call    edi ; __vbaStrMove
  47. .text:0051963F                 push    eax
  48. .text:00519640                 push    offset dword_42CF7C
Вот оно чо, Михалыч. Проверку не прошел слеш из моего ника "ManHunter / PCL". Ну логично, если пользователь не является ребенком Илона Маска, то вряд ли в его имени встретятся какие-нибудь служебные символы. Поменяем регистрационное имя на более человечное, например, "ManHunter PCL" и повторим регистрацию. На этот раз при сравнении контрольной строки и введенного серийника будет уже вполне красивая строка "C98F-608D-B0F2-9B7B-D72E-AA42-F".

Правильный серийный номер на стеке
Правильный серийный номер на стеке

Закрываем отладчик, запускаем программу в обычном режиме и регистрируем программу найденной парой строк "ManHunter PCL" и "C98F-608D-B0F2-9B7B-D72E-AA42-F".

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

Программа благодарит за регистрацию, значит все найдено правильно. Перезапускаем программу, так как в статусной строке все равно продолжает болтаться унылая надпись "Unregistered Version".

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

Вот теперь совсем красота. Триальные уведомления больше не показываются, в интерфейсе все чистенько, в меню пропали пункты, относящиеся к покупке и регистрации, в окне "О программе" красуется регистрационное имя. Цель достигнута.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 599 | Комментариев: 9

Комментарии

Отзывы посетителей сайта о статье
ManHunter (30.12.2021 в 20:48):
ЦитатаА в чём преимущества использования Ghidra вместо IDA?

Дело привычки. Лично мне, например, Гидра недоступна, так как она существует исключительно в разрядности x64, а я признаю только x86. IDA в этом плане чуть более демократична, по крайней мере до начала 7-й версии.
Федор (30.12.2021 в 14:45):
Она и так MSVBVM60.DLL и отладчиком легко
Андрей (29.12.2021 в 11:08):
А в чём преимущества использования Ghidra вместо IDA? Они есть?
user (28.12.2021 в 10:05):
Та какая там магия, поиск в листинге по ссылкам на строки.
В простейшем случае.
Магия начинается, когда строки в явном виде не хранятся, тогда да.
кодер (27.12.2021 в 03:47):
Занимался взломом софта лет 20 назад с помощью Numega Soft-Ice и Hiew. IDA практически не пользовался, поэтому для меня до сих пор магия как люди выискивают все эти проверки регистрации без возможности поставить breakpoint. Сейчас руки не доходят мануалы читать, да и говорят сейчас многие Ghidra пользуют вместо IDA.

Однажды у меня получилось хакнуть один плагин DLL без дебагера (чисто дедуктивно), а один раз вообще резидентом под ДОС успешно ловил проверки проги защищённой HASP (тоже чисто по дедуктивным предположениям как проверка может быть организована).

А вообще, ИМХО, среди шароварок мало осталось живых проектов (хотя может и ошибаюсь). Ссылки на регистрацию на офф сайте Texturizer - не рабочие. Регистратор какой-то WERKS - но походу этот сайт скорее поднятый из вебархива дроп, для продажи ссылок сеошникам-аутричерам.
ManHunter (26.12.2021 в 15:11):
А еще там сравнения сыплются просто сплошным потоком, что очень сильно подвешивает перехватчик.
user (26.12.2021 в 15:11):
.. Да, и по меркам 2004-го года этот редактор очень не маленький, а довольно-таки пухлый. Программы с сопоставимым функционалом занимали до полумегабайта в EXE.
ManHunter (26.12.2021 в 15:09):
Ее тоже первым делом попробовал, но она не дает пройти проверку на наличие запрещенных символов. А так да, однозначно рулит.
user (26.12.2021 в 15:06):
Действительно, сейчас на офсайте рекламируют версию 1.8.1, однако ссылка на её скачивание битая.
Но году в 2006-м у них раздавалась рассматриваемая версия 1.9.2.
Может, сейчас исходники потеряли и оставили страничку просто для истории, х.з.

Кстати, вспомнилась утиль VBASTRCMP в виде патченной MSVBVM60.DLL

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

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

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