Blog. Just Blog

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

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

Программа Imagine - это маленький и очень шустрый просмотрщик графических файлов, который может работать как самостоятельное приложение, так и в качестве плагина для Total Commander. Программа из серии Donationware, то есть она бесплатная, но если есть желание, то можно послать автору немного денежек. Взамен автор пришлет регистрационный ключ, чтобы пользователь наблюдал свое имя в окне "О программе". В остальном программа полностью функциональная и не имеет никаких ограничений. Денежку автору можно и так просто послать, без покупки ключей, а вот поковыряться внутри регистрации было бы интересно.

Скачиваем дистрибутив, для статьи я использовал архив с портативным вариантом ANSI-версии. Распаковываем, смотрим. Из интересных исполняемых файлов в папке программы находится крохотный файл Imagine.EXE, файл достаточно большого размера Imagine.DLL и два крохотных плагина для Total Commander. Логично предположить, что весь функционал программы вынесен в динамическую библиотеку, а все исполняемые файлы и плагины являются только обертками и переходниками для взаимодействия с ней. Файл Imagine.DLL упакован UPX, который без сюрпризов снимается им же самим upx -d Imagine.DLL

Окно "О программе"
Окно "О программе"

При попытке ввода неправильного серийника программа выдает сообщение "Неверный код". В русском языковом файле есть строчки, которые используются при ответе на вводе серийного номера, соответственно, для правильного и неправильного.

50120="Благодарим Вас за регистрацию!"
50121="Неверный код"

Нас интересует числовое значение 50121, по которому программа загружает строки локализации. В шестнадцатеричном виде это будет число 0C3C9. Поищем его в листинге дизассемблера.
  1. .text:500304CF                 push    ecx
  2. .text:500304D0                 mov     edx, eax
  3. .text:500304D2                 lea     ecx, [ebp+Struct]
  4. ; Вызвать какую-то функцию проверки
  5. .text:500304D8                 call    sub_50074AF0
  6. ; Если она вернула EAX>0, то регистрационные данные неправильные
  7. .text:500304DD                 test    eax, eax
  8. .text:500304DF                 jnz     short loc_50030511
  9. .text:500304E1                 lea     ecx, [ebp+Struct] ; lpStruct
  10. .text:500304E7                 call    sub_50030557
  11. .text:500304EC                 test    eax, eax
  12. .text:500304EE                 mov     [ebp+var_4], eax
  13. .text:500304F1                 jz      short loc_50030533
  14. .text:500304F3                 lea     edx, [ebp+Buffer] ; lpBuffer
  15. ; Загрузить строчку "Благодарим Вас за регистрацию!"
  16. .text:500304F9                 mov     ecx, 0C3C8h     ; uID
  17. .text:500304FE                 call    sub_5006F840
  18. .text:50030503                 test    eax, eax
  19. .text:50030505                 jz      short loc_50030533
  20. .text:50030507                 push    40h
  21. .text:50030509                 call    sub_5006CDD0
  22. .text:5003050E                 push    eax
  23. .text:5003050F                 jmp     short loc_50030529
  24. .text:50030511 ; ---------------------------------------
  25. .text:50030511 loc_50030511:
  26. .text:50030511                 lea     edx, [ebp+Buffer] ; lpBuffer
  27. ; Загрузить строчку "Неверный код"
  28. .text:50030517                 mov     ecx, 0C3C9h     ; uID
  29. .text:5003051C                 call    sub_5006F840
  30. .text:50030521                 test    eax, eax
  31. .text:50030523                 jz      short loc_50030533
  32. .text:50030525                 push    10h             ; uType
  33. .text:50030527                 push    0               ; lpCaption
  34. .text:50030529 loc_50030529:
  35. ; Вывести окно сообщения
  36. .text:50030529                 lea     eax, [ebp+Buffer]
  37. .text:5003052F                 push    eax             ; lpText
  38. .text:50030530                 push    ebx             ; hWnd
  39. .text:50030531                 call    esi ; MessageBoxA
Тут ничего сложного, вызывается функция проверки, по ее результатам выводится сообщение о правильной или неправильной регистрации. Теперь давайте поближе посмотрим на функцию проверки.
  1. .text:50074AF0 sub_50074AF0    proc near
  2. .text:50074AF0 arg_0           = dword ptr  4
  3. .text:50074AF0                 push    ebx
  4. .text:50074AF1                 push    ebp
  5. .text:50074AF2                 push    edi
  6. .text:50074AF3                 mov     edi, edx
  7. ; Инициализация EBX = -1
  8. .text:50074AF5                 or      ebx, 0FFFFFFFFh
  9. .text:50074AF8                 mov     ebp, ecx
  10. ; Длина серийного номера
  11. .text:50074AFA                 test    edi, edi
  12. .text:50074AFC                 jle     short loc_50074B3D
  13. .text:50074AFE                 push    10h
  14. .text:50074B00                 mov     ecx, 100h
  15. .text:50074B05                 pop     edx
  16. ; Дополнительная функция проверки
  17. .text:50074B06                 call    sub_50076C47
  18. ; Если она вернула EAX=0, то серийный номер неправильный
  19. .text:50074B0B                 test    eax, eax
  20. .text:50074B0D                 jz      short loc_50074B3D
  21. .text:50074B0F                 push    esi
  22. .text:50074B10                 xor     ecx, ecx
  23. .text:50074B12                 call    sub_50076A9C
  24. .text:50074B17                 mov     esi, eax
  25. .text:50074B19                 mov     edx, ebp
  26. .text:50074B1B                 push    edi
  27. .text:50074B1C                 mov     ecx, esi
  28. .text:50074B1E                 call    sub_50074B45
  29. .text:50074B23                 mov     ecx, esi
  30. .text:50074B25                 mov     edx, [esp+10h+arg_0]
  31. ; Еще одна функция проверки
  32. .text:50074B29                 call    sub_50074B9D
  33. .text:50074B2E                 mov     ecx, esi        ; lpMem
  34. ; Записать результат выполнения функции в регистр EBX
  35. .text:50074B30                 mov     ebx, eax
  36. .text:50074B32                 call    sub_500770D9
  37. .text:50074B37                 call    sub_500770EE
  38. .text:50074B3C                 pop     esi
  39. .text:50074B3D loc_50074B3D:
  40. .text:50074B3D                 pop     edi
  41. ; Перенести результат из регистра EBX в EAX
  42. .text:50074B3E                 mov     eax, ebx
  43. .text:50074B40                 pop     ebp
  44. .text:50074B41                 pop     ebx
  45. .text:50074B42                 retn    4
  46. .text:50074B42 sub_50074AF0    endp
Чтобы введенный серийный номер считался правильным, функция проверки должна всегда возвращать EAX=0. Заменяем двухбайтовую команду по адресу 50074B3E на такую же двухбайтовую команду обнуления регистра XOR EAX,EAX. Сохраняем изменения.

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

Запускаем программу и пытаемся ее зарегистрировать любыми данными. Все отлично, теперь программа принимает в качестве серийного номера любые данные. Вот такой несложный крякмис, так как программа по сути все-таки бесплатная, да и защита оказалась несложной.

Поделиться ссылкой ВКонтакте
Просмотров: 6370 | Комментариев: 10

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
dns1001 (15.11.2023 в 13:45):
dns1001, Был не прав, все возможно, но для меня долго.
dns1001 (13.11.2023 в 08:31):
Ковырял ковырял и пришел к выводу, что закейгенить не получится, необратимые функции используются.
ManHunter (29.05.2014 в 10:20):
Цитатабудет время - может вернусь и закигеню, а может и нет

Как все-таки хорошо, когда у людей есть дофига свободного времени :)
ЦитатаЗащита как раз (опять же если не ошибаюсь) не простая с точки зрения алго, но лвл0 с точки зрения патча

Степень защищенности всей системы определяется по самому слабому ее компоненту.
DimitarSerg (29.05.2014 в 01:32):
Года 2 назад делал подход к проге, но как-то не асилил, будет время - может вернусь и закигеню, а может и нет :D
Помню, что не очень просто, деталей конечно не помню. А патчить такое правда не интересно, если только не на заказ за $ (и да, прога то полнофункциональна, я либо чего недопонял после сверхтрудной недели, но зачем это любование в эбауте - 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
ManHunter (27.05.2014 в 22:17):
Я согласен, что кейген - это в любом случае более красивое решение, чем патч. Но когда встает выбор потерять несколько часов или даже дней на разбор алгоритма не особо нужной, в принципе, программы, или же за 10 минут пропатчить ее, то я однозначно выбираю патч. Для рядового пользователя вообще фиолетово, нагенерить серийников или поменять файл на ломаный, лишь бы программа работала как надо. А для новичков-реверсеров патчи дают возможность не останавливаться в исследованиях, столкнувшись с непонятным алгоритмом. До кейгенов дойти они всегда успеют, когда уровень будет достаточно прокачан.
Vnv (27.05.2014 в 22:13):
3ton,
Цитатаэто не ваш уровень

Уровень этого блога - показать и рассказать о "защитах" и методах их обхода, не Вам судить автора!
ЦитатаИнтересно разобрать генерацию серийного номера
Ждем Ваш кейген.
3ton (27.05.2014 в 19:05):
Интересно разобрать генерацию серийного номера, а xor eax,eax - это не ваш уровень.

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

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

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