Blog. Just Blog

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

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

PhotoFiltre Studio - программа для ретуши и редактирования изображений. На борту много разных инструментов для работы с графикой, этакий фотошопчик на минималочках. Зато цена к минимальным значениям точно не относится. Не то, чтобы прямо ощущался дефицит программ для редактирования фотографий, но для тренировки сгодится.

Забираем с сайта дистрибутив, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован и не защищен, что ж, нашим проще.

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

При запуске программы первым делом появляется окно с триальным счетчиком. Хорошо, есть одна зацепка.

Окно регистрации
Окно регистрации

А вот окно регистрации с сюрпризом. Кнопка подтверждения ввода неактивная. Очевидно, что корректность серийника проверяется в момент его набора. Программа написана на Дельфи, так что для наиболее удобного анализа обработчиков форм лучше воспользоваться Interactive Delphi Reconstructor, он же IDR. Параллельно отправляем исполняемый файл на дизассемблирование, так как в IDA с листингом работать все-таки удобнее и привычнее.

Обработчик редактирования поля ввода
Обработчик редактирования поля ввода

Форма регистрации легко находится в списке форм по названию TREGFORM. В ней находятся несколько текстовых полей: имя и отдельные кусочки серийника. Если посмотреть обработчик изменения содержимого поля ввода имени, то там обнаружится только один вызов какой-то функции. Аналогичный вызов выполняется и при изменении поля серийника, но там еще дополнительно проверяется заполненность отдельных кусочков. Несложно догадаться, что именно эта функция каким-то образом должна быть связана с активацией кнопки ввода. Давайте вернемся в дизассемблер и посмотрим на нее повнимательнее.
  1. CODE:005CF8B8                 push    ebp
  2. CODE:005CF8B9                 mov     ebp, esp
  3. CODE:005CF8BB                 xor     ecx, ecx
  4. CODE:005CF8BD                 push    ecx
  5. CODE:005CF8BE                 push    ecx
  6. CODE:005CF8BF                 push    ecx
  7. CODE:005CF8C0                 push    ecx
  8. CODE:005CF8C1                 push    ecx
  9. CODE:005CF8C2                 push    ebx
  10. CODE:005CF8C3                 mov     ebx, eax
  11. CODE:005CF8C5                 xor     eax, eax
  12. CODE:005CF8C7                 push    ebp
  13. CODE:005CF8C8                 push    offset loc_5CF97C
  14. CODE:005CF8CD                 push    dword ptr fs:[eax]
  15. CODE:005CF8D0                 mov     fs:[eax], esp
  16. CODE:005CF8D3                 lea     edx, [ebp+var_4]
  17. CODE:005CF8D6                 mov     eax, ebx
  18. CODE:005CF8D8                 call    sub_5CF704
  19. CODE:005CF8DD                 mov     eax, [ebp+var_4]
  20. CODE:005CF8E0                 call    sub_5897B4
  21. CODE:005CF8E5                 test    al, al
  22. CODE:005CF8E7                 jz      short loc_5CF933
  23. CODE:005CF8E9                 lea     edx, [ebp+var_8]
  24. CODE:005CF8EC                 mov     eax, ebx
  25. CODE:005CF8EE                 call    sub_5CF7F4
  26. CODE:005CF8F3                 mov     eax, [ebp+var_8]
  27. CODE:005CF8F6                 push    eax
  28. CODE:005CF8F7                 lea     edx, [ebp+var_C]
  29. CODE:005CF8FA                 mov     eax, ebx
  30. CODE:005CF8FC                 call    sub_5CF704
  31. CODE:005CF901                 mov     eax, [ebp+var_C]
  32. CODE:005CF904                 pop     edx
  33. ; Вызвать функцию проверки
  34. CODE:005CF905                 call    sub_589838
  35. CODE:005CF90A                 test    al, al
  36. ; Активировать кнопку ввода
  37. CODE:005CF90C                 jnz     short loc_5CF937
  38. CODE:005CF90E                 lea     edx, [ebp+var_10]
  39. CODE:005CF911                 mov     eax, ebx
  40. CODE:005CF913                 call    sub_5CF7F4
  41. CODE:005CF918                 mov     eax, [ebp+var_10]
  42. CODE:005CF91B                 push    eax
  43. CODE:005CF91C                 lea     edx, [ebp+var_14]
  44. CODE:005CF91F                 mov     eax, ebx
  45. CODE:005CF921                 call    sub_5CF758
  46. CODE:005CF926                 mov     eax, [ebp+var_14]
  47. CODE:005CF929                 pop     edx
  48. ; Вызвать функцию проверки
  49. CODE:005CF92A                 call    sub_589838
  50. CODE:005CF92F                 test    al, al
  51. ; Активировать кнопку ввода
  52. CODE:005CF931                 jnz     short loc_5CF937
  53. CODE:005CF933 loc_5CF933:
  54. ; Состояние кнопки - отключена
  55. CODE:005CF933                 xor     edx, edx
  56. CODE:005CF935                 jmp     short loc_5CF939
  57. CODE:005CF937 ; --------------------------------------
  58. CODE:005CF937 loc_5CF937:
  59. ; Состояние кнопки - включена
  60. CODE:005CF937                 mov     dl, 1
  61. CODE:005CF939 loc_5CF939:
  62. ; CODE XREF: Svrmainform::TWebAppDbgMainForm::MainUpdateActionUpdate
  63. CODE:005CF939                 mov     eax, [ebx+314h]
  64. CODE:005CF93F                 mov     ecx, [eax]
  65. CODE:005CF941                 call    dword ptr [ecx+64h]
  66. CODE:005CF944                 mov     eax, [ebx+314h]
  67. CODE:005CF94A                 mov     edx, [eax]
  68. CODE:005CF94C                 call    dword ptr [edx+50h]
  69. CODE:005CF94F                 test    al, al
  70. CODE:005CF951                 jz      short loc_5CF961
  71. CODE:005CF953                 mov     eax, [ebx+314h]
  72. CODE:005CF959                 mov     edx, [eax]
  73. CODE:005CF95B                 call    dword ptr [edx+0C4h]
  74. CODE:005CF961 loc_5CF961:
  75. CODE:005CF961                 xor     eax, eax
  76. CODE:005CF963                 pop     edx
  77. CODE:005CF964                 pop     ecx
  78. CODE:005CF965                 pop     ecx
  79. CODE:005CF966                 mov     fs:[eax], edx
  80. CODE:005CF969                 push    offset loc_5CF983
  81. CODE:005CF96E loc_5CF96E:
  82. CODE:005CF96E                 lea     eax, [ebp+var_14]
  83. CODE:005CF971                 mov     edx, 5
  84. CODE:005CF976                 call    @System@@LStrArrayClr$qqrpvi
  85. CODE:005CF97B                 retn
  86. CODE:005CF97C loc_5CF97C:
  87. CODE:005CF97C                 jmp     unknown_libname_69
  88. CODE:005CF981 ; --------------------------------------
  89. CODE:005CF981                 jmp     short loc_5CF96E
  90. CODE:005CF983 ; --------------------------------------
  91. CODE:005CF983 loc_5CF983:
  92. CODE:005CF983                 pop     ebx
  93. CODE:005CF984                 mov     esp, ebp
  94. CODE:005CF986                 pop     ebp
  95. CODE:005CF987                 retn
В середине функции находится очень характерное ветвление алгоритма, на котором завязана манипуляция с содержимым регистра EDX. Именно так в скомпилированном коде Дельфи выглядит активация и деактивация элементов формы. В регистре EDX передается состояние, за активное отвечает значение 1. На эту ветку ведут два условных перехода, причем перед ними вызывается одна и та же функция, которая в положительном случае должна вернуть AL=1. Впечатываем в ее начало по адресу 00589838 пару команд MOV AL,1 и RET, сохраняем изменения. Теперь программа принимает любой серийник и любое регистрационное имя, активируя кнопку ввода сразу же после ввода любого символа.

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

Теперь проверим функционал. Перевод календаря на работоспособность не влияет, все триальные ограничения сняты, никаких окон не появляется, файлы сохраняются, в окне "О программе" красуется введенное регистрационное имя. Цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (30.07.2022 в 09:22):
0101, ну так логику никто ж не отменял. Это касаемо статьи. Остальное как в школе учили: если слово можно заменить на аналогичное по смыслу, то слитно. "Несложно" = "Легко", пишем слитно. А вот конструкции вида "Не сложно, а легко" или "совсем не сложно" пишем раздельно. https://nauka.club/russkiy-yaz...slozhno.html
0101 (30.07.2022 в 08:52):
Любимая фраза в каждой статье: "Несложно догадаться". Конечно, не сложно!)
п.с. сложнее определить слитно или раздельно писать "не@сложно")

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

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

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