Blog. Just Blog

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

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

Coolmuster SignPub - программа для создания и редактирования электронных книг в популярном формате ePub с возможностью разметки текста, добавления изображений, создания оглавления и т.п. Несмотря на то, что ePub – открытый формат файлов, об этом редакторе такого сказать нельзя. Только за деньги, только хардкор.

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

Ограничение незарегистрированной версии
Ограничение незарегистрированной версии

На попытку ввода левых регистрационных данных программа реагирует вот таким сообщением.

Окно регистрации
Окно регистрации

Ну что ж, для начала исследования информации более чем достаточно. Исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер.

Строки сообщений в файле
Строки сообщений в файле

Строки сообщений легко обнаруживаются в файле. Давайте посмотрим, при каком условии выводится сообщение о корректной регистрации:
  1. .text:005881F0                 push    ebp
  2. .text:005881F1                 mov     ebp, esp
  3. .text:005881F3                 push    0FFFFFFFFh
  4. .text:005881F5                 push    offset loc_5A2018
  5. .text:005881FA                 mov     eax, large fs:0
  6. .text:00588200                 push    eax
  7. .text:00588201                 sub     esp, 1F4h
  8. .text:00588207                 mov     eax, dword_6DCB10
  9. .text:0058820C                 xor     eax, ebp
  10. .text:0058820E                 mov     [ebp+var_10], eax
  11. .text:00588211                 push    ebx
  12. .text:00588212                 push    esi
  13. .text:00588213                 push    edi
  14. .text:00588214                 push    eax
  15. .text:00588215                 lea     eax, [ebp+var_C]
  16. .text:00588218                 mov     large fs:0, eax
  17. .text:0058821E                 mov     eax, ds:?wxEmptyString@@3PB_WB
  18. ; wchar_t const * const wxEmptyString
  19. .text:00588223                 mov     edi, ecx
  20. .text:00588225                 mov     ecx, [eax]
  21. .text:00588227                 push    ecx
  22. .text:00588228                 lea     ecx, [ebp+var_200]
  23. .text:0058822E                 call    ds:??0wxString@@QAE@PB_W@Z
  24. ; wxString::wxString(wchar_t const *)
  25. .text:00588234                 push    offset aYouHaveRegiste
  26. ; "You have registered successfully!"
  27. .text:00588239                 lea     ecx, [ebp+var_17C]
  28. .text:0058823F                 mov     [ebp+var_4], 0
  29. .text:00588246                 call    ds:??0wxString@@QAE@PBD@Z
  30. ; wxString::wxString(char const *)
  31. .text:0058824C                 mov     byte ptr [ebp+var_4], 1
  32. .text:00588250                 call    ds:?Get@wxTranslations@@SAPAV1@XZ
  33. ; wxTranslations::Get(void)
  34. .text:00588256                 test    eax, eax
  35. .text:00588258                 jz      short loc_588272
  36. .text:0058825A                 lea     edx, [ebp+var_200]
  37. ...
  38. ...
Вывод сообщения оформлен в отдельную функцию, которая вызывается только из одного места. Вот оно:
  1. .text:00589C85                 push    eax
  2. .text:00589C86                 mov     ecx, ebx
  3. .text:00589C88                 call    sub_5873A0
  4. ; Вызвать функцию проверки
  5. .text:00589C8D                 call    sub_572450
  6. ; Взвести AL=1 в случае, если из функции вернулось AL=0
  7. .text:00589C92                 test    al, al
  8. .text:00589C94                 setz    al
  9. .text:00589C97                 mov     [esi+210h], al
  10. .text:00589C9D                 mov     ecx, esi
  11. ; Проверить результат проверки
  12. .text:00589C9F                 test    al, al
  13. .text:00589CA1                 jz      short loc_589CBA
  14. ; Сообщение о неправильной регистрации
  15. .text:00589CA3                 call    sub_588CB0
  16. .text:00589CA8                 mov     ecx, [ebp+var_C]
  17. .text:00589CAB                 mov     large fs:0, ecx
  18. .text:00589CB2                 pop     ecx
  19. .text:00589CB3                 pop     edi
  20. .text:00589CB4                 pop     esi
  21. .text:00589CB5                 pop     ebx
  22. .text:00589CB6                 mov     esp, ebp
  23. .text:00589CB8                 pop     ebp
  24. .text:00589CB9                 retn
  25. .text:00589CBA ; ----------------------------------------------
  26. .text:00589CBA loc_589CBA:
  27. ; Вывести сообщение об успешной регистрации
  28. .text:00589CBA                 call    sub_5881F0
  29. .text:00589CBF                 mov     ecx, [ebp+var_C]
  30. .text:00589CC2                 mov     large fs:0, ecx
  31. .text:00589CC9                 pop     ecx
Таким образом, в случае успешной регистрации из функции проверки в регистре AL должно вернуться ненулевое значение. Давайте теперь посмотрим на эту проверку:
  1. .text:00572450 sub_572450      proc near
  2. .text:00572450                 mov     eax, dword_709438
  3. .text:00572455                 push    eax
  4. .text:00572456                 call    sub_572C10
  5. .text:0057245B                 add     esp, 4
  6. .text:0057245E                 test    eax, eax
  7. .text:00572460                 setz    al
  8. .text:00572463                 retn
  9. .text:00572463 sub_572450      endp
По сути это просто переходник на функцию sub_572C10, которая вызывается только отсюда. А вот сам переходник уже вызывается из четырех мест, что явно намекает на его ключевое значение в механизме проверки регистрации. Так что мудрить не будем и просто пропатчим эту функцию, записав по адресу 00572450 пару команд MOV AL,1 и RET. Сохраняем изменения, проверяем результат.

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (12.08.2022 в 17:09):
Хорошо, в следующий раз буду писать "ЕБАТЬ ПЛАТНЫЙ СОФТ"
кодер (12.08.2022 в 17:07):
Кстати, слово SHAREWARE уже довольно редко употребляется, и само это явление касается времён BBS, дискет и медленного интернета. Сейчас чаще пишут "free trial" или что-то типа того. Помните может такую организацию как ASP (Association of Shareware Professionals, создатели формата PAD), которая объединяла инди-разработчиков шароварок? Потом они переименовались в Association of Software Professionals. А в декабре 2021 года эта организация перестала существовать(!). Не то чтобы инди-шаровара совсем исчезла, нет, низкосортные индокитайские формошлёпы ещё остались, выжили и зубры индустрии - создатели качественного коммерческого софта под десктоп, однако уже больше десяти лет как все ломанулись в веб и смартфоны, просто потому что там можно заработать на порядки больше бабла, вот в чём основная причина падения интереса. Раньше все равнялись на Билли, а сейчас на Цукера.

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

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

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