Исследование защиты программы Amazing Slow Downer
Скриншот программы Amazing Slow Downer
Программа Amazing Slow Downer предназначена для проведения изощренных экспериментов над музыкальными произведениями путем ускорения или замедления музыки с одновременным регулированием тональности. Таким образом можно изменить не только скорость песни, но и тембр голоса исполнителя. Автор считает, что трудящиеся должны выложить за программу тридцатку баксов, а я считаю, что искусство должно принадлежать народу.
Забираем с сайта свежий дистрибутив, устанавливаем, смотрим. Основной файл ничем не упакован, что в таком случае делать - это вы знаете сами. Для вновь прибывших напомню: отправляем файл на разбор в дизассемблер. При запуске программа сразу же обозначает, что в пробном режиме будет обрабатывать только первый трек с компакт-диска. При работе с файлами сообщение другое:
Сообщение незарегистрированной версии
То есть присутствует ограничение по времени обрабатываемого фрагмента. Это или первая четверть файла, или не более трех минут.
Сообщение о неправильной регистрации
При попытке зарегистрироваться с левыми данными появляется сообщение о неправильной регистрации, но в файле найти его не удалось. Или оно хранится в зашифрованном виде, или формируется динамически, или еще как-то. Правильный ход со стороны автора. Значит надо искать другой путь. При выходе из программы она открывает в блокноте файл "Order.txt" с формой регистрации. По названию файла обнаруживается вот такая небольшая функция, где он используется:
Code (Assembler) : Убрать нумерацию
- .text:004E7500 sub esp, 20Ch
- .text:004E7506 lea eax, [esp+20Ch+var_20C]
- .text:004E7509 push offset unk_58EB3C ; int
- .text:004E750E push eax ; lpFilename
- .text:004E750F push [esp+214h+hModule] ; hModule
- .text:004E7516 call sub_4D38C0
- .text:004E751B add esp, 0Ch
- .text:004E751E lea eax, [esp+20Ch+var_20C]
- .text:004E7521 push 1 ; nShowCmd
- .text:004E7523 push eax ; lpDirectory
- .text:004E7524 push 0 ; lpParameters
- ; Название файла
- .text:004E7526 push offset aOrder_txt ; "Order.txt"
- ; Команда
- .text:004E752B push offset aOpen_0 ; "open"
- .text:004E7530 push 0 ; hwnd
- ; Открыть файл Order.txt
- .text:004E7532 call ds:ShellExecuteW
- .text:004E7538 add esp, 20Ch
- .text:004E753E retn
Code (Assembler) : Убрать нумерацию
- .text:004E5C2B push 12h
- .text:004E5C2D push offset unk_58E22C
- .text:004E5C32 push 0
- .text:004E5C34 call sub_404ED8
- ; Проверить статус регистрации
- .text:004E5C39 cmp dword_6F1B18, 0
- ; Программа зарегистрирована, открывать файл не надо
- .text:004E5C40 jnz short loc_4E5C50
- .text:004E5C42 push hInstance ; hModule
- ; Открыть файл Order.txt
- .text:004E5C48 call sub_4E7500
- .text:004E5C4D add esp, 4
- .text:004E5C50 loc_4E5C50:
- .text:004E5C50 push offset word_6F18F8
- .text:004E5C55 mov esi, ebx
Перекрестные ссылки на переменную
Первые два адреса интереса не представляют, так как там обрабатывается ввод серийника и по результатам устанавливается или обнуляется флаг регистрации. А вот следующий код гораздо интереснее:
Code (Assembler) : Убрать нумерацию
- .text:004ECE0C add esp, 0Ch
- .text:004ECE0F call sub_457BA0
- ; Вызвать функцию проверки
- .text:004ECE14 call sub_4E1370
- ; Сохранить в регистре ECX статус регистрации
- .text:004ECE19 mov ecx, dword_6F1B18
- ; Результат функции проверки нулевой?
- .text:004ECE1F test al, al
- .text:004ECE21 mov edx, 1
- ; Результат не нулевой, записать в регистр ECX=1
- .text:004ECE26 cmovnz ecx, edx
- .text:004ECE29 cmp dword_5E4B04, 0
- ; Записать в статус регистрации старое значение или новое 1
- .text:004ECE30 mov dword_6F1B18, ecx
- .text:004ECE36 jnz short loc_4ECE70
- .text:004ECE38 mov ecx, offset unk_6F1C90
- .text:004ECE3D call sub_4CA660
Code (Assembler) : Убрать нумерацию
- ; AL = результат проверки
- .text:004E1725 mov al, bl
- .text:004E1727 pop edi
- .text:004E1728 pop esi
- .text:004E1729 pop ebx
- .text:004E172A mov large fs:0, ecx
- .text:004E1731 mov esp, ebp
- .text:004E1733 pop ebp
- .text:004E1734 retn
Сообщение о неправильной регистрации
Опаньки. Обрабатывается только часть файла, затем программа сообщает о необходимости повторить процедуру разлочки или обратиться к автору. Где-то скрывается дополнительная проверка регистрации. Находим строку сообщения, находим место, где она используется.
Code (Assembler) : Убрать нумерацию
- .text:004E5980 sub_4E5980 proc near
- .text:004E5980 push 30h ; uType
- .text:004E5982 push offset aAmazingSlowDow
- ; "Amazing Slow Downer"
- .text:004E5987 push offset aError149Please
- ; "Error 149\nPlease redo the complete unl"...
- .text:004E598C push [esp+0Ch+hWnd] ; hWnd
- .text:004E5990 call ds:MessageBoxW
- .text:004E5996 retn
- .text:004E5996 sub_4E5980 endp
Code (Assembler) : Убрать нумерацию
- ; Вызывать функцию проверки
- .text:004E4548 call sub_4C6150
- .text:004E454D mov ecx, [ebp+var_14]
- ; Сохранить ее результат в регистре EDX
- .text:004E4550 mov edx, eax
- .text:004E4552 mov eax, [ecx+64h]
- .text:004E4555 mov [ebp+var_38], eax
- .text:004E4558 cmp edx, 2
- .text:004E455B jz loc_4E4753
- ; Если EDX=3, то показать сообщение о разлочке
- .text:004E4561 cmp edx, 3
- .text:004E4564 jz loc_4E473F
- .text:004E456A cmp edx, 1
- .text:004E456D jnz short loc_4E457E
- .text:004E456F cmp [ebp+arg_10], 2
- .text:004E4573 mov dl, dl
- .text:004E4575 mov [ebp+var_E], dl
- ...
- ...
- .text:004E473F loc_4E473F:
- .text:004E473F push [ebp+hWnd] ; hWnd
- ; Показать сообщение
- .text:004E4742 call sub_4E5980
- .text:004E4747 mov eax, [ebp+arg_0]
- .text:004E474A add esp, 4
Code (Assembler) : Убрать нумерацию
- .text:004C6150 cmp byte ptr [ecx+5Ch], 0
- .text:004C6154 push esi
- .text:004C6155 jz short loc_4C618C
- .text:004C6157 mov edx, dword_62F79C
- .text:004C615D mov eax, 190h
- .text:004C6162 inc edx
- .text:004C6163 mov esi, 12Ch
- .text:004C6168 cmp dword_5E4B04, 0
- .text:004C616F mov dword_62F79C, edx
- .text:004C6175 cmovz eax, esi
- .text:004C6178 cmp edx, eax
- .text:004C617A jbe short loc_4C618C
- .text:004C617C cmp byte_6F6A85, 0
- .text:004C6183 jnz short loc_4C618C
- ; Требуется повторная разлочка
- .text:004C6185 mov eax, 3
- .text:004C618A pop esi
- .text:004C618B retn
- .text:004C618C ; -----------------------------------------------
- .text:004C618C loc_4C618C:
- .text:004C618C mov eax, [ecx+64h]
- .text:004C618F mov esi, 3
- .text:004C6194 inc eax
Программа успешно "зарегистрирована"
В этот раз файл обрабатывается без каких-либо ограничений. Цель достигнута. В патченном варианте программа становится портативной и прекрасно запускается с флешки.
Просмотров: 2209 | Комментариев: 3
Метки: исследование защиты, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Vladimir
(15.02.2020 в 18:52):
Муцураев. Хороший всё ж бард, хоть и с другой стороны.
Noobie
(08.02.2020 в 18:57):
Есть несколько иной вариант:
.004ECE14: E85745FFFF call 0004E1370
.004ECE19: 8B0D181B6F00 mov ecx,[0006F1B18]
.004ECE1F: 84C0 test al,al
.004ECE21: BA01000000 mov edx,1
.004ECE26: 0F45CA cmovnz ecx,edx
.004ECE29: 833D044B5E0000 cmp d,[0005E4B04],0
Меняется cmovnz на cmovz по адресу .004ECE26: 45 > 44
.004ECE14: E85745FFFF call 0004E1370
.004ECE19: 8B0D181B6F00 mov ecx,[0006F1B18]
.004ECE1F: 84C0 test al,al
.004ECE21: BA01000000 mov edx,1
.004ECE26: 0F45CA cmovnz ecx,edx
.004ECE29: 833D044B5E0000 cmp d,[0005E4B04],0
Меняется cmovnz на cmovz по адресу .004ECE26: 45 > 44
pawel97
(08.02.2020 в 13:29):
Превращаем прогу в кейген. После такого патчика вместо id будет сразу показан password - то, что и нужно вбивать.
004FA989 B9 30146F00 mov ecx,offset 006F1430
004FA98E E8 FDFDFFFF call 004FA790
004FA993 50 push eax
004FA994 E8 62CB0400 call 005474FB
004FA999 83C4 18 add esp,18
004FA99C EB 2F jmp short 004FA9CD
Что до качества заявленного тут функционала - рекомендую reaper или sound forge с его Elastique Timestretch.
004FA989 B9 30146F00 mov ecx,offset 006F1430
004FA98E E8 FDFDFFFF call 004FA790
004FA993 50 push eax
004FA994 E8 62CB0400 call 005474FB
004FA999 83C4 18 add esp,18
004FA99C EB 2F jmp short 004FA9CD
Что до качества заявленного тут функционала - рекомендую reaper или sound forge с его Elastique Timestretch.
Добавить комментарий
Заполните форму для добавления комментария