Исследование защиты программы Franzis HDR Projects
Скриншот программы Franzis HDR Projects
Franzis HDR Projects - графический редактор для создания HDR изображений. С его помощью можно собрать эффектный снимок из нескольких кадров с разной экспозицией, а также откорректировать одиночный снимок, чтобы он стал максимально похож на HDR-изображение. В программе множество готовых пресетов и ручных настроек, обламывает только ограничение по времени бесплатного использования.
В дистрибутив авторы умудрились затолкать инсталляторы для MacOS и Windows, из-за этого размер архива получился вообще негуманный. Но ничего не поделаешь, все равно придется скачивать. Устанавливаем, запускаем.
Окно активации
При старте программы первым делом запускается какая-то мутная посторонняя приблуда под названием LicProtector500.exe, которая отвечает за активацию. Но никаких упоминаний об этой программе в основном исполняемом файле найти не удалось, я думаю, что если имя файла где-то и есть, то оно зашифровано. Franzis HDR Projects написан на Qt и здесь в качестве защиты задействуется готовый компонент Mirage Licence Protector с онлайн-активацией. Без интернета не получится даже просто запустить основную программу, поэтому для первоначального исследования мне придется активировать триальный режим.
Когда программа запустится, поищем что-нибудь, относящееся к индикации триального режима. Это строка "TRIAL" в заголовке. По ней ничего интересного не обнаруживается. Зато в языковых файлах найдется юникодная строка "TRIAL" и ее индекс "VERSION_DEMO":
Строка в языковом файле
Это уже лучше. Теперь поищем в листинге что-нибудь, связанное с индексом "VERSION_DEMO". Довольно быстро найдется следующий блок кода:
Code (Assembler) : Убрать нумерацию
- .text:005E59B9 lock xadd [eax], edx
- .text:005E59BD mov byte ptr [esp+54h+var_4], 0Bh
- ; Вызвать функцию проверки
- .text:005E59C2 call sub_401530
- .text:005E59C7 mov ebp, ds:?translate
- ; Если она вернула EAX!=0, то перепрыгнуть упоминание о Demo-версии
- .text:005E59CD test eax, eax
- .text:005E59CF jnz loc_5E5A84
- .text:005E59D5 push 0
- .text:005E59D7 push 0
- .text:005E59D9 push offset aVersion_demo ; "VERSION_DEMO"
- .text:005E59DE lea eax, [esp+60h+var_30]
- .text:005E59E2 push offset aProgram ; "Program"
Code (Assembler) : Убрать нумерацию
- .text:00401530 sub_401530 proc near
- .text:00401530 mov eax, dword_D84BA4
- .text:00401535 retn
- .text:00401535 sub_401530 endp
Перекрестные ссылки
Как видим, инициализация выполняется только в одном месте. Смотрим:
Code (Assembler) : Убрать нумерацию
- .text:00401520 sub_401520 proc near
- .text:00401520
- .text:00401520 arg_0 = dword ptr 4
- .text:00401520
- .text:00401520 mov eax, [esp+arg_0]
- .text:00401524 mov dword_D84BA4, eax
- .text:00401529 retn
- .text:00401529 sub_401520 endp
Code (Assembler) : Убрать нумерацию
- .text:007A757D push 0
- .text:007A757F jmp short loc_7A7583
- .text:007A7581 ; ----------------------------------------
- .text:007A7581 loc_7A7581:
- .text:007A7581 push 1
- .text:007A7583 loc_7A7583:
- .text:007A7583 call sub_401520
Code (Assembler) : Убрать нумерацию
- .text:007A721B call sub_7A3960
- .text:007A7220 lea ecx, [esp+24CCh+var_23CC]
- .text:007A7227 mov byte ptr [esp+24CCh+var_4], 0ACh
- ; Вызвать функцию проверки
- .text:007A722F call sub_7A42B0
- .text:007A7234 sub eax, 1
- ; Условный переход выполнится при EAX=1
- .text:007A7237 jz loc_7A7581
- .text:007A723D sub eax, 1
- .text:007A7240 jz loc_7A757D
- .text:007A7246 lea ecx, [esp+24CCh+var_23CC]
- .text:007A724D mov byte ptr [esp+24CCh+var_4], 65h
...и программа молча закрывается. Возможно переклинивает внешний компонент защиты, срабатывает какая-то внутренняя проверка целостности, да мало ли какие причины. Узнать это нам поможет отладчик. Но перед отладкой я обычно дополнительно подготавливаю файл, в частности проверяю, чтобы в свойствах файла в PE-заголовке был установлен флаг "Relocation stripped". Зачем это надо? В этом случае при загрузке в отладчик исполняемый файл будет размещен по своему ImageBase, а VirtualAddress в памяти отладчика и в файле будут совпадать. Лично мне так удобнее ориентироваться. Загоняем пропатченный файл в PE Tools, открываем свойства заголовка на редактирование.
Удаляем релоки из файла
Сохраняем изменения, на всякий случай запускаем... и получаем полностью зарегистрированную программу без каких-либо ограничений по времени и функционалу. Значит все-таки был виноват внешний компонент защиты. Ну вот и хорошо, не пришлось ковыряться в отладчике.
Программа успешно "зарегистрирована"
Проверяем работоспособность переводом часов вперед, все нормально. Триальная версия также накладывает на готовые изображения водяные знаки, после всех изменений и это досадное недоразумение исчезает. Цель достигнута. Добавляем еще один неплохой инструмент в набор программ для работы с изображениями.
Просмотров: 2411 | Комментариев: 12
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
voffka
(09.06.2018 в 13:39):
nubuser, самопал. Разбираться не охото, но перед строкой идет значение(скорее всего word)это длина строки включая 08, а 08 может быть как стоп-байтом, так и форматом строки.
nubuser
(09.06.2018 в 12:59):
Это другое дело. Так нашлась.
Так что за формат тогда у этой надписи?
Так что за формат тогда у этой надписи?
voffka
(09.06.2018 в 12:48):
nubuser, Ищи по слову TRIA, т.к. TRIAL не попадает под формат юникода, последний байт 08 вместо 00
nubuser
(08.06.2018 в 16:51):
У Вас на картинке поиск в TC, видимо. Так я пробовал и TC, и Far, и кучу других hex-редакторов. Не видят, и всё. В поиске. Unicode. А если вручную (недалеко надпись DEMO) - то видится. Не с системой у меня чего случилось?
nubuser
(08.06.2018 в 16:11):
И что не так с надписью TRIAL в файле hdrprojects_en.qm?
Почему её не находят редакторы?
Почему её не находят редакторы?
ManHunter
(08.06.2018 в 10:45):
Стек виден в отладчике, а код, который выполняет действия со стеком, прекрасно анализируется в IDA. Если бы там было что-то типа push dword [eax+1234], то тут без вариантов, только отладчик. А в коде обычные push 1 и push 0.
nubuser
(08.06.2018 в 10:37):
"Теперь посмотрим, откуда это значение берется на стеке:"
И это тоже поясните, пожалуйста.
Вы были в IDA.
А стек виден только в отладчике в период выполнения, или снова не так понял?
И это тоже поясните, пожалуйста.
Вы были в IDA.
А стек виден только в отладчике в период выполнения, или снова не так понял?
nubuser
(08.06.2018 в 10:11):
У меня и с "Relocation stripped", и без него в отладчик загружается всегда по одному адресу 00800ССС. Или я не так всё понял?
voffka
(07.06.2018 в 22:19):
Своим любимым MOV EAX,1 и RET ты затер 007A42B2 PUSH 00844F2B,где 00844F2B попадает под релоки и во время инициализации MOV EAX,1 портится.
Чтоб не отключать релоки, по адресу 007A42B0 сделай джамп чуть выше, где куча INT3 и там уже... как всегда.
brute
(06.06.2018 в 11:02):
наверное, можно было сразу mov eax, dword_D84BA4 заменить на:
push 1
pop eax
тогда, может, и последующая обработка не понадобится
push 1
pop eax
тогда, может, и последующая обработка не понадобится
ManHunter
(06.06.2018 в 10:39):
nubuser, просто загрузи исходный и модифицированный файл в отладчик и все вопросы сразу отпадут.
nubuser
(06.06.2018 в 10:03):
"...файл будет размещен по своему ImageBase"
Расскажите, пожалуйста, а если не делать этого в PE, то что может происходить с размещением файла?
Расскажите, пожалуйста, а если не делать этого в PE, то что может происходить с размещением файла?
Добавить комментарий
Заполните форму для добавления комментария