
Скриншот программы 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. Сохраняем изменения, запускаем.

Программа успешно "зарегистрирована"
Триальное окно при старте исчезло, перевод календаря на пару месяцев вперед на работоспособности никак не сказывается, а в окне "О программе" мы видим сообщение, что программа лицензирована. Вот так мы в очередной раз сэкономили сотку баксов на добрые дела.