Blog. Just Blog

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

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

Happy Photo Viewer - программа для просмотра пачки фотографий в режиме слайдшоу с различными музыкальными и графическими эффектами. Без регистрации работает 15 дней, после чего требует прогуляться в кассу.

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

Триальное окно
Триальное окно

По текстовым строчкам из окна ввода серийного номера в исполняемом файле обнаружатся вот такие приметные сообщения:

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

Нас интересует строка с благодарностью за регистрацию. Как нетрудно догадаться, она должна появиться при вводе правильных регистрационных данных. Вернемся в дизассемблер и посмотрим, при каких условиях она будет задействована.
  1. .text:00538D96                 mov     eax, [ebx+364h]
  2. .text:00538D9C                 cmp     dword ptr [eax+260h], 1
  3. .text:00538DA3                 jnz     short loc_538E21
  4. .text:00538DA5                 lea     eax, [ebp+var_4]
  5. .text:00538DA8                 push    eax
  6. .text:00538DA9                 xor     ecx, ecx
  7. .text:00538DAB                 mov     edx, offset _str_Your_registrati.Text
  8. .text:00538DB0                 mov     eax, offset _str_Register.Text
  9. .text:00538DB5                 call    @Dialogs@InputBox
  10. ; Dialogs::InputBox(System::AnsiString,System::AnsiString,System::AnsiString)
  11. .text:00538DBA                 lea     edx, [ebp+var_8]
  12. .text:00538DBD                 mov     eax, 2000h
  13. ; Сконвертировать число 2000h (8192) в строку
  14. .text:00538DC2                 call    @Sysutils@IntToStr$qqri
  15. ; Sysutils::IntToStr(int)
  16. .text:00538DC7                 mov     eax, [ebp+var_8]
  17. .text:00538DCA                 mov     edx, [ebp+var_4]
  18. ; Поиск подстроки в строке
  19. .text:00538DCD                 call    @System@Pos$qqrx17System@AnsiStringt1
  20. ; System::Pos(System::AnsiString,System::AnsiString)
  21. .text:00538DD2                 dec     eax
  22. .text:00538DD3                 jl      short loc_538E21
  23. .text:00538DD5                 lea     edx, [ebp+var_C]
  24. .text:00538DD8                 mov     eax, 0FFFFFFF9h
  25. ; Сконвертировать число 0FFFFFFF9h (-7) в строку
  26. .text:00538DDD                 call    @Sysutils@IntToStr$qqri
  27. ; Sysutils::IntToStr(int)
  28. .text:00538DE2                 mov     eax, [ebp+var_C]
  29. .text:00538DE5                 mov     edx, [ebp+var_4]
  30. ; Поиск подстроки в строке
  31. .text:00538DE8                 call    @System@Pos$qqrx17System@AnsiStringt1
  32. ; System::Pos(System::AnsiString,System::AnsiString)
  33. .text:00538DED                 dec     eax
  34. .text:00538DEE                 jl      short loc_538E21
  35. .text:00538DF0                 lea     eax, [ebp+var_4]
  36. .text:00538DF3                 mov     edx, offset _str_Incorrect_Regis.Text
  37. .text:00538DF8                 call    @System@@LStrLAsg$qqrpvpxv
  38. ; System::__linkproc__ LStrLAsg(void *,void *)
  39. .text:00538DFD                 mov     eax, off_547BA0
  40. .text:00538E02                 mov     eax, [eax]
  41. .text:00538E04                 call    sub_53E0BC
  42. .text:00538E09                 mov     eax, off_547BA0
  43. .text:00538E0E                 mov     eax, [eax]
  44. .text:00538E10                 mov     byte ptr [eax+42Dh], 1
  45. .text:00538E17                 mov     eax, offset _str_Thank_you_for_r.Text
  46. .text:00538E1C                 call    @Dialogs@ShowMessage
  47. ; Dialogs::ShowMessage(System::AnsiString)
В листинге видны вызовы библиотечных функций поиска подстроки в строке, но что и где ищется пока непонятно. Для прояснения ситуации загрузим программу в отладчик, поставим точку останова где-нибудь по адресу 00538DA9 и отпустим программу на выполнение. При вводе левого серийника сработает точка останова. В пошаговом режиме выясняем, что первая проверка - поиск подстроки "8192" в строке серийника, причем ее позиция должна быть дальше первого символа. Вторая проверка - наличие подстроки "-7" в строке серийника, позиция также не первая. Остальные символы никакого значения не имеют. Например, валидным серийником, подходящим под эту схему, будет строка "0000-7000-8192" или что-то подобное. Перезапускаем программу, вводим найденный серийник.

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (03.07.2021 в 21:45):
Fedy, обязательно держи нас в курсе.
Fedy (03.07.2021 в 21:43):
Совсем не интересно такую глупость ковырять идея генерации серийника только интересна и всего, а все остальное в осадок
ManHunter (23.06.2021 в 19:27):
Такой же ущербный, как и сама программа.
wet (23.06.2021 в 13:31):
Там ещё и Хранитель экрана в комплекте!

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

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

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