Blog. Just Blog

Исследование защиты скринсейверов 3Planesoft

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

3Planesoft - один из производителей очень красивых трехмерных скринсейверов. За годы существования компании было выпущено несколько десятков качественных скринсейверов и анимированных обоев различной тематики. К сожалению, практически все скринсейверы платные. Да, цена невысокая, но все-таки и не нулевая, поэтому добро пожаловать на мой разделочный стол. Защиту будем разбирать на примере одного из моих любимых скринсейверов The Lost Watch.

Забираем с офсайта дистрибутив, устанавливаем, смотрим. Скринсейвер состоит из двух частей, это лаунчер-конфигуратор, который записывается в папку WINDOWS\System32, а также основной графический модуль, который устанавливается в %ProgramFiles%. Начнем с конфигуратора. После запуска скринсейвера появляется инструкция о горячих клавишах, в том числе и о запуске настроек. Этим и воспользуемся. Попробуем зарегистрировать какими-нибудь левыми данными.

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

Жесть какая... "Навереный"... Как я понимаю, это сообщение вообще никто никогда не видел. Легальные пользователи вводят корректные регистрационные данные, а любители халявы пользуются варезом. Другого объяснения я не вижу, иначе бы кто-нибудь уже давно сообщил разработчикам об ошибке.

Строки в файле
Строки в файле

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

Строки в файле
Строки в файле

По наименованию тега в файле найдутся нужные строки. Теперь загоним исполняемый файл в дизассемблер и посмотрим, как и при каких условиях эти строки задействуются.
  1. .text:00664573                 call    sub_764620
  2. .text:00664578                 mov     ecx, eax
  3. .text:0066457A                 call    sub_764B80
  4. .text:0066457F                 mov     byte ptr [ebp+var_4], 0Ch
  5. .text:00664583                 push    eax
  6. ; Вызвать функцию проверки
  7. .text:00664584                 call    sub_65D320
  8. .text:00664589                 add     esp, 4
  9. ; Сохранить результат проверки
  10. .text:0066458C                 mov     [esi+29h], al
  11. .text:0066458F                 mov     byte ptr [ebp+var_4], 0Bh
  12. .text:00664593                 lea     ecx, [ebp+var_840]
  13. .text:00664599                 call    sub_41DF50
  14. .text:0066459E                 mov     byte ptr [ebp+var_4], 0Ah
  15. .text:006645A2                 lea     ecx, [ebp+var_880]
  16. .text:006645A8                 call    sub_41DF50
  17. .text:006645AD                 sub     esp, 18h
  18. ; Проверить результат проверки ;)
  19. .text:006645B0                 cmp     byte ptr [esi+29h], 0
  20. .text:006645B4                 mov     ecx, esp
  21. .text:006645B6                 mov     [ebp+var_89C], esp
  22. .text:006645BC                 push    0Ch
  23. .text:006645BE                 mov     dword ptr [ecx+10h], 0
  24. .text:006645C5                 mov     dword ptr [ecx+14h], 0Fh
  25. .text:006645CC                 push    offset aRegistration
  26. ; "Registration"
  27. .text:006645D1                 mov     byte ptr [ecx], 0
  28. ; По результатам проверки результата проверки отработать условный переход
  29. .text:006645D4                 jz      loc_6647C0
  30. .text:006645DA                 call    sub_41D370
  31. .text:006645DF                 mov     byte ptr [ebp+var_4], 0Dh
  32. .text:006645E3                 lea     eax, [ebp+var_898]
  33. .text:006645E9                 push    eax
  34. .text:006645EA                 mov     byte ptr [ebp+var_4], 0Ah
  35. .text:006645EE                 mov     ecx, offset dword_958C70
  36. .text:006645F3                 call    sub_766840
  37. .text:006645F8                 mov     edi, eax
  38. .text:006645FA                 mov     byte ptr [ebp+var_4], 0Eh
  39. .text:006645FE                 cmp     dword ptr [edi+14h], 10h
  40. .text:00664602                 jb      short loc_664606
  41. .text:00664604                 mov     edi, [edi]
  42. .text:00664606 loc_664606:
  43. .text:00664606                 sub     esp, 18h
  44. .text:00664609                 mov     ecx, esp
  45. .text:0066460B                 mov     [ebp+var_89C], esp
  46. .text:00664611                 push    1Bh
  47. .text:00664613                 mov     dword ptr [ecx+10h], 0
  48. .text:0066461A                 mov     dword ptr [ecx+14h], 0Fh
  49. .text:00664621                 push    offset aThankYouForReg
  50. ; "Thank you for registration!"
  51. .text:00664626                 mov     byte ptr [ecx], 0
Что тут происходит? Вызывается функция проверки по адресу 0065D320, ее результат из регистра AL записывается в одну из переменных. Ниже по коду выполняется сравнение этой переменной с нулем, а еще ниже на основании результата этого сравнения выполняется или не выполняется условный переход. Несложно понять, что для появления сообщения об успешной регистрации функция проверки должна вернуть AL=1. Открываем файл конфигуратора в HEX-редакторе, патчим начало функции проверки парой команд MOV AL,1 и RET. Запускаем, смотрим.

Конфигуратор успешно "зарегистрирован"
Конфигуратор успешно "зарегистрирован"

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

Сообщение незарегистрированной версии
Сообщение незарегистрированной версии

Ну логично, чо. Конфигуратор-лаунчер мы пропатчили на предмет "регистрации", а основной файл скринсейвера об этом ничего не знает. Идем в Программы, находим здоровенный файл "The Lost Watch 3D Screensaver.exe", чтобы не терять времени отправляем его в дизассемблер. Кода в нем не так много, распотрошится быстро.

Теперь подумаем. Логично предположить, что схема проверки регистрации в обоих модулях должна если не совпадать, то быть очень похожей. Ненадолго вернемся к дизассемблерному листингу конфигуратора и посмотрим на функцию проверки. Обнаружится вот такая интересная строка:
  1. .text:0065D426                 push    offset aSerials_sgn ; "\\serials.sgn"
Очень характерная зацепка - при проверке используется файл "serials.sgn". Значит с очень большой долей вероятности он же используется в основном файле и скорее всего именно при проверке состояния регистрации.

Строка в файле
Строка в файле

Во внутренностях исполняемого файла действительно обнаружится упоминание "serials.sgn", а в дизассемблерном листинге только одна функция, где эта строчка задействуется. Это функция по адресу 00833260. Если сравнить ее с проверкой из конфигуратора, то обнаружится много совпадений, значит мы нашли то, что искали. Разница только в том, что при возврате она дополнительно очищает стек, поэтому патчить ее начало придется парой команд MOV AL,1 и RET 8. Сохраняем изменения, запускаем. Больше никаких посторонних окон не появляется. Цель достигнута. Лаунчер-конфигуратор, в принципе, можно было и не патчить, там "регистрация" дает исключительно косметические изменения. Точно таким же образом нейтрализуется защита и на всех остальных скринсейверах 3Planesoft. Хотя, имхо, это один из редчайших случаев, когда действительно не западло раскошелиться на покупку.

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

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

Комментарии

Отзывы посетителей сайта о статье
leonid (19.06.2020 в 20:12):
ManHunter,это,что шутка?или ты предлагаешь ставить туда патч,раскрывающий память??)))
ManHunter (18.06.2020 в 14:48):
Значит надо поставить Windows 7 x86 и нормальный антивирус.
Leonid (18.06.2020 в 14:43):
Странно,касперский удалил этот скринсейвер у меня,посчитав трояном,на 32 версии семерки все работало отлично)
ManHunter (14.08.2018 в 18:21):
Криптор плохо дружит с десяткой, потому и убрали. Хоть какая-то польза от этой говносистемы. Да и висел он там не всегда, какое-то время был аспр, а до него были такие же чистые файлы.
Isaev (14.08.2018 в 18:07):
Как странно... EXECryptor решили сами убрать? Он у них на всех продуктах всегда висел
ManHunter (22.07.2018 в 14:44):
А что, симпатичная девчонка.
Never (22.07.2018 в 14:41):
Ох любишь ты Сашку )))
voffka (14.07.2018 в 09:32):
ИМХО. Проще и лучше 1 байтом пропатчить проверку хэшей в конце этой процедуры.

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

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

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