Blog. Just Blog

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

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

PhotoToFilm от KC Softwares - очень неплохая программа для уровня домохозяек, чтобы из пачки фотографий сделать видеоролик-слайдшоу со звуком, титрами и незамысловатыми эффектами переходов. При этом пользователям совершенно не требуется разбираться с супер-навороченными возможностями мощных видеоредакторов, все делается буквально за несколько кликов. Без регистрации на готовое видео накладывается триальный маркер, после покупки и регистрации маркер не накладывается. Мне кажется, покупка в этой цепочке выглядит явно лишней.

Офсайт устал и спит, поэтому дистрибутив можно скачать с файлообменника. Устанавливаем, запускаем, смотрим.

Графический файл с водяным знаком
Графический файл с водяным знаком

Никакие исполняемые файлы пока не трогаем, просто посмотрим на то, что находится в папке с программой. Отдельный интерес вызывает файл "unreg.bmp", в котором содержится блямба, накладываемая на готовое видео. Если его просто удалить, то программа при старте обработки ругнется, что такой файл не найден. А вот если его заменить однопиксельным файлом в формате BMP, то именно такой однопиксельный водяной знак и будет накладываться на видео. Он абсолютно не мешает просмотру, так как вообще не заметный. Остается триальное окно с таймером при запуске программы, но его, в принципе, можно потерпеть. Как и всякие триальные надписи в интерфейсе. Главное, что видео больше не портится. Такой вот секундный "взлом" для самых маленьких :)

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

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

В листинге дизассемблера эта строчка используется в следующем контексте. Я захвачу немного кода выше, дальше будет понятно, для чего это сделано.
  1. CODE:0055B8EB                 mov     eax, [ebp+var_C]
  2. CODE:0055B8EE                 push    eax
  3. CODE:0055B8EF                 mov     eax, [ebp+var_10]
  4. CODE:0055B8F2                 push    eax
  5. CODE:0055B8F3                 mov     ecx, offset aKyle ; "KYLE"
  6. CODE:0055B8F8                 mov     edx, offset aKatarn ; "KATARN"
  7. CODE:0055B8FD                 mov     eax, esi
  8. CODE:0055B8FF                 call    sub_55BA44
  9. CODE:0055B904                 mov     ebx, eax
  10. CODE:0055B906 loc_55B906:
  11. CODE:0055B906                 test    bl, bl
  12. CODE:0055B908                 jnz     short loc_55B921
  13. CODE:0055B90A                 mov     eax, [ebp+var_C]
  14. CODE:0055B90D                 push    eax
  15. CODE:0055B90E                 mov     eax, [ebp+var_10]
  16. CODE:0055B911                 push    eax
  17. CODE:0055B912                 mov     ecx, [ebp+var_8]
  18. CODE:0055B915                 mov     edx, [ebp+var_4]
  19. CODE:0055B918                 mov     eax, esi
  20. CODE:0055B91A                 call    sub_55BA44
  21. CODE:0055B91F                 mov     ebx, eax
  22. CODE:0055B921 loc_55B921:
  23. CODE:0055B921                 test    bl, bl
  24. CODE:0055B923                 jz      short loc_55B959
  25. CODE:0055B925                 push    4
  26. CODE:0055B927                 lea     ecx, [ebp+var_1C]
  27. CODE:0055B92A                 mov     edx, offset aValidLicence_T
  28. ; "Valid Licence. Thank you for registerin"...
  29. CODE:0055B92F                 mov     eax, [esi+314h]
  30. CODE:0055B935                 call    sub_4DA544
  31. CODE:0055B93A                 mov     eax, [ebp+var_1C]
  32. CODE:0055B93D                 push    eax
  33. CODE:0055B93E                 mov     eax, esi
  34. CODE:0055B940                 call    sub_467828
  35. CODE:0055B945                 xor     ecx, ecx
  36. CODE:0055B947                 pop     edx
  37. CODE:0055B948                 call    sub_55B3D8
  38. CODE:0055B94D                 mov     dword ptr [esi+24Ch], 1
  39. CODE:0055B957                 jmp     short loc_55B981
  40. CODE:0055B959 ; --------------------------------------
  41. CODE:0055B959 loc_55B959:
  42. CODE:0055B959                 push    2
  43. CODE:0055B95B                 lea     ecx, [ebp+var_20]
  44. CODE:0055B95E                 mov     edx, offset aInvalidLicence
  45. ; "Invalid Licence Data."
  46. CODE:0055B963                 mov     eax, [esi+314h]
  47. CODE:0055B969                 call    sub_4DA544
  48. CODE:0055B96E                 mov     eax, [ebp+var_20]
  49. CODE:0055B971                 push    eax
  50. CODE:0055B972                 mov     eax, esi
  51. CODE:0055B974                 call    sub_467828
Велик соблазн пропатчить функцию проверки, вызываемую по адресу 0055B8FF, на предмет того, чтобы она всегда возвращала нужное значение. Увы, делу это не поможет, она используется только при проверке введенного серийника. Программа будет благодарить за регистрацию, но все ограничения останутся.

А вот если посмотреть на начало приведенного фрагмента кода, то там обнаружатся интересные строки "KYLE" и "KATARN". Имена детей разработчика? А если посмотреть функции, которые после этого вызываются, то там обнаружится работа с реестром - записываются введенные значения имени и серийника. Логично предположить, что раз они здесь записываются, то где-то они должны проверяться, после чего проверяться и считаться правильными или неправильными. Поищем какой-нибудь код, который также содержит подобные строки. Обнаружится интересня функция, вызываемая из нескольких мест:
  1. CODE:0055C0A0                 push    ebp
  2. CODE:0055C0A1                 mov     ebp, esp
  3. CODE:0055C0A3                 push    ecx
  4. CODE:0055C0A4                 mov     ecx, 4
  5. CODE:0055C0A9 loc_55C0A9:
  6. CODE:0055C0A9                 push    0
  7. CODE:0055C0AB                 push    0
  8. CODE:0055C0AD                 dec     ecx
  9. CODE:0055C0AE                 jnz     short loc_55C0A9
  10. CODE:0055C0B0                 push    ecx
  11. CODE:0055C0B1                 xchg    ecx, [ebp+var_4]
  12. CODE:0055C0B4                 push    ebx
  13. CODE:0055C0B5                 push    esi
  14. CODE:0055C0B6                 push    edi
  15. CODE:0055C0B7                 mov     esi, ecx
  16. CODE:0055C0B9                 mov     ebx, edx
  17. CODE:0055C0BB                 mov     [ebp+var_4], eax
  18. CODE:0055C0BE                 xor     eax, eax
  19. CODE:0055C0C0                 push    ebp
  20. CODE:0055C0C1                 push    offset loc_55C3E4
  21. CODE:0055C0C6                 push    dword ptr fs:[eax]
  22. CODE:0055C0C9                 mov     fs:[eax], esp
  23. CODE:0055C0CC                 mov     [ebp+var_5], 0
  24. CODE:0055C0D0                 mov     eax, [ebp+var_4]
  25. CODE:0055C0D3                 cmp     byte ptr [eax+338h], 0
  26. CODE:0055C0DA                 jz      loc_55C3C9
  27. CODE:0055C0E0                 lea     edx, [ebp+var_18]
  28. CODE:0055C0E3                 mov     eax, ds:off_5BB140
  29. CODE:0055C0E8                 mov     eax, [eax]
  30. CODE:0055C0EA                 call    sub_480ED4
  31. CODE:0055C0EF                 mov     edx, [ebp+var_18]
  32. CODE:0055C0F2                 mov     eax, [ebp+var_4]
  33. CODE:0055C0F5                 add     eax, 330h
  34. CODE:0055C0FA                 call    sub_40459C
  35. CODE:0055C0FF                 mov     dl, 1
  36. CODE:0055C101                 mov     eax, off_43E428
  37. CODE:0055C106                 call    sub_43E528
  38. CODE:0055C10B                 mov     [ebp+var_C], eax
  39. CODE:0055C10E                 xor     eax, eax
  40. CODE:0055C110                 push    ebp
  41. CODE:0055C111                 push    offset loc_55C37E
  42. CODE:0055C116                 push    dword ptr fs:[eax]
  43. CODE:0055C119                 mov     fs:[eax], esp
  44. CODE:0055C11C                 mov     edx, 80000001h
  45. CODE:0055C121                 mov     eax, [ebp+var_C]
  46. CODE:0055C124                 call    sub_43E604
  47. CODE:0055C129                 xor     ecx, ecx
  48. CODE:0055C12B                 mov     edx, offset aSoftwareKcSo_7
  49. ; "SOFTWARE\\KC Softwares"
  50. CODE:0055C130                 mov     eax, [ebp+var_C]
  51. CODE:0055C133                 call    sub_43E66C
  52. CODE:0055C138                 mov     edx, offset aName_1 ; "Name"
  53. CODE:0055C13D                 mov     eax, [ebp+var_C]
  54. CODE:0055C140                 call    sub_43EF38
  55. CODE:0055C145                 test    al, al
  56. CODE:0055C147                 jz      short loc_55C15B
  57. CODE:0055C149                 lea     ecx, [ebp+var_10]
  58. CODE:0055C14C                 mov     edx, offset aName_1 ; "Name"
  59. CODE:0055C151                 mov     eax, [ebp+var_C]
  60. CODE:0055C154                 call    sub_43EDA0
  61. CODE:0055C159                 jmp     short loc_55C163
  62. CODE:0055C15B ; --------------------------------------
  63. CODE:0055C15B loc_55C15B:
  64. CODE:0055C15B                 lea     eax, [ebp+var_10]
  65. CODE:0055C15E                 call    sub_404548
  66. CODE:0055C163 loc_55C163:
  67. CODE:0055C163                 mov     edx, offset aPass_0 ; "Pass"
  68. CODE:0055C168                 mov     eax, [ebp+var_C]
  69. CODE:0055C16B                 call    sub_43EF38
  70. CODE:0055C170                 test    al, al
  71. CODE:0055C172                 jz      short loc_55C196
  72. CODE:0055C174                 lea     ecx, [ebp+var_14]
  73. CODE:0055C177                 mov     edx, offset aPass_0 ; "Pass"
  74. CODE:0055C17C                 mov     eax, [ebp+var_C]
  75. CODE:0055C17F                 call    sub_43EDA0
  76. CODE:0055C184                 mov     eax, [ebp+var_4]
  77. CODE:0055C187                 add     eax, 328h
  78. CODE:0055C18C                 mov     edx, [ebp+var_14]
  79. CODE:0055C18F                 call    sub_40459C
  80. CODE:0055C194                 jmp     short loc_55C19E
  81. CODE:0055C196 ; --------------------------------------
  82. CODE:0055C196 loc_55C196:
  83. CODE:0055C196                 lea     eax, [ebp+var_14]
  84. CODE:0055C199                 call    sub_404548
  85. CODE:0055C19E loc_55C19E:
  86. CODE:0055C19E                 mov     eax, [ebp+var_C]
  87. CODE:0055C1A1                 call    sub_43E5D4
  88. CODE:0055C1A6                 mov     eax, [ebp+var_10]
  89. CODE:0055C1A9                 call    sub_404818
  90. CODE:0055C1AE                 mov     edi, eax
  91. CODE:0055C1B0                 mov     eax, [ebp+var_14]
  92. CODE:0055C1B3                 call    sub_404818
  93. CODE:0055C1B8                 imul    edi, eax
  94. CODE:0055C1BB                 test    edi, edi
  95. CODE:0055C1BD                 jle     short loc_55C20B
  96. CODE:0055C1BF                 mov     eax, [ebp+var_4]
  97. CODE:0055C1C2                 cmp     byte ptr [eax+339h], 0
  98. CODE:0055C1C9                 jz      short loc_55C20B
  99. CODE:0055C1CB                 mov     eax, [ebp+var_10]
  100. CODE:0055C1CE                 push    eax
  101. CODE:0055C1CF                 mov     eax, [ebp+var_14]
  102. CODE:0055C1D2                 push    eax
  103. CODE:0055C1D3                 mov     ecx, offset aKyle_0 ; "Kyle"
  104. CODE:0055C1D8                 mov     edx, offset aKatarn_1 ; "Katarn"
  105. CODE:0055C1DD                 mov     eax, [ebp+var_4]
  106. CODE:0055C1E0                 call    sub_55BCCC
  107. CODE:0055C1E5                 mov     [ebp+var_5], al
  108. CODE:0055C1E8                 mov     eax, [ebp+var_4]
  109. CODE:0055C1EB                 add     eax, 330h
  110. CODE:0055C1F0                 mov     edx, offset aPremium ; "Premium"
  111. CODE:0055C1F5                 call    sub_40459C
  112. CODE:0055C1FA                 cmp     [ebp+var_5], 0
  113. CODE:0055C1FE                 jz      short loc_55C20B
  114. CODE:0055C200                 mov     eax, [ebp+arg_0]
Тут также имеется работа с реестром, такие же названия ключей, те же строки с именами. А завершается это все возвратом регистра AL и очисткой стека. Впечатываем в начало функции пару команд MOV EAX,1 и RET 4, сохраняем изменения.

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

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (17.04.2024 в 15:47):
Ну вот и еще одна загадка разрешилась :) mr_yoda, спасибо.
mr_yoda (17.04.2024 в 15:28):
Kyle Katarn — персонаж Вселенной «Звёздных войн».
user (03.04.2024 в 06:09):
Не совсем доделано.

Так лучще:

;;------------------------------->8
PhotoToFilm Lite 3.9.8.107

Set registered
PhotoToFilm.exe
.0055C3EB: 8A B0 ;0015B7EB:
.0055C3EC: 45 01 ;0015B7EC:
.0055C3ED: FB 90 ;0015B7ED:

Skip nag "Invalid license"
PhotoToFilm.exe
.005314B4: 8B 31 ;001308B4:
.005314B5: C3 C0 ;001308B5:
;;------------------------------->8
Proton (30.03.2024 в 17:37):
Иронично на окошке About: "KC Software - We are here to stay". С другой стороны компания может и закрылась, но софт живет и можно пользоваться. В этом отличие старого доброго софта от облаков.

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

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

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