Blog. Just Blog

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

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

Программа Amazing Slow Downer предназначена для проведения изощренных экспериментов над музыкальными произведениями путем ускорения или замедления музыки с одновременным регулированием тональности. Таким образом можно изменить не только скорость песни, но и тембр голоса исполнителя. Автор считает, что трудящиеся должны выложить за программу тридцатку баксов, а я считаю, что искусство должно принадлежать народу.

Забираем с сайта свежий дистрибутив, устанавливаем, смотрим. Основной файл ничем не упакован, что в таком случае делать - это вы знаете сами. Для вновь прибывших напомню: отправляем файл на разбор в дизассемблер. При запуске программа сразу же обозначает, что в пробном режиме будет обрабатывать только первый трек с компакт-диска. При работе с файлами сообщение другое:

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

То есть присутствует ограничение по времени обрабатываемого фрагмента. Это или первая четверть файла, или не более трех минут.

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

При попытке зарегистрироваться с левыми данными появляется сообщение о неправильной регистрации, но в файле найти его не удалось. Или оно хранится в зашифрованном виде, или формируется динамически, или еще как-то. Правильный ход со стороны автора. Значит надо искать другой путь. При выходе из программы она открывает в блокноте файл "Order.txt" с формой регистрации. По названию файла обнаруживается вот такая небольшая функция, где он используется:
  1. .text:004E7500                 sub     esp, 20Ch
  2. .text:004E7506                 lea     eax, [esp+20Ch+var_20C]
  3. .text:004E7509                 push    offset unk_58EB3C ; int
  4. .text:004E750E                 push    eax             ; lpFilename
  5. .text:004E750F                 push    [esp+214h+hModule] ; hModule
  6. .text:004E7516                 call    sub_4D38C0
  7. .text:004E751B                 add     esp, 0Ch
  8. .text:004E751E                 lea     eax, [esp+20Ch+var_20C]
  9. .text:004E7521                 push    1               ; nShowCmd
  10. .text:004E7523                 push    eax             ; lpDirectory
  11. .text:004E7524                 push    0               ; lpParameters
  12. ; Название файла
  13. .text:004E7526                 push    offset aOrder_txt ; "Order.txt"
  14. ; Команда
  15. .text:004E752B                 push    offset aOpen_0  ; "open"
  16. .text:004E7530                 push    0               ; hwnd
  17. ; Открыть файл Order.txt
  18. .text:004E7532                 call    ds:ShellExecuteW
  19. .text:004E7538                 add     esp, 20Ch
  20. .text:004E753E                 retn
Она вызывается из единственного места.
  1. .text:004E5C2B                 push    12h
  2. .text:004E5C2D                 push    offset unk_58E22C
  3. .text:004E5C32                 push    0
  4. .text:004E5C34                 call    sub_404ED8
  5. ; Проверить статус регистрации
  6. .text:004E5C39                 cmp     dword_6F1B18, 0
  7. ; Программа зарегистрирована, открывать файл не надо
  8. .text:004E5C40                 jnz     short loc_4E5C50
  9. .text:004E5C42                 push    hInstance       ; hModule
  10. ; Открыть файл Order.txt
  11. .text:004E5C48                 call    sub_4E7500
  12. .text:004E5C4D                 add     esp, 4
  13. .text:004E5C50 loc_4E5C50:
  14. .text:004E5C50                 push    offset word_6F18F8
  15. .text:004E5C55                 mov     esi, ebx
Тут все просто и понятно. Проверяется DWORD по адресу 6F1B18, если его значение не равно нулю, то файл с формой регистрации не открывается. Логично предположить, что это какой-то флаг статуса зарегистрированности программы. Давайте посмотрим по перекрестным ссылкам, где и как эта переменная инициализируется.

Перекрестные ссылки на переменную
Перекрестные ссылки на переменную

Первые два адреса интереса не представляют, так как там обрабатывается ввод серийника и по результатам устанавливается или обнуляется флаг регистрации. А вот следующий код гораздо интереснее:
  1. .text:004ECE0C                 add     esp, 0Ch
  2. .text:004ECE0F                 call    sub_457BA0
  3. ; Вызвать функцию проверки
  4. .text:004ECE14                 call    sub_4E1370
  5. ; Сохранить в регистре ECX статус регистрации
  6. .text:004ECE19                 mov     ecx, dword_6F1B18
  7. ; Результат функции проверки нулевой?
  8. .text:004ECE1F                 test    al, al
  9. .text:004ECE21                 mov     edx, 1
  10. ; Результат не нулевой, записать в регистр ECX=1
  11. .text:004ECE26                 cmovnz  ecx, edx
  12. .text:004ECE29                 cmp     dword_5E4B04, 0
  13. ; Записать в статус регистрации старое значение или новое 1
  14. .text:004ECE30                 mov     dword_6F1B18, ecx
  15. .text:004ECE36                 jnz     short loc_4ECE70
  16. .text:004ECE38                 mov     ecx, offset unk_6F1C90
  17. .text:004ECE3D                 call    sub_4CA660
