Blog. Just Blog

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

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

Скринсейвер Zoom Photo Screensaver представляет собой слайдшоу из ваших фотографий, которые меняются с эффектом "Pan and Zoom". Это небольшое приближение фотографии относительно центра, в результате, как написано на офсайте, получается эффект просмотра кино. Ничего сверхъестественного, но даже за такую ерунду почему-то надо выложить почти двадцатку баксов.

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

Скринсейвер в триальном режме
Скринсейвер в триальном режме

Посмотрим, от чего лучше оттолкнуться в исследованиях. В ресурсах никаких диалоговых окон и текстовых строк нет, зато в самом коде есть:

Строки сообщений о триале и регистрации
Строки сообщений о триале и регистрации

А вот как этот блок выглядит в дизассемблере.
  1. .data:0045FB24 off_45FB24      dd offset aYouAreUsingThe
  2. ; "You are using the trial version\r\n"
  3. .data:0045FB28                 db 0FFh
  4. .data:0045FB29                 db 0FFh
  5. .data:0045FB2A                 db 0FFh
  6. .data:0045FB2B                 db 0FFh
  7. .data:0045FB2C                 db  21h ; !
  8. .data:0045FB2D                 db    0
  9. .data:0045FB2E                 db    0
  10. .data:0045FB2F                 db    0
  11. .data:0045FB30 aYouAreUsingThe db 'You are using the trial version',0Dh,0Ah,0
Напрямую ссылок на строку нет, зато есть указатель, на который, в свою очередь, уже есть ссылки из кода. А точнее одна единственная ссылка:
  1. ; Проверить DWORD
  2. .text:00418E5E                 mov     eax, dword_461370
  3. .text:00418E63                 test    eax, eax
  4. ; Если он не равен нулю, то перепрыгнуть дальше
  5. .text:00418E65                 jnz     short loc_418ECC
  6. .text:00418E67                 lea     eax, [ebp+var_14]
  7. .text:00418E6A                 call    sub_403340
  8. ; Ссылка на указатель на строку "You are using the trial version"
  9. .text:00418E6F                 mov     eax, off_45FB24
  10. .text:00418E74                 mov     [ebp+var_14], eax
  11. .text:00418E77                 push    0CEh
  12. .text:00418E7C                 mov     eax, ds:dword_4732A8
  13. .text:00418E81                 sub     eax, 20h
  14. .text:00418E84                 add     eax, 82h
  15. .text:00418E89                 push    eax
  16. ...
Отлично. Здесь проверяется DWORD по фиксированному адресу 461370, и, если он имеет ненулевое значение, то выполняется переход на обработку строки "This version is registered to", иначе обрабатывается строка "You are using the trial version". Логично предположить, что этот DWORD и является флажком "зарегистрировано".

Ссылки на DWORD регистрации
Ссылки на DWORD регистрации

Теперь поищем место, где этот флаг инициализируется. По перекрестным ссылкам выходим на следующий код:
  1. .text:0045BEB1                 movzx   eax, ds:byte_474DF0
  2. .text:0045BEB8                 mov     dword_461370, eax
Флаг инициализируется значением байта по адресу 474DF0. Точно так же ищем место, где инициализируется этот байт.

Ссылки на BYTE регистрации
Ссылки на BYTE регистрации
  1. ; Вызвать какую-то функцию
  2. .text:0045B488                 lea     edx, unk_465BE0[eax]
  3. .text:0045B48E                 lea     eax, [ebp+var_18]
  4. .text:0045B491                 call    sub_435D80
  5. ; Сохранить во временной переменной ее результат
  6. .text:0045B496                 mov     [ebp+var_66C], al
  7. .text:0045B49C                 inc     ebx
  8. .text:0045B49D loc_45B49D:
  9. ; Временная переменная не равна нулю?
  10. .text:0045B49D                 mov     al, [ebp+var_66C]
  11. .text:0045B4A3                 test    al, al
  12. ; Да, переход
  13. .text:0045B4A5                 jnz     short loc_45B4B3
  14. .text:0045B4A7                 cmp     ebx, 0C7h
  15. .text:0045B4AD                 jle     loc_45B3B4
  16. .text:0045B4B3 loc_45B4B3:
  17. ; Временная переменная не равна нулю?
  18. .text:0045B4B3                 mov     al, [ebp+var_66C]
  19. .text:0045B4B9                 test    al, al
  20. .text:0045B4BB                 jz      loc_45B552
  21. ; Да, инициализировать байт единичкой
  22. .text:0045B4C1                 mov     ds:byte_474DF0, 1
Вот теперь мы добрались до изначальной проверки, с которой начинаются все описанные выше инициализации. Если посмотреть функцию по адресу 435D80, результат которой используется при инициализации, то можно легко догадаться, что это самая обычная функция сравнения двух строк. На вход подаются две строки, стоит присмотреться к этому месту повнимательнее. Приаттачимся отладчиком к процессу скринсейвера при открытом окне настроек, поставим точку останова на вызов функции сравнения строк и попробуем зарегистрировать скринсейвер какими-нибудь левыми данными.

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

Но не тут-то было. Часто срабатывающий трюк со сравнением введенного серийника и правильного серийника тут не прокатывает, сравниваются бинарные значения, причем одно значение остается постоянным, а второе в цикле меняется. Но такая ситуация нам уже встречалась ранее: от введенного серийника считается какой-либо хеш, а затем он сравнивается поочередно со списком хешей, хранимым в самой программе. Не зная даже формата серийного номера, восстановление исходной строки по хешу может быть выполнено только прямым перебором, который запросто займет месяцы и годы. Поэтому красивого решения с кейгенами и серийниками не получится, воспользуемся старым добрым патчем. В начало функции сравнения по адресу 00435D80 запишем команды MOV AL,1 и RET. Теперь при любом раскладе байт регистрации будет взводиться в правильное значение. Сохраняем изменения, повторяем регистрацию:

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
SHREEF (31.01.2015 в 21:38):
Как всегда на высоте , ManHunter! так держать!!!!!
brute (21.01.2015 в 17:30):
чтобы поставить точку, сделал портабельную версию по методу ManHunter'a (запустить reg-файл, а потом зарегить прогу любым ключом)
мой метод с патчем RegSetValueExA не работает, так как все настройки хранятся в реесте, то прога не может туда писать настройки отображения картинок, задержку и т.п. Можно, конечно, каждый раз править reg-файл, но неудобно..
X-Wing Top Ace (21.01.2015 в 12:52):
Дошло наконец - Doxtup из себя копираста разыгрывает. В теме про кряк Spot On The Mouse он сам высмеял такой комментарий про "из-за кряка с голоду помру" и написАл тут хохму про голодные дрова. Натурально вышло, я вот купился. ;)

ЦитатаЯ гляжу шутка юмора удалась )))

Точно - вот и я купился. Потом сообразил глянуть в другую тему!

ЦитатаНасчет курил - не курю и вам не советую)

И я тоже.
Doxtup (21.01.2015 в 12:51):
Цитатаmy driver dies of hunger

Голодные дрова? ;)))) Что курил этот Doxtup? ;))))


Я гляжу шутка юмора удалась )))
Ну а так переводил в гуголе - усе претензии к нему.
Насчет курил - не курю и вам не советую)
X-Wing Top Ace (21.01.2015 в 12:46):
ЦитатаВидимо, имелось в виду: мой водитель помрет с голодухи.

А это уже как в том анекдоте, где дочь НэРэ писала сочинение про бедную семью: "Жила на свете очень бедная семья. Отец был беден, мать была бедна, дети были бедны, горничная была бедна, садовник был беден, водитель был беден, вообще жила в бедности вся прислуга".
kaktustv (21.01.2015 в 12:00):
ЦитатаГолодные дрова?

Видимо, имелось в виду: мой водитель помрет с голодухи.
X-Wing Top Ace (21.01.2015 в 11:16):
ЦитатаСкоро это будет локальным мемом

Кстати, одно пророчество из советского кинА. ;) Фильм "Волшебный голос Джельсомино" снимали в 1977, когда никаких кряков и торрентов еще не существовало. Однако умудрились напророчить такую фразу: "пират" будет означать "справедливый человек"!

И означает же - после того, как кряки и торренты появились! Хотя понятно, что в реале все было наоборот - копирасты решили, что "справедливый человек" будет означать "пират", так и пошло - пираты да пираты.

Цитатаmy driver dies of hunger

Голодные дрова? ;)))) Что курил этот Doxtup? ;))))
ManHunter (18.01.2015 в 18:37):
IDA Pro. Ctrl+X на нужном адресе
Soso (18.01.2015 в 18:31):
Подскажите пжл.::
как называется тулза для поиска перекрестных ссылок или где взять ?!?)
ManHunter (18.01.2015 в 14:59):
Скоро это будет локальным мемом
Doxtup (18.01.2015 в 14:56):
Hello, I am the author of this program , please remove the article about hacking . otherwise I would not be able to buy a mozzerete , and my driver dies of hunger.
brute (18.01.2015 в 13:11):
Чтобы прога работала всегда, надо патчить екзешник и далее распространять/хранить каталог с программой. То есть, исходный дистрибутив не подойдет, ибо рабочий ключ не подсмотреть.  Дистрибутив пишет время в реестр при установке. Можно почистить реестр и запатчить функцию, которой прога пишет данные в реестр "RegSetValueExA", например, по адресу 0043A29C поменять переход на безусловный. В дальнейшем ни чистка реестра ни ввод каких-либо данных не понадобятся
brute (18.01.2015 в 10:04):
нашёл ветки реестра, ответственные за триал. Можно раз в неделю запускать reg файл, но лучше пропатчить.
https://yadi.sk/d/8Mdn3s4fe4Skf
brute (18.01.2015 в 07:33):
на XP перевод часов не помогает перевести прогу в триальный период, триал не работает. Сие наводит на мысль, что прога определяет по реестру зарегистрирована ли она. А реестр в W7 и XP не совпадают..
Игорь (17.01.2015 в 23:15):
Отличия, как я понимаю, в конкретных адресах и надписях, а алгоритм проверки на зарегистрированность и "лечения" идентичен описанному Вами ?
ManHunter (17.01.2015 в 19:53):
Не прямо так же, но очень похоже
Игорь (17.01.2015 в 16:56):
Подскажите, а Photo Slideshow Screensaver от этого же производителя также лечится ?

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

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

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