Исследование защиты программы Unified Color HDR Express


Скриншот программы Unified Color HDR Express

Программа Unified Color HDR Express предназначена для создания и обработки с HDR-снимков. Позволяет регулировать цвет, яркость, цветность и контраст, выбирать настройки изображения из большого числа предустановленных фильтров, а также устанавливать их вручную. Все бы ничего, если б не цена в сотку баксов.

Скачиваем дистрибутив, устанавливаем, запускаем. Нас сразу дается выбор: продолжить в триальном режиме, купить или зарегистрировать. Пока выберем триальный режим, надо осмотреться получше.


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

Заглянем в окно "О программе". Сразу же бросается в глаза строка "Trial version". Это очень удобный ориентир для поиска.


Программа не зарегистрирована

Так и есть. Исполняемый файл ничем не упакован, строка легко находится. Там же неподалеку находится строчка "Licensed version", которая, как несложно догадаться, появится в случае успешной регистрации программы.


Нехорошая строка найдена

Обратимся к дизассемблеру. Нам надо выяснить, при каких условиях в окне "О программе" появляется либо триальная, либо лицензионная строка.
.text:0047FB61                 push    edi
.text:0047FB62                 lea     ecx, [esp+60h]
.text:0047FB66                 mov     byte ptr [esp+0C0h], 14h
; Вызывать функцию проверки состояния программы
.text:0047FB6E                 call    sub_415720
.text:0047FB73                 push    0
; Сохранить ее результат в регистр EDI
.text:0047FB75                 mov     edi, eax
.text:0047FB77                 lea     eax, [esp+34h]
.text:0047FB7B                 push    offset aTrialPeriodHas
; "Trial period has expired"
.text:0047FB80                 push    eax
.text:0047FB81                 call    sub_47DC90
.text:0047FB86                 add     esp, 0Ch
; Если EDI = 2, то программа зарегистрирована
.text:0047FB89                 cmp     edi, 2
.text:0047FB8C                 mov     byte ptr [esp+0BCh], 15h
.text:0047FB94                 jnz     loc_47FC43
; Лицензионная ветка алгоритма
.text:0047FB9A                 push    0
.text:0047FB9C                 lea     ecx, [esp+1Ch]
.text:0047FBA0                 push    offset aLicensedVersio
; "Licensed version"
.text:0047FBA5                 push    ecx
.text:0047FBA6                 call    sub_47DC90
.text:0047FBAB                 add     esp, 0Ch
.text:0047FBAE                 push    eax
.text:0047FBAF                 lea     ecx, [esp+34h]
.text:0047FBB3                 mov     byte ptr [esp+0C0h], 16h
; ...
; Часть кода пропущена
; ...
.text:0047FC3E                 jmp     loc_47FD4D
.text:0047FC43 ; --------------------------------------------
.text:0047FC43 loc_47FC43:
; Триальная ветка алгоритма
.text:0047FC43                 test    edi, edi
; Если EDI = 0, то триальный срок вообще закончился, иначе
; просто перевести программу в триальный режим
.text:0047FC45                 jnz     loc_47FD47
.text:0047FC4B                 mov     byte ptr [esp+18h], 20h
.text:0047FC50                 mov     eax, [esp+18h]
.text:0047FC54                 push    eax
.text:0047FC55                 lea     ecx, [esp+18h]
.text:0047FC59                 call    ds:??0QChar@@QAE@UQLatin1Char@@@Z
.text:0047FC5F                 push    edi
.text:0047FC60                 lea     ecx, [esp+24h]
.text:0047FC64                 push    offset aTrialVersion1D
; "Trial version (%1 days left)"
.text:0047FC69                 push    ecx
.text:0047FC6A                 call    sub_47DC90
.text:0047FC6F                 add     esp, 0Ch
.text:0047FC72                 mov     edi, eax
.text:0047FC74                 lea     edx, [esp+14h]
.text:0047FC78                 push    edx
...

Простой проверочный код без всяких сюрпризов. Я его немного прокомментировал для большей ясности, на всякий случай повторю словами. По умолчанию принимается, что триальный срок уже истек. Затем программа вызывает процедуру проверки состояния регистрации по адресу 415720. Она возвращает одно из трех значений: 2 - программа зарегистрирована, 1 - триальный срок истек, 0 - просто триальный режим. Нам остается пропатчить функцию проверки, чтобы она возвращала нужное нам значение, то есть 2. Почему я сразу выбрал вариант с патчем и даже не попытался разобрать алгоритм проверки? Посмотрите внимательнее на триальное окно, которое появляется при запуске. В программе используется он-лайн активация, значит серийники проверяются на сервере разработчика, и если ключ не был легально приобретен, то при любом раскладе мы получим отлуп. Так что патч и ничего кроме патча. Единственное, что нас интересует в процедуре проверки, это ее финальные строчки, где выполняется команда возврата:
.text:00415896                 pop     ebp
.text:00415897                 pop     ebx
.text:00415898                 add     esp, 64h
.text:0041589B                 retn    4
.text:0041589B sub_415720      endp

Значит и нам при патче надо использовать команду RETN 4, чтобы стек был правильно восстановлен. Итак, патчим начало функции проверки парой команд MOV EAX,2 / RETN 4. Сохраняем изменения, запускаем.


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

Триальное окно при старте исчезло, перевод календаря на пару месяцев вперед на работоспособности никак не сказывается, а в окне "О программе" мы видим сообщение, что программа лицензирована. Вот так мы в очередной раз сэкономили сотку баксов на добрые дела.
Добавлено: 14 Сентября 2013 12:03:48 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...