Исследование защиты программы PhotoToFilm
Скриншот программы PhotoToFilm
PhotoToFilm от KC Softwares - очень неплохая программа для уровня домохозяек, чтобы из пачки фотографий сделать видеоролик-слайдшоу со звуком, титрами и незамысловатыми эффектами переходов. При этом пользователям совершенно не требуется разбираться с супер-навороченными возможностями мощных видеоредакторов, все делается буквально за несколько кликов. Без регистрации на готовое видео накладывается триальный маркер, после покупки и регистрации маркер не накладывается. Мне кажется, покупка в этой цепочке выглядит явно лишней.
Офсайт устал и спит, поэтому дистрибутив можно скачать с файлообменника. Устанавливаем, запускаем, смотрим.
Графический файл с водяным знаком
Никакие исполняемые файлы пока не трогаем, просто посмотрим на то, что находится в папке с программой. Отдельный интерес вызывает файл "unreg.bmp", в котором содержится блямба, накладываемая на готовое видео. Если его просто удалить, то программа при старте обработки ругнется, что такой файл не найден. А вот если его заменить однопиксельным файлом в формате BMP, то именно такой однопиксельный водяной знак и будет накладываться на видео. Он абсолютно не мешает просмотру, так как вообще не заметный. Остается триальное окно с таймером при запуске программы, но его, в принципе, можно потерпеть. Как и всякие триальные надписи в интерфейсе. Главное, что видео больше не портится. Такой вот секундный "взлом" для самых маленьких :)
Теперь давайте все-таки поковыряемся во внутренностях программы. Главный исполняемый файл ничем не упакован, отправляем его на анализ в дизассемблер. На попытку ввода левых регистрационных данных программа реагирует следующим сообщением:
Сообщение о неправильной регистрации
В листинге дизассемблера эта строчка используется в следующем контексте. Я захвачу немного кода выше, дальше будет понятно, для чего это сделано.
Code (Assembler) : Убрать нумерацию
- CODE:0055B8EB mov eax, [ebp+var_C]
- CODE:0055B8EE push eax
- CODE:0055B8EF mov eax, [ebp+var_10]
- CODE:0055B8F2 push eax
- CODE:0055B8F3 mov ecx, offset aKyle ; "KYLE"
- CODE:0055B8F8 mov edx, offset aKatarn ; "KATARN"
- CODE:0055B8FD mov eax, esi
- CODE:0055B8FF call sub_55BA44
- CODE:0055B904 mov ebx, eax
- CODE:0055B906 loc_55B906:
- CODE:0055B906 test bl, bl
- CODE:0055B908 jnz short loc_55B921
- CODE:0055B90A mov eax, [ebp+var_C]
- CODE:0055B90D push eax
- CODE:0055B90E mov eax, [ebp+var_10]
- CODE:0055B911 push eax
- CODE:0055B912 mov ecx, [ebp+var_8]
- CODE:0055B915 mov edx, [ebp+var_4]
- CODE:0055B918 mov eax, esi
- CODE:0055B91A call sub_55BA44
- CODE:0055B91F mov ebx, eax
- CODE:0055B921 loc_55B921:
- CODE:0055B921 test bl, bl
- CODE:0055B923 jz short loc_55B959
- CODE:0055B925 push 4
- CODE:0055B927 lea ecx, [ebp+var_1C]
- CODE:0055B92A mov edx, offset aValidLicence_T
- ; "Valid Licence. Thank you for registerin"...
- CODE:0055B92F mov eax, [esi+314h]
- CODE:0055B935 call sub_4DA544
- CODE:0055B93A mov eax, [ebp+var_1C]
- CODE:0055B93D push eax
- CODE:0055B93E mov eax, esi
- CODE:0055B940 call sub_467828
- CODE:0055B945 xor ecx, ecx
- CODE:0055B947 pop edx
- CODE:0055B948 call sub_55B3D8
- CODE:0055B94D mov dword ptr [esi+24Ch], 1
- CODE:0055B957 jmp short loc_55B981
- CODE:0055B959 ; --------------------------------------
- CODE:0055B959 loc_55B959:
- CODE:0055B959 push 2
- CODE:0055B95B lea ecx, [ebp+var_20]
- CODE:0055B95E mov edx, offset aInvalidLicence
- ; "Invalid Licence Data."
- CODE:0055B963 mov eax, [esi+314h]
- CODE:0055B969 call sub_4DA544
- CODE:0055B96E mov eax, [ebp+var_20]
- CODE:0055B971 push eax
- CODE:0055B972 mov eax, esi
- CODE:0055B974 call sub_467828
А вот если посмотреть на начало приведенного фрагмента кода, то там обнаружатся интересные строки "KYLE" и "KATARN". Имена детей разработчика? А если посмотреть функции, которые после этого вызываются, то там обнаружится работа с реестром - записываются введенные значения имени и серийника. Логично предположить, что раз они здесь записываются, то где-то они должны проверяться, после чего проверяться и считаться правильными или неправильными. Поищем какой-нибудь код, который также содержит подобные строки. Обнаружится интересня функция, вызываемая из нескольких мест:
Code (Assembler) : Убрать нумерацию
- CODE:0055C0A0 push ebp
- CODE:0055C0A1 mov ebp, esp
- CODE:0055C0A3 push ecx
- CODE:0055C0A4 mov ecx, 4
- CODE:0055C0A9 loc_55C0A9:
- CODE:0055C0A9 push 0
- CODE:0055C0AB push 0
- CODE:0055C0AD dec ecx
- CODE:0055C0AE jnz short loc_55C0A9
- CODE:0055C0B0 push ecx
- CODE:0055C0B1 xchg ecx, [ebp+var_4]
- CODE:0055C0B4 push ebx
- CODE:0055C0B5 push esi
- CODE:0055C0B6 push edi
- CODE:0055C0B7 mov esi, ecx
- CODE:0055C0B9 mov ebx, edx
- CODE:0055C0BB mov [ebp+var_4], eax
- CODE:0055C0BE xor eax, eax
- CODE:0055C0C0 push ebp
- CODE:0055C0C1 push offset loc_55C3E4
- CODE:0055C0C6 push dword ptr fs:[eax]
- CODE:0055C0C9 mov fs:[eax], esp
- CODE:0055C0CC mov [ebp+var_5], 0
- CODE:0055C0D0 mov eax, [ebp+var_4]
- CODE:0055C0D3 cmp byte ptr [eax+338h], 0
- CODE:0055C0DA jz loc_55C3C9
- CODE:0055C0E0 lea edx, [ebp+var_18]
- CODE:0055C0E3 mov eax, ds:off_5BB140
- CODE:0055C0E8 mov eax, [eax]
- CODE:0055C0EA call sub_480ED4
- CODE:0055C0EF mov edx, [ebp+var_18]
- CODE:0055C0F2 mov eax, [ebp+var_4]
- CODE:0055C0F5 add eax, 330h
- CODE:0055C0FA call sub_40459C
- CODE:0055C0FF mov dl, 1
- CODE:0055C101 mov eax, off_43E428
- CODE:0055C106 call sub_43E528
- CODE:0055C10B mov [ebp+var_C], eax
- CODE:0055C10E xor eax, eax
- CODE:0055C110 push ebp
- CODE:0055C111 push offset loc_55C37E
- CODE:0055C116 push dword ptr fs:[eax]
- CODE:0055C119 mov fs:[eax], esp
- CODE:0055C11C mov edx, 80000001h
- CODE:0055C121 mov eax, [ebp+var_C]
- CODE:0055C124 call sub_43E604
- CODE:0055C129 xor ecx, ecx
- CODE:0055C12B mov edx, offset aSoftwareKcSo_7
- ; "SOFTWARE\\KC Softwares"
- CODE:0055C130 mov eax, [ebp+var_C]
- CODE:0055C133 call sub_43E66C
- CODE:0055C138 mov edx, offset aName_1 ; "Name"
- CODE:0055C13D mov eax, [ebp+var_C]
- CODE:0055C140 call sub_43EF38
- CODE:0055C145 test al, al
- CODE:0055C147 jz short loc_55C15B
- CODE:0055C149 lea ecx, [ebp+var_10]
- CODE:0055C14C mov edx, offset aName_1 ; "Name"
- CODE:0055C151 mov eax, [ebp+var_C]
- CODE:0055C154 call sub_43EDA0
- CODE:0055C159 jmp short loc_55C163
- CODE:0055C15B ; --------------------------------------
- CODE:0055C15B loc_55C15B:
- CODE:0055C15B lea eax, [ebp+var_10]
- CODE:0055C15E call sub_404548
- CODE:0055C163 loc_55C163:
- CODE:0055C163 mov edx, offset aPass_0 ; "Pass"
- CODE:0055C168 mov eax, [ebp+var_C]
- CODE:0055C16B call sub_43EF38
- CODE:0055C170 test al, al
- CODE:0055C172 jz short loc_55C196
- CODE:0055C174 lea ecx, [ebp+var_14]
- CODE:0055C177 mov edx, offset aPass_0 ; "Pass"
- CODE:0055C17C mov eax, [ebp+var_C]
- CODE:0055C17F call sub_43EDA0
- CODE:0055C184 mov eax, [ebp+var_4]
- CODE:0055C187 add eax, 328h
- CODE:0055C18C mov edx, [ebp+var_14]
- CODE:0055C18F call sub_40459C
- CODE:0055C194 jmp short loc_55C19E
- CODE:0055C196 ; --------------------------------------
- CODE:0055C196 loc_55C196:
- CODE:0055C196 lea eax, [ebp+var_14]
- CODE:0055C199 call sub_404548
- CODE:0055C19E loc_55C19E:
- CODE:0055C19E mov eax, [ebp+var_C]
- CODE:0055C1A1 call sub_43E5D4
- CODE:0055C1A6 mov eax, [ebp+var_10]
- CODE:0055C1A9 call sub_404818
- CODE:0055C1AE mov edi, eax
- CODE:0055C1B0 mov eax, [ebp+var_14]
- CODE:0055C1B3 call sub_404818
- CODE:0055C1B8 imul edi, eax
- CODE:0055C1BB test edi, edi
- CODE:0055C1BD jle short loc_55C20B
- CODE:0055C1BF mov eax, [ebp+var_4]
- CODE:0055C1C2 cmp byte ptr [eax+339h], 0
- CODE:0055C1C9 jz short loc_55C20B
- CODE:0055C1CB mov eax, [ebp+var_10]
- CODE:0055C1CE push eax
- CODE:0055C1CF mov eax, [ebp+var_14]
- CODE:0055C1D2 push eax
- CODE:0055C1D3 mov ecx, offset aKyle_0 ; "Kyle"
- CODE:0055C1D8 mov edx, offset aKatarn_1 ; "Katarn"
- CODE:0055C1DD mov eax, [ebp+var_4]
- CODE:0055C1E0 call sub_55BCCC
- CODE:0055C1E5 mov [ebp+var_5], al
- CODE:0055C1E8 mov eax, [ebp+var_4]
- CODE:0055C1EB add eax, 330h
- CODE:0055C1F0 mov edx, offset aPremium ; "Premium"
- CODE:0055C1F5 call sub_40459C
- CODE:0055C1FA cmp [ebp+var_5], 0
- CODE:0055C1FE jz short loc_55C20B
- CODE:0055C200 mov eax, [ebp+arg_0]
Программа успешно "зарегистрирована"
Больше никаких триальных окон при запуске не появляется, в интерфейсе пропали надписи о покупке, готовое видео не портится. В окне "О программе" сказано, что программа зарегистрирована, но не сказано, на чье имя. Ничего, потерпим. Цель достигнута.
Просмотров: 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
Так лучще:
;;------------------------------->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". С другой стороны компания может и закрылась, но софт живет и можно пользоваться. В этом отличие старого доброго софта от облаков.
Добавить комментарий
Заполните форму для добавления комментария