Blog. Just Blog

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

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

Ximagic Denoiser - очень неплохой плагин для подавления цифрового шума на фотографиях. Изначально разработан для использования с Adobe Photoshop, но также работает с любыми программами, которые этот формат поддерживают. Плагин давно не обновлялся, но это не мешает ему работать даже с самыми новыми версиями графических редакторов. В незарегистрированной версии есть ограничение по времени работы и невозможность использовать плагин в пакетном режиме. Есть предложение исправить эту досадную оплошность разработчика.

Забираем с офсайта плагин, он сам по себе, без инсталлятора, так что просто закидываем его в нужную папку. Для Photoshop это папка Plugins. При вызове плагина первым делом появляется триальное окно с таймером и уведомлением, что плагин работает только 30 дней.

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

Первая зацепка есть, давайте попробуем программу зарегистрировать. Естественно, сперва какими-нибудь левыми данными. Регистрация запрятана аж в "System Info".

Неудачная попытка регистрации
Неудачная попытка регистрации

Что мы имеем? А имеем мы то, что после ввода регистрационных данных плагин пытается "поговорить с сервером" на предмет подтверждения серийного номера. Алгоритм проверки находится на сервере, и только после подтверждения покупки сервер отдаст плагину какой-то файл лицензии неизвестного формата. Не удивлюсь, что выполняется еще и привязка к железу, слишком уж досконально Ximagic Denoiser собирает данные о системе. Значит вариант с генераторами ключей заведомо отпадает, требуется точечная хирургия.

Поищем в файле какие-нибудь строчки из триального окна. Найдется и текст, и заголовок окна:

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

Теперь отправим плагин в дизассемблер. Не стоит обращать внимания на расширение, это самый обычный исполняемый файл, а точнее, библиотека. Когда ассемблерный листинг будет получен, посмотрим, как и где формируется триальное окно:
  1. ; Проверить значение переменной
  2. .text:1002C90A                 cmp     [ebp+var_1A1], 0
  3. ; Если оно не равняется 0, то триальное окно не показывать
  4. .text:1002C911                 jnz     short loc_1002C98A
  5. .text:1002C913                 push    offset aYouAreUsingThe
  6. ; "You are using the trial version which c"...
  7. .text:1002C918                 lea     ecx, [ebp+var_2C]
  8. .text:1002C91B                 call    sub_100062E0
  9. .text:1002C920                 push    offset aTrialVersion
  10. ; "Trial Version"
  11. .text:1002C925                 lea     ecx, [ebp+var_44]
  12. .text:1002C928                 mov     byte ptr [ebp+var_4], 23h
  13. .text:1002C92C                 call    sub_100062E0
  14. .text:1002C931                 push    0
  15. .text:1002C933                 lea     eax, [ebp+var_2C]
  16. .text:1002C936                 mov     byte ptr [ebp+var_4], 24h
  17. .text:1002C93A                 push    eax
  18. .text:1002C93B                 lea     eax, [ebp+var_44]
Вроде все понятно. Проверяется какая-то переменная, если ее значение не равняется нулю, то перепрыгнуть вывод триального окна. Но где эта переменная инициализируется? Прокручиваем код вверх, попутно отмечая еще одну проверку, связанную с этой же переменной, и выходим на следующий код:
  1. .text:1002C565                 call    sub_10184790
  2. .text:1002C56A                 cmp     [ebp+var_1C], 0
  3. ; Какая-то проверка
  4. .text:1002C56E                 jz      short loc_1002C5B3
  5. .text:1002C570                 lea     eax, [ebp+var_44]
  6. .text:1002C573                 push    eax
  7. .text:1002C574                 call    sub_1018A1B0
  8. .text:1002C579                 add     esp, 4
  9. .text:1002C57C                 lea     eax, [ebp+var_44]
  10. .text:1002C57F                 mov     byte ptr [ebp+var_4], 15h
  11. .text:1002C583                 push    eax
  12. .text:1002C584                 lea     eax, [ebp+var_2C]
  13. .text:1002C587                 push    eax
  14. .text:1002C588                 push    dword_1025896C
  15. .text:1002C58E                 push    dword_10258974
  16. ; Функция проверки лицензии
  17. .text:1002C594                 call    sub_1001CDF0
  18. .text:1002C599                 add     esp, 10h
  19. ; Сохранить в переменную результаты проверки
  20. .text:1002C59C                 mov     [ebp+var_1A1], al
  21. .text:1002C5A2                 cmp     [ebp+var_30], 10h
  22. .text:1002C5A6                 jb      short loc_1002C5B3
  23. .text:1002C5A8                 push    [ebp+var_44]
Тут чуть-чуть позаковыристей, но лишь самую малость. В переменную заносится результат вызова функции sub_1001CDF0, но до этого выполняется еще какая-то проверка, по результату которой до вызова этой функции дело может и не дойти. Первый патч - нейтрализация условного перехода по адресу 1002C56E, его надо забить NOPами. Второй патч - "сладкая парочка" MOV AL,1 и RET в начало функции проверки лицензии по адресу 1001CDF0.

Сохраняем изменения, запускаем Photoshop, открываем какое-нибудь изображение и применяем к нему фильтр. Никаких триальных окон больше не появляется. Для очистки совести переводим системное время на пару месяцев назад и повторяем операцию. Все работает как надо, цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (02.09.2018 в 00:44):
Да, тоже хороший вариант.
voffka (29.08.2018 в 12:56):
pawel97, или базанезависимый код пиши
патчим 00510022
00C5B0AE       PUSHAD
00C5B0AF       PUSHFD ;сохраняем регистры
00C5B0B0       CALL 00C5B0B5 ;Call на следующую процедуру
00C5B0B5       POP EAX ;CallBack в Eax
00C5B0B6       SUB EAX,0085B0B5 ;минус RVA=Image Base в EAX
00C5B0BB       MOV BYTE PTR DS:[EAX+110022],75 ;делаем грязное дело  Image Base+смещение
00C5B0C2       POPFD
00C5B0C3       POPAD ;восстанавливаем регистры
ManHunter (29.08.2018 в 11:23):
Добавляешь пустую секцию, точку входа исправляешь на нее или втыкаешь JMP откуда надо, в зависимости от задачи. Если без релоков не обойтись, то есть такая утилита Reloz, с помощью которой можно добавлять свои релоки. Может быть есть и еще какие-то утилиты для этого, но я особо не искал.
pawel97 (29.08.2018 в 10:57):
А как к чужой dll свой код дописать? Проблемы начинаются, когда она по не своей Image Base грузится. Знаю что дело в релоках, но что с ними делать?
ManHunter (29.08.2018 в 10:50):
Через фотошоп или через программы, которые этот формат поддерживают. Плагины будут в списке исполняемых модулей.
Михаил (29.08.2018 в 09:51):
я не пойму файлик с расширением 8bf пишите что не обращать внимание на расширение, да он открывается, но как его запускать что б в CALL к примеру войти или тут только метод проб и ошибок?
voffka (28.08.2018 в 17:43):
nubuser, На уровне крякми так можно поизвращаться, на уровне продукта бессмысленно. Куда проще скачивать маленький ключ и расшифровывать любой величины участок кода. Но защита эта, как и первая, стойкая до первого утекшего ключа. Ну и не забываем про ASLR.
ManHunter (28.08.2018 в 15:33):
Снимают дамп памяти после скачивания кода, "вклеивают" исправленную секцию в исходный файл, затем в нем же отключают скачивание. Как-то так. Но это в идеальном случае.
nubuser (28.08.2018 в 14:32):
А бывает, что по запросу с сервера докачивается какая-то часть кода?
В общих чертах, в таких случаях что делают, если это так?

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

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

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