Blog. Just Blog

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

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

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

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

Программа требует соединение с интернетом
Программа требует соединение с интернетом

После регистрации, как нас заверяют, Photo Glamour сможет работать и в автономном режиме. В интернет пускать не будем, поищем в файле что-нибудь, связанное с триалом.

Строка сообщения найдена
Строка сообщения найдена

Ну вот, интересная строка. Так как информация о триальном сроке хранится не у нас, то рано или поздно мы получим это сообщение. Вот оно в листинге дизассемблера:
  1. ...
  2. .text:00460239                 mov     al, [ebp+var_8]
  3. .text:0046023C                 test    al, al
  4. .text:0046023E                 jnz     loc_4602FA
  5. .text:00460244                 lea     edx, [ebp+var_2A0]
  6. .text:0046024A                 mov     eax, offset aTrialExpired
  7. ; "Trial expired"
  8. .text:0046024F                 call    sub_79FA90
  9. .text:00460254                 mov     edx, [ebp+var_2A0]
  10. ...
Выше по тексту еще целая куча интересного. Парочка красивых кусочков:
  1. ...
  2. ; Сообщение о неправильной лицензии
  3. .text:0045FF97                 mov     [ebp+var_8], 0
  4. .text:0045FF9B                 lea     edx, [ebp+var_6C]
  5. .text:0045FF9E                 mov     eax, offset aNoValidLicense
  6. ; "No valid license installed"
  7. .text:0045FFA3                 call    sub_79FA90
  8. .text:0045FFA8                 mov     edx, [ebp+var_6C]
  9. .text:0045FFAB                 mov     eax, [ebp+var_4]
  10. ...
  11. ; Похоже на поиск файла лицензии с расширением ".idlic"
  12. .text:00460091                 call    sub_4095A0
  13. .text:00460096                 mov     edx, [ebp+var_274]
  14. .text:0046009C                 mov     ecx, offset a_idlic ; "*.idlic"
  15. .text:004600A1                 lea     eax, [ebp+var_270]
  16. .text:004600A7                 call    sub_408820
  17. .text:004600AC                 mov     eax, [ebp+var_270]
  18. ...
Но самое интересное, что эта проверка оформлена в виде отдельной функции. По всей видимости это проверка наличия локального файла с лицензией и его корректности. А вот код, откуда она вызывается:
  1. ...
  2. .text:00460439                 lea     eax, [ebp+var_8]
  3. ; Вызвать функцию проверки локальной лицензии
  4. .text:0046043C                 call    sub_45FF20
  5. .text:00460441                 test    al, al
  6. ; Если она вернула AL=0, то программа не зарегистрирована
  7. .text:00460443                 jz      short loc_46044E
  8. ; Занести в переменную значение 1...
  9. .text:00460445                 mov     [ebp+var_4], 1
  10. ; ... и упрыгать далеко за все нехорошие сообщения
  11. .text:00460449                 jmp     loc_460653
  12. .text:0046044E ; -----------------------------------------------
  13. .text:0046044E loc_46044E:
  14. .text:0046044E                 lea     edx, [ebp+var_48]
  15. .text:00460451                 mov     eax, offset aTrialExpired
  16. ; "Trial expired"
  17. .text:00460456                 call    sub_79FA90
  18. .text:0046045B                 mov     edx, [ebp+var_48]
  19. ...
Чтобы обойти эту проверку надо заNOPить условный переход по адресу 00460443. Теперь программа запускается, хотя и ругается при старте, что не может получить доступ в интернет. С этим мы разберемся чуть позже.

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

Строка сообщения найдена
Строка сообщения найдена

По перекрестным ссылкам находим место в листинге, где она используется, не забывая выяснить условия ее появления:
  1. .text:00442146                 mov     edx, ds:dword_13D9020
  2. .text:0044214C                 lea     eax, [ebp+var_8]
  3. .text:0044214F                 call    sub_40A260
  4. ; Вызывать функцию проверки
  5. .text:00442154                 call    sub_45FE50
  6. ; Если она вернула AL=0, то добавить в заголовок триальный счетчик
  7. .text:00442159                 test    al, al
  8. .text:0044215B                 jnz     short loc_4421C2
  9. .text:0044215D                 mov     eax, [ebp+var_8]
  10. .text:00442160                 mov     [ebp+var_3C], eax
  11. .text:00442163                 mov     eax, offset unk_C8D1E8
  12. .text:00442168                 mov     [ebp+var_38], eax
  13. .text:0044216B                 lea     eax, [ebp+var_40]
  14. .text:0044216E                 push    eax
  15. .text:0044216F                 mov     eax, ds:dword_13D90C0
  16. .text:00442174                 mov     [ebp+var_4C], eax
  17. .text:00442177                 mov     [ebp+var_50], 0
  18. .text:0044217E                 mov     eax, ds:dword_13D90B0
  19. .text:00442183                 mov     [ebp+var_44], eax
  20. .text:00442186                 mov     [ebp+var_48], 0
  21. .text:0044218D                 lea     ebx, [ebp+var_50]
  22. .text:00442190                 lea     edx, [ebp+var_54]
  23. .text:00442193                 mov     eax, offset aTrialDayDOfD
  24. ; "trial day %d of %d"
  25. .text:00442198                 call    sub_79FA90
  26. .text:0044219D                 mov     eax, [ebp+var_54]
  27. .text:004421A0                 mov     ecx, 1
  28. .text:004421A5                 mov     edx, ebx
  29. .text:004421A7                 call    sub_48B220
  30. .text:004421AC                 mov     eax, [ebp+var_40]
  31. .text:004421AF                 mov     [ebp+var_34], eax
  32. .text:004421B2                 lea     edx, [ebp+var_3C]
  33. .text:004421B5                 lea     eax, [ebp+var_8]
  34. ...
Тут тоже все понятно, вызывается функция проверки по адресу 0045FE50, по ее результатам в заголовок или добавляется строка триального счетчика дней, или нет. Правильное значение, которое должна вернуть функция проверки, это AL=1. Патчим адрес 0045FE50 командами MOV AL,1 и RET. Запускаем. Триальный счетчик в заголовке пропал, а кроме этого разблокировалось такое неприятное ограничение незарегистрированной программы, как невозможность сохранить отредактированную картинку. Осталось победить окно, которое появляется при старте программы. Оно формируется следующей функцией:
  1. .text:008A5320                 push    ebp
  2. .text:008A5321                 mov     ebp, esp
  3. .text:008A5323                 sub     esp, 4Ch
  4. .text:008A5326                 mov     [ebp+var_4C], ebx
  5. .text:008A5329                 mov     [ebp+var_4], eax
  6. .text:008A532C                 mov     [ebp+var_48], 0
  7. .text:008A5333                 mov     [ebp+var_44], 0
  8. .text:008A533A                 lea     eax, [ebp+var_40]
  9. .text:008A533D                 call    sub_40F1B0
  10. .text:008A5342                 mov     [ebp+var_30], 0
  11. .text:008A5349                 lea     ecx, [ebp+var_10]
  12. .text:008A534C                 lea     edx, [ebp+var_28]
  13. .text:008A534F                 mov     eax, 1
  14. .text:008A5354                 call    sub_40EAC0
  15. .text:008A5359                 call    sub_4111B0
  16. .text:008A535E                 push    eax
  17. .text:008A535F                 test    eax, eax
  18. .text:008A5361                 jnz     short loc_8A53D0
  19. .text:008A5363                 lea     edx, [ebp+var_30]
  20. .text:008A5366                 mov     eax, offset aDuringThisTria
  21. ; "During this trial, an internet connecti"...
  22. .text:008A536B                 call    sub_79FA90
  23. .text:008A5370                 mov     edx, [ebp+var_30]
  24. .text:008A5373                 mov     eax, [ebp+var_4]
  25. .text:008A5376                 add     eax, 8
  26. .text:008A5379                 call    sub_40A260
  27. .text:008A537E                 push    2
  28. .text:008A5380                 lea     eax, [ebp+var_30]
  29. .text:008A5383                 call    sub_409FB0
  30. .text:008A5388                 lea     edx, [ebp+var_44]
  31. .text:008A538B                 mov     eax, offset aPleaseConnec_0
  32. ; "Please connect to the internet and try "...
  33. .text:008A5390                 call    sub_79FA90
  34. .text:008A5395                 mov     ebx, [ebp+var_44]
  35. .text:008A5398                 lea     edx, [ebp+var_48]
  36. .text:008A539B                 mov     eax, offset aSomethingWentW
  37. ; "Something went wrong while trying to qu"...
  38. .text:008A53A0                 call    sub_79FA90
  39. .text:008A53A5                 mov     edx, [ebp+var_48]
  40. ...
Команда RET, записанная в начало функции по адресу 008A5320 успокаивает программу навсегда. Теперь можно смело блокировать фаерволом все ее оставшиеся порывы в интернет, все функциональные ограничения тоже сняты. Единственное что осталось, это окно "О программе". Файла лицензии у нас нет и не предвидится, поэтому там красуется строка "unregistered", хотя она уже ни на что не влияет. Если есть желание, то можно заменить ее, например, на свое имя. Это вы уже можете сделать самостоятельно.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (20.11.2013 в 22:25):
Главное, ребята, перцем не стареть!
Never (20.11.2013 в 22:16):
"Это Саша Грей ;) " - на молодую аудиторию метишь?! В нашем с тобой возрасте надо Джену Джеймсон ставить )))
ChVL (13.11.2013 в 00:38):
Прошу прощения. В HEX редакторе делал Find Text, занялся подменой и совсем вылетело из головы, что надо ещё воспользоваться Simultaneous Search. Там эта строка есть, и вместо unregistered можно вписать всё, что угодно.
ChVL (12.11.2013 в 19:42):
У меня не получилось. Более того, там есть два указателя: Registered - BA 00 0C 31 01 и Unregistered - BA 20 0C 31 01, так подмена (во многих случаях обычно проблему решает) здесь почему-то не срабатывает.
ManHunter (12.11.2013 в 09:05):
Подсказываю: можно перенаправить указатель со строки Unregistered на какую-нибудь другую ненужную строку, а потом поменять эту другую строку.
ChVL (12.11.2013 в 08:36):
В окне About строку Unregistered можно только убрать, а вот заменить её на себя любимого, ну, никак не удастся...
brute (21.10.2013 в 06:21):
можно заменить всего один байт по адресу 006ED5CF.. Сообщение о триале осталось, но всё работает. Кста, программа сильно виснет на "сложных" абстакциях фрактального типа.
Никита (18.10.2013 в 15:11):
Нашли на ком потренироваться )))))))))
AyTkACT (10.10.2013 в 22:06):
ManHunter, тьфу ты. Срамота! :-D
ManHunter (10.10.2013 в 21:58):
Это Саша Грей ;)
AyTkACT (10.10.2013 в 21:56):
ManHunter, знакомая фотомордочка на скринах. Где-то когда-то видел. Куда копать?
Grey (10.10.2013 в 16:12):
Раньше не задумывался что "исследование" относительно несложное мероприятие (с точки зрения "доступа к телу"). Раньше в эту ветку я просто заглядывал. Теперь заинтересовался, достаточно "спортивная" вещь. Конечно даже этот уровень для меня выше моих возможностей, по "твоим стопам" вроде все просто", постороннюю вещицу возьмешь - жесть. Спасибо за интересные статьи.
ManHunter (10.10.2013 в 14:19):
Гораздо меньше, чем на написание статьи. На защиту такого уровня обычно уходит минут 5-10, на статью уходит 1-2 часа. Конкретно для этой программы есть еще парочка более шустрых и эффективных вариантов патчей, но они "не очевидные", я просто не смогу объяснить как я до них добрался.
Grey (10.10.2013 в 14:16):
Интересно сколько "чистого времени" ты тратишь на такую гололомку?

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

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

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