Исследование защиты программы MIDI Workplace
Скриншот программы MIDI Workplace
Программа MIDI Workplace от xTau предназначена для конвертирования MIDI-файлов в формат MP3 или WAV. Ну и по мелочи всякого, типа посмотреть список инструментов или просто прослушать MIDI. На офсайте по какой-то причине ее давно нет, да и сам сайт какой-то полуживой. Купить программу уже не получится, даже если вам сильно захочется это сделать, но в незарегистрированном состоянии она обрабатывает не более 30 секунд каждого файла. Будем лечить, ничего не поделаешь.
Забираем дистрибутив с файлообменника, устанавливаем, смотрим. Главный исполняемый файл имеет совсем небольшой размер, к тому же ничем не упакован. Отправляем его сразу же на разбор в дизассемблер.
Сообщение о неправильной регистрации
После запуска сразу же появляется триальное окно с предложением оплатить, ввести регистрационные данные или продолжить работу. На ввод левых регистрационных данных программа реагирует сообщением "Invalid RegCode". Посмотрим в листинге где и как это сообщение проявляется.
Code (Assembler) : Убрать нумерацию
- .text:0040848F push 1Fh ; cchMax
- ; Получить из полей ввода регистрационное имя и серийник
- .text:00408491 push offset byte_42A540 ; lpString
- .text:00408496 push 66h ; nIDDlgItem
- .text:00408498 mov edx, [ebp+hDlg]
- .text:0040849B push edx ; hDlg
- .text:0040849C call ds:GetDlgItemTextA
- .text:004084A2 push 1Fh ; cchMax
- .text:004084A4 push offset ReturnedString ; lpString
- .text:004084A9 push 67h ; nIDDlgItem
- .text:004084AB mov eax, [ebp+hDlg]
- .text:004084AE push eax ; hDlg
- .text:004084AF call ds:GetDlgItemTextA
- .text:004084B5 push offset ReturnedString ; Str
- .text:004084BA push offset byte_42A540 ; int
- ; Вызывать функцию проверки регистрации
- .text:004084BF call sub_408840
- .text:004084C4 add esp, 8
- .text:004084C7 test eax, eax
- ; Если результат EAX=0, то регистрация неправильная
- .text:004084C9 jz short loc_40850A
- .text:004084CB push offset byte_42A540
- .text:004084D0 push offset aThankYouForReg
- ; "Thank you for registration!\nRegistered "...
- .text:004084D5 mov ecx, lpString
- .text:004084DB push ecx ; Dest
- .text:004084DC call _sprintf
- .text:004084E1 add esp, 0Ch
- .text:004084E4 push 40h ; uType
- .text:004084E6 push offset Caption ; "MIDI Workplace v1.0"
- .text:004084EB mov edx, lpString
- .text:004084F1 push edx ; lpText
- .text:004084F2 mov eax, [ebp+hDlg]
- .text:004084F5 push eax ; hWnd
- .text:004084F6 call ds:MessageBoxA
- .text:004084FC push 1 ; nResult
- .text:004084FE mov ecx, [ebp+hDlg]
- .text:00408501 push ecx ; hDlg
- .text:00408502 call ds:EndDialog
- .text:00408508 jmp short loc_408520
- .text:0040850A ; ---------------------------------------
- .text:0040850A loc_40850A:
- .text:0040850A push 30h ; uType
- .text:0040850C push offset aMidiWorkplac_0
- ; "MIDI Workplace v1.0"
- .text:00408511 push offset Text
- ; "Invalid RegCode !"
- .text:00408516 mov edx, [ebp+hDlg]
- .text:00408519 push edx ; hWnd
- .text:0040851A call ds:MessageBoxA
- .text:00408520
Code (Assembler) : Убрать нумерацию
- .text:00408840 sub_408840 proc near
- .text:00408840 var_C = dword ptr -0Ch
- .text:00408840 var_8 = dword ptr -8
- .text:00408840 var_4 = dword ptr -4
- .text:00408840 Str = dword ptr 0Ch
- .text:00408840
- .text:00408840 push ebp
- .text:00408841 mov ebp, esp
- .text:00408843 sub esp, 0Ch
- ; Сразу установить результат проверки = "неправильная регистрация"
- .text:00408846 mov [ebp+var_4], 0
- .text:0040884D mov eax, [ebp+Str]
- .text:00408850 push eax ; Str
- ; Выяснить длину серийника
- .text:00408851 call _strlen
- .text:00408856 add esp, 4
- ; Длина равна 1C байт (28 в десятичной системе)?
- .text:00408859 cmp eax, 1Ch
- ; Да, переходим к следующим проверкам
- .text:0040885C jz short loc_408866
- ; Записать в EAX результат проверки и вернуться
- .text:0040885E mov eax, [ebp+var_4]
- .text:00408861 jmp loc_40891F
- .text:00408866 ; ---------------------------------------
- .text:00408866 loc_408866:
- .text:00408866 push 20h ; Size
- .text:00408868 push 0 ; Val
- .text:0040886A push offset unk_42A3F0 ; Dst
- .text:0040886F call _memset
- .text:00408874 add esp, 0Ch
- .text:00408877 push 19h ; Size
- .text:00408879 mov ecx, [ebp+Str]
- .text:0040887C push ecx ; Src
- .text:0040887D push offset unk_42A3F0 ; Dst
- .text:00408882 call _memcpy
- .text:00408887 add esp, 0Ch
- .text:0040888A push offset unk_42A430
- .text:0040888F push 20h
- .text:00408891 push offset unk_42A3F0
- .text:00408896 call sub_40CC60
- .text:0040889B push 40h ; Size
- .text:0040889D push offset unk_42A430 ; Src
- .text:004088A2 push offset dword_42A3B0 ; Dst
- .text:004088A7 call _memcpy
- .text:004088AC add esp, 0Ch
- .text:004088AF mov [ebp+var_C], 0
- .text:004088B6 mov [ebp+var_8], 0
- .text:004088BD jmp short loc_4088C8
- .text:004088BF ; ---------------------------------------
- .text:004088BF loc_4088BF:
- .text:004088BF mov edx, [ebp+var_8]
- .text:004088C2 add edx, 1
- .text:004088C5 mov [ebp+var_8], edx
- .text:004088C8 loc_4088C8:
- .text:004088C8 cmp [ebp+var_8], 10h
- .text:004088CC jge short loc_4088E0
- .text:004088CE mov eax, [ebp+var_8]
- .text:004088D1 mov ecx, [ebp+var_C]
- .text:004088D4 add ecx, dword_42A3B0[eax*4]
- .text:004088DB mov [ebp+var_C], ecx
- .text:004088DE jmp short loc_4088BF
- .text:004088E0 ; ---------------------------------------
- .text:004088E0 loc_4088E0:
- .text:004088E0 mov [ebp+var_8], 0
- .text:004088E7 jmp short loc_4088F2
- .text:004088E9 ; ---------------------------------------
- .text:004088E9 loc_4088E9:
- .text:004088E9 mov edx, [ebp+var_8]
- .text:004088EC add edx, 1
- .text:004088EF mov [ebp+var_8], edx
- .text:004088F2 loc_4088F2:
- .text:004088F2 cmp [ebp+var_8], 400h
- .text:004088F9 jge short loc_408913
- .text:004088FB mov eax, [ebp+var_8]
- .text:004088FE mov ecx, dword_424088[eax*4]
- .text:00408905 cmp ecx, [ebp+var_C]
- .text:00408908 jnz short loc_408911
- ; Установить результат проверки = "регистрация правильная"
- .text:0040890A mov [ebp+var_4], 1
- .text:00408911 loc_408911:
- .text:00408911 jmp short loc_4088E9
- .text:00408913 ; ---------------------------------------
- .text:00408913 loc_408913:
- ; Записать в EDX результат проверки
- .text:00408913 mov edx, [ebp+var_4]
- ; Записать результат из EDX в переменную-флаг
- .text:00408916 mov dword_42A474, edx
- ; Записать результат проверки в EAX
- .text:0040891C mov eax, [ebp+var_4]
- .text:0040891F loc_40891F:
- .text:0040891F mov esp, ebp
- .text:00408921 pop ebp
- .text:00408922 retn
- .text:00408922 sub_408840 endp
Введенные регистрационные данные, даже неправильные, записываются в файл конфигурации settings.ini, поэтому сперва регистрируем какой-нибудь произвольной информацией, а только потом патчим. Вот что получается.
Программа успешно "зарегистрирована"
Ограничения по функционалу сняты, триальные окна при старте и кнопки регистрации в интерфейсе исчезли, в окне "О программе" отображается введенное ранее регистрационное имя, цель достигнута.
Просмотров: 1194 | Комментариев: 3
Метки: исследование защиты, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
user
(07.03.2024 в 12:55):
Аа, понятно.
ManHunter
(07.03.2024 в 12:55):
Ссылка начинается с "http://" или "https://" или "ftp://", а это просто длинная строка, которая в принудительном порядке нарезается на куски.
http://old-dos.ru/index.php?pa...ow&id=103713
http://old-dos.ru/index.php?pa...ow&id=103713
user
(07.03.2024 в 12:24):
MIDI Workplace 1.1.2
MIDI Workplace 2.0.0
old-dos.ru/index.php?page=files&mode=files&do=show&id=1037 13
Пробел в последнем числе пути нужно удалить.
Это специально пути коверкаются?
MIDI Workplace 2.0.0
old-dos.ru/index.php?page=files&mode=files&do=show&id=1037 13
Пробел в последнем числе пути нужно удалить.
Это специально пути коверкаются?
Добавить комментарий
Заполните форму для добавления комментария