Blog. Just Blog

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

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

Chaotica - программа для генерации фрактальных изображений по заранее заданному или случайному набору исходных параметров. Готовое изображение хорошо использовать в качестве обоев для рабочего стола или для создания завораживающей анимации. Для работы используются мощности графического процессора видеокарты, но все равно работает Chaotica, мягко говоря, не быстро. Если учитывать ограничения триальной версии программы, то образуется весомая причина, чтобы обратить на нее более пристальное внимание.

Забираем с сайта дистрибутив последней доступной 32-битной версии, устанавливаем, смотрим. Без регистрации можно сгенерить изображение не более 1,23 мегапикселов, причем при изменении высоты или ширины второй размер подгоняется таким образом, чтобы не превышать лимит.

Сообщение незарегистрированной версии
Сообщение незарегистрированной версии

Исходные данные есть, отправляем исполняемый файл в дизассемблер. Когда он закончит работу, поищем в листинге строку сообщения, которое появляется при превышении возможностей лицензии. Сообщение лепится из нескольких подстрок.
  1. .text:004AC8B6                 mov     [ebp+var_1C], 4
  2. .text:004AC8BD                 mov     eax, [eax]
  3. .text:004AC8BF                 mov     [ebp+var_1C], eax
  4. .text:004AC8C2                 mov     dword ptr [ebp+var_24+4], eax
  5. ; Проверить значение флага
  6. .text:004AC8C5                 mov     eax, [edi+4ACh]
  7. ; Если значение нулевое, то сразу перейти на пересчет значений
  8. ; и вывод сообщение
  9. .text:004AC8CB                 test    eax, eax
  10. .text:004AC8CD                 jz      short loc_4AC8EF
  11. ; Если EAX=1, то ничего вредного не делать
  12. .text:004AC8CF                 cmp     eax, 1
  13. .text:004AC8D2                 jz      loc_4ACAE7
  14. ; Значение 2 тоже приводит к плохим результатам
  15. .text:004AC8D8                 cmp     eax, 2
  16. .text:004AC8DB                 jz      short loc_4AC8EF
  17. ; Значение 3 и 4 тоже хорошие значения
  18. .text:004AC8DD                 cmp     eax, 3
  19. .text:004AC8E0                 jz      loc_4ACAE7
  20. .text:004AC8E6                 cmp     eax, 4
  21. .text:004AC8E9                 jz      loc_4ACAE7
  22. ; Пересчитать значения спинбоксов и вывести сообщение о лимите
  23. .text:004AC8EF loc_4AC8EF:
  24. .text:004AC8EF                 mov     ecx, [edi+0F8h]
  25. .text:004AC8F5                 push    4
  26. .text:004AC8F7                 call    ds:?setMaximum@QSpinBox@@QAEXH@Z
  27. .text:004AC8FD                 cmp     [ebp+var_1C], 4
  28. ...
  29. ; Часть кода пропущена для удобства чтения
  30. ...
  31. .text:004AC9E5                 fstp    [ebp+var_34]
  32. .text:004AC9E8                 movsd   xmm1, [ebp+var_34]
  33. .text:004AC9ED                 mulsd   xmm1, ds:qword_6F7BA8
  34. .text:004AC9F5                 mulsd   xmm1, ds:qword_6F7BA8
  35. .text:004AC9FD                 movapd  xmm2, xmm1
  36. .text:004ACA01                 call    sub_4DE0A0
  37. .text:004ACA06                 push    offset aChaotica_3 ; "Chaotica"
  38. .text:004ACA0B                 lea     ecx, [ebp+var_34+4]
  39. .text:004ACA0E                 mov     [ebp+var_4], 2
  40. .text:004ACA15                 call    ds:??0QString@@QAE@PBD@Z
  41. .text:004ACA1B                 lea     edx, [ebp+var_5C]
  42. .text:004ACA1E                 lea     ecx, [ebp+var_24+4]
  43. .text:004ACA21                 mov     byte ptr [ebp+var_4], 3
  44. .text:004ACA25                 call    sub_4C0C30
  45. .text:004ACA2A                 push    eax
  46. .text:004ACA2B                 mov     edx, offset aTheRequestedIm
  47. ; "The requested image dimensions exceed t"...
  48. .text:004ACA30                 lea     ecx, [ebp+var_28]
  49. .text:004ACA33                 mov     byte ptr [ebp+var_4], 4
  50. .text:004ACA37                 call    sub_407500
  51. .text:004ACA3C                 add     esp, 4
  52. .text:004ACA3F                 push    offset aMegapixels_
  53. ; " megapixels)."
  54. .text:004ACA44                 mov     edx, eax
  55. .text:004ACA46                 lea     ecx, [ebp+var_2C]
  56. .text:004ACA49                 mov     byte ptr [ebp+var_4], 5
Тут проверяется значение ячейки памяти, если оно равно 1, 3 или 4, то программа считается зарегистрированной, никаких ограничений на размеры не накладывается и никаких сообщений не выводится. Любые другие значения приводят к срабатыванию триальной ветки алгоритма. Поскольку тут только выполняется проверка, необходимо найти код, где это значение инициализируется. Искать будем по строке "+4ACh]". Попутно обнаруживаем подобные проверки, но только относящиеся к анимации, так что догадка верная. Наконец попадаем на следующую функцию:
  1. .text:004A8E50 sub_4A8E50      proc near
  2. .text:004A8E50                 push    ebp
  3. .text:004A8E51                 mov     ebp, esp
  4. .text:004A8E53                 push    0FFFFFFFFh
  5. .text:004A8E55                 push    offset SEH_4A8E50
  6. .text:004A8E5A                 mov     eax, large fs:0
  7. .text:004A8E60                 push    eax
  8. .text:004A8E61                 mov     large fs:0, esp
  9. .text:004A8E68                 sub     esp, 28h
  10. .text:004A8E6B                 push    ebx
  11. .text:004A8E6C                 push    esi
  12. .text:004A8E6D                 mov     [ebp+var_4], 0
  13. .text:004A8E74                 push    edi
  14. .text:004A8E75                 mov     esi, ecx
  15. .text:004A8E77                 mov     [ebp+var_10], esp
  16. .text:004A8E7A                 mov     [ebp+var_18], esi
  17. .text:004A8E7D                 mov     [ebp+var_14], 0
  18. .text:004A8E84                 mov     [ebp+var_1C], 0Fh
  19. .text:004A8E8B                 mov     [ebp+var_20], 0
  20. .text:004A8E92                 mov     byte ptr [ebp+var_30], 0
  21. .text:004A8E96                 lea     eax, [ebp+var_30]
  22. .text:004A8E99                 push    eax
  23. .text:004A8E9A                 lea     ecx, [esi+4B0h]
  24. .text:004A8EA0                 lea     edx, [ebp+var_14]
  25. .text:004A8EA3                 mov     byte ptr [ebp+var_4], 1
  26. .text:004A8EA7                 call    sub_4CE730
  27. .text:004A8EAC                 add     esp, 4
  28. .text:004A8EAF                 cmp     [ebp+var_1C], 10h
  29. .text:004A8EB3                 jb      short loc_4A8ED3
  30. .text:004A8EB5                 push    [ebp+var_30]
  31. .text:004A8EB8                 call    ds:__imp_??3@YAXPAX@Z
  32. .text:004A8EBE                 add     esp, 4
  33. .text:004A8EC1                 jmp     short loc_4A8ED3
  34. .text:004A8EC3 ; ----------------------------------------
  35. .text:004A8EC3                 mov     [ebp+var_14], 0
  36. .text:004A8ECA                 mov     eax, offset loc_4A8ED0
  37. .text:004A8ECF                 retn
  38. .text:004A8ED0 ; ----------------------------------------
  39. .text:004A8ED0 loc_4A8ED0:
  40. .text:004A8ED0                 mov     esi, [ebp+var_18]
  41. .text:004A8ED3 loc_4A8ED3:
  42. ; Получить значение состояния регистрации
  43. .text:004A8ED3                 mov     eax, [ebp+var_14]
  44. .text:004A8ED6                 mov     ecx, [ebp+var_C]
  45. .text:004A8ED9                 pop     edi
  46. ; Записать его в ячейку памяти
  47. .text:004A8EDA                 mov     [esi+4ACh], eax
  48. .text:004A8EE0                 pop     esi
  49. .text:004A8EE1                 mov     large fs:0, ecx
  50. .text:004A8EE8                 pop     ebx
  51. .text:004A8EE9                 mov     esp, ebp
  52. .text:004A8EEB                 pop     ebp
  53. .text:004A8EEC                 retn
  54. .text:004A8EEC sub_4A8E50      endp
Заменяем трехбайтную команду по адресу 004A8ED3 на трехбайтную пару команд XOR EAX,EAX и INC EAX, таким образом при любом раскладе регистр EAX перед записью в ячейку памяти будет иметь нужное значение. Сохраняем изменения, запускаем программу.

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

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (23.04.2023 в 12:47):
Поиском
Илья (23.04.2023 в 12:46):
Как вы находите подопытных для рубрики "исследование защиты программ"?
ManHunter (20.04.2023 в 18:38):
В этом мире всё уже написано и сломано до нас. Что ж теперь сидеть на попе ровно и ничего не делать? :)
Vnv (20.04.2023 в 17:42):
Все сломано до нас:
4CE0F3 01 00
и ключ, типа:
"You name;chaotica-studio-1.0;1234567890123456789012345678901234567890" ;

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

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

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