Функция проверки достаточно объемная, но в конце все сводится к
  1. ; AL = результат проверки
  2. .text:004E1725                 mov     al, bl
  3. .text:004E1727                 pop     edi
  4. .text:004E1728                 pop     esi
  5. .text:004E1729                 pop     ebx
  6. .text:004E172A                 mov     large fs:0, ecx
  7. .text:004E1731                 mov     esp, ebp
  8. .text:004E1733                 pop     ebp
  9. .text:004E1734                 retn
Заменяем команду MOV AL,BL на MOV AL,1. Размер команды так же два байта, так что с патчем больше ничего мудрить не придется. Сохраняем изменения, запускаем программу. Напоминания о неполной обработке файлов пропали, при выходе из программы ничего постороннего не открывается. Пробуем перекодировать какой-нибудь файл.

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

Опаньки. Обрабатывается только часть файла, затем программа сообщает о необходимости повторить процедуру разлочки или обратиться к автору. Где-то скрывается дополнительная проверка регистрации. Находим строку сообщения, находим место, где она используется.
  1. .text:004E5980 sub_4E5980      proc near
  2. .text:004E5980                 push    30h             ; uType
  3. .text:004E5982                 push    offset aAmazingSlowDow
  4. ; "Amazing Slow Downer"
  5. .text:004E5987                 push    offset aError149Please
  6. ; "Error 149\nPlease redo the complete unl"...
  7. .text:004E598C                 push    [esp+0Ch+hWnd]  ; hWnd
  8. .text:004E5990                 call    ds:MessageBoxW
  9. .text:004E5996                 retn
  10. .text:004E5996 sub_4E5980      endp
Теперь надо определить условия, при которых это сообщение активируется. По первой же перекрестной ссылке попадаем на такую конструкцию:
  1. ; Вызывать функцию проверки
  2. .text:004E4548                 call    sub_4C6150
  3. .text:004E454D                 mov     ecx, [ebp+var_14]
  4. ; Сохранить ее результат в регистре EDX
  5. .text:004E4550                 mov     edx, eax
  6. .text:004E4552                 mov     eax, [ecx+64h]
  7. .text:004E4555                 mov     [ebp+var_38], eax
  8. .text:004E4558                 cmp     edx, 2
  9. .text:004E455B                 jz      loc_4E4753
  10. ; Если EDX=3, то показать сообщение о разлочке
  11. .text:004E4561                 cmp     edx, 3
  12. .text:004E4564                 jz      loc_4E473F
  13. .text:004E456A                 cmp     edx, 1
  14. .text:004E456D                 jnz     short loc_4E457E
  15. .text:004E456F                 cmp     [ebp+arg_10], 2
  16. .text:004E4573                 mov     dl, dl
  17. .text:004E4575                 mov     [ebp+var_E], dl
  18. ...
  19. ...
  20. .text:004E473F loc_4E473F:
  21. .text:004E473F                 push    [ebp+hWnd]      ; hWnd
  22. ; Показать сообщение
  23. .text:004E4742                 call    sub_4E5980
  24. .text:004E4747                 mov     eax, [ebp+arg_0]
  25. .text:004E474A                 add     esp, 4
Смотрим функцию дополнительной проверки:
  1. .text:004C6150                 cmp     byte ptr [ecx+5Ch], 0
  2. .text:004C6154                 push    esi
  3. .text:004C6155                 jz      short loc_4C618C
  4. .text:004C6157                 mov     edx, dword_62F79C
  5. .text:004C615D                 mov     eax, 190h
  6. .text:004C6162                 inc     edx
  7. .text:004C6163                 mov     esi, 12Ch
  8. .text:004C6168                 cmp     dword_5E4B04, 0
  9. .text:004C616F                 mov     dword_62F79C, edx
  10. .text:004C6175                 cmovz   eax, esi
  11. .text:004C6178                 cmp     edx, eax
  12. .text:004C617A                 jbe     short loc_4C618C
  13. .text:004C617C                 cmp     byte_6F6A85, 0
  14. .text:004C6183                 jnz     short loc_4C618C
  15. ; Требуется повторная разлочка
  16. .text:004C6185                 mov     eax, 3
  17. .text:004C618A                 pop     esi
  18. .text:004C618B                 retn
  19. .text:004C618C ; -----------------------------------------------
  20. .text:004C618C loc_4C618C:
  21. .text:004C618C                 mov     eax, [ecx+64h]
  22. .text:004C618F                 mov     esi, 3
  23. .text:004C6194                 inc     eax
Надо сделать так, чтобы функция никогда не вернула результат EAX=3. Просто поставить RET в начало нельзя, так как тут еще проверяется доступность файла и выполняются прочие нужные действия, влияющие на работоспособность программы. Поэтому просто нейтрализуем последний условный переход по адресу 004C6183, заменив его на безусловный JMP. Сохраняем изменения, пробуем обработать файл.

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

В этот раз файл обрабатывается без каких-либо ограничений. Цель достигнута. В патченном варианте программа становится портативной и прекрасно запускается с флешки.

Поделиться ссылкой ВКонтакте
Просмотров: 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
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.

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

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

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