Исследование защиты программы Imagine
Скриншот программы Imagine
Программа Imagine - это маленький и очень шустрый просмотрщик графических файлов, который может работать как самостоятельное приложение, так и в качестве плагина для Total Commander. Программа из серии Donationware, то есть она бесплатная, но если есть желание, то можно послать автору немного денежек. Взамен автор пришлет регистрационный ключ, чтобы пользователь наблюдал свое имя в окне "О программе". В остальном программа полностью функциональная и не имеет никаких ограничений. Денежку автору можно и так просто послать, без покупки ключей, а вот поковыряться внутри регистрации было бы интересно.
Скачиваем дистрибутив, для статьи я использовал архив с портативным вариантом ANSI-версии. Распаковываем, смотрим. Из интересных исполняемых файлов в папке программы находится крохотный файл Imagine.EXE, файл достаточно большого размера Imagine.DLL и два крохотных плагина для Total Commander. Логично предположить, что весь функционал программы вынесен в динамическую библиотеку, а все исполняемые файлы и плагины являются только обертками и переходниками для взаимодействия с ней. Файл Imagine.DLL упакован UPX, который без сюрпризов снимается им же самим upx -d Imagine.DLL
Окно "О программе"
При попытке ввода неправильного серийника программа выдает сообщение "Неверный код". В русском языковом файле есть строчки, которые используются при ответе на вводе серийного номера, соответственно, для правильного и неправильного.
50120="Благодарим Вас за регистрацию!"
50121="Неверный код"
Нас интересует числовое значение 50121, по которому программа загружает строки локализации. В шестнадцатеричном виде это будет число 0C3C9. Поищем его в листинге дизассемблера.
Code (Assembler) : Убрать нумерацию
- .text:500304CF push ecx
- .text:500304D0 mov edx, eax
- .text:500304D2 lea ecx, [ebp+Struct]
- ; Вызвать какую-то функцию проверки
- .text:500304D8 call sub_50074AF0
- ; Если она вернула EAX>0, то регистрационные данные неправильные
- .text:500304DD test eax, eax
- .text:500304DF jnz short loc_50030511
- .text:500304E1 lea ecx, [ebp+Struct] ; lpStruct
- .text:500304E7 call sub_50030557
- .text:500304EC test eax, eax
- .text:500304EE mov [ebp+var_4], eax
- .text:500304F1 jz short loc_50030533
- .text:500304F3 lea edx, [ebp+Buffer] ; lpBuffer
- ; Загрузить строчку "Благодарим Вас за регистрацию!"
- .text:500304F9 mov ecx, 0C3C8h ; uID
- .text:500304FE call sub_5006F840
- .text:50030503 test eax, eax
- .text:50030505 jz short loc_50030533
- .text:50030507 push 40h
- .text:50030509 call sub_5006CDD0
- .text:5003050E push eax
- .text:5003050F jmp short loc_50030529
- .text:50030511 ; ---------------------------------------
- .text:50030511 loc_50030511:
- .text:50030511 lea edx, [ebp+Buffer] ; lpBuffer
- ; Загрузить строчку "Неверный код"
- .text:50030517 mov ecx, 0C3C9h ; uID
- .text:5003051C call sub_5006F840
- .text:50030521 test eax, eax
- .text:50030523 jz short loc_50030533
- .text:50030525 push 10h ; uType
- .text:50030527 push 0 ; lpCaption
- .text:50030529 loc_50030529:
- ; Вывести окно сообщения
- .text:50030529 lea eax, [ebp+Buffer]
- .text:5003052F push eax ; lpText
- .text:50030530 push ebx ; hWnd
- .text:50030531 call esi ; MessageBoxA
Code (Assembler) : Убрать нумерацию
- .text:50074AF0 sub_50074AF0 proc near
- .text:50074AF0 arg_0 = dword ptr 4
- .text:50074AF0 push ebx
- .text:50074AF1 push ebp
- .text:50074AF2 push edi
- .text:50074AF3 mov edi, edx
- ; Инициализация EBX = -1
- .text:50074AF5 or ebx, 0FFFFFFFFh
- .text:50074AF8 mov ebp, ecx
- ; Длина серийного номера
- .text:50074AFA test edi, edi
- .text:50074AFC jle short loc_50074B3D
- .text:50074AFE push 10h
- .text:50074B00 mov ecx, 100h
- .text:50074B05 pop edx
- ; Дополнительная функция проверки
- .text:50074B06 call sub_50076C47
- ; Если она вернула EAX=0, то серийный номер неправильный
- .text:50074B0B test eax, eax
- .text:50074B0D jz short loc_50074B3D
- .text:50074B0F push esi
- .text:50074B10 xor ecx, ecx
- .text:50074B12 call sub_50076A9C
- .text:50074B17 mov esi, eax
- .text:50074B19 mov edx, ebp
- .text:50074B1B push edi
- .text:50074B1C mov ecx, esi
- .text:50074B1E call sub_50074B45
- .text:50074B23 mov ecx, esi
- .text:50074B25 mov edx, [esp+10h+arg_0]
- ; Еще одна функция проверки
- .text:50074B29 call sub_50074B9D
- .text:50074B2E mov ecx, esi ; lpMem
- ; Записать результат выполнения функции в регистр EBX
- .text:50074B30 mov ebx, eax
- .text:50074B32 call sub_500770D9
- .text:50074B37 call sub_500770EE
- .text:50074B3C pop esi
- .text:50074B3D loc_50074B3D:
- .text:50074B3D pop edi
- ; Перенести результат из регистра EBX в EAX
- .text:50074B3E mov eax, ebx
- .text:50074B40 pop ebp
- .text:50074B41 pop ebx
- .text:50074B42 retn 4
- .text:50074B42 sub_50074AF0 endp
Программа успешно "зарегистрирована"
Запускаем программу и пытаемся ее зарегистрировать любыми данными. Все отлично, теперь программа принимает в качестве серийного номера любые данные. Вот такой несложный крякмис, так как программа по сути все-таки бесплатная, да и защита оказалась несложной.
Просмотров: 6370 | Комментариев: 10
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
dns1001
(15.11.2023 в 13:45):
dns1001, Был не прав, все возможно, но для меня долго.
dns1001
(13.11.2023 в 08:31):
Ковырял ковырял и пришел к выводу, что закейгенить не получится, необратимые функции используются.
ManHunter
(29.05.2014 в 10:20):
Как все-таки хорошо, когда у людей есть дофига свободного времени :)
Степень защищенности всей системы определяется по самому слабому ее компоненту.
DimitarSerg
(29.05.2014 в 01:32):
Года 2 назад делал подход к проге, но как-то не асилил, будет время - может вернусь и закигеню, а может и нет :D
Помню, что не очень просто, деталей конечно не помню. А патчить такое правда не интересно, если только не на заказ за $ (и да, прога то полнофункциональна, я либо чего недопонял после сверхтрудной недели, но зачем это любование в эбауте - dont know).
Если уж это плаг, то думаю новичкам наверное интереснее было бы показать как подебажить проверку, то есть грузить тотал, переходить к дллке, ну и т.д., это хорошо, что в статике получилось так хорошо и сразу.
>да и защита оказалась несложной
Защита как раз (опять же если не ошибаюсь) не простая с точки зрения алго, но лвл0 с точки зрения патча.
Помню, что не очень просто, деталей конечно не помню. А патчить такое правда не интересно, если только не на заказ за $ (и да, прога то полнофункциональна, я либо чего недопонял после сверхтрудной недели, но зачем это любование в эбауте - dont know).
Если уж это плаг, то думаю новичкам наверное интереснее было бы показать как подебажить проверку, то есть грузить тотал, переходить к дллке, ну и т.д., это хорошо, что в статике получилось так хорошо и сразу.
>да и защита оказалась несложной
Защита как раз (опять же если не ошибаюсь) не простая с точки зрения алго, но лвл0 с точки зрения патча.
ManHunter
(28.05.2014 в 09:18):
Старые версии вышибали Total Commander, если из просмотрщика попытаться удалить файл кнопкой Del. На последней 1.0.9 подобных косяков не замечено.
миха
(28.05.2014 в 09:09):
Я пользоюсь в осноном старой версией для просмотра cache браузеров т.к. старая может выдавать эскизы изображений с неправельными расшерениями.
MaCTeP
(27.05.2014 в 23:57):
Спасибо за урок, вылечил Unicode версии :) нужный адрес 50075B1E
Портабельная версия тут -> http://rghost.ru/55901651
Портабельная версия тут -> http://rghost.ru/55901651
ManHunter
(27.05.2014 в 22:17):
Я согласен, что кейген - это в любом случае более красивое решение, чем патч. Но когда встает выбор потерять несколько часов или даже дней на разбор алгоритма не особо нужной, в принципе, программы, или же за 10 минут пропатчить ее, то я однозначно выбираю патч. Для рядового пользователя вообще фиолетово, нагенерить серийников или поменять файл на ломаный, лишь бы программа работала как надо. А для новичков-реверсеров патчи дают возможность не останавливаться в исследованиях, столкнувшись с непонятным алгоритмом. До кейгенов дойти они всегда успеют, когда уровень будет достаточно прокачан.
Vnv
(27.05.2014 в 22:13):
3ton,
Уровень этого блога - показать и рассказать о "защитах" и методах их обхода, не Вам судить автора!
Ждем Ваш кейген.
Уровень этого блога - показать и рассказать о "защитах" и методах их обхода, не Вам судить автора!
Ждем Ваш кейген.
3ton
(27.05.2014 в 19:05):
Интересно разобрать генерацию серийного номера, а xor eax,eax - это не ваш уровень.
Добавить комментарий
Заполните форму для добавления комментария