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. Хотя, имхо, это один из редчайших случаев, когда действительно не западло раскошелиться на покупку.

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

Комментарии

Отзывы посетителей сайта о статье
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-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.004 сек.) / Память: 4.75 Mb
Наверх