Blog. Just Blog

Исследование защиты программы Dream MKV to AVI Converter

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

Понадобилось мне тут сконвертировать пару файлов из формата MKV в обычный AVI, но, как ни странно, подходящего инструментария под рукой не нашлось. Есть куча видеоконвертеров, но поддержки MKV в них не было. Гуглояндексы любезно подсказали мне первой же ссылкой программу Dream MKV to AVI Converter. Все бы ничего, но вдруг оказалось, что она требует денег. Пришлось в срочном порядке исправлять это досадное недоразумение.

Итак, скачиваем дистрибутив, устанавливаем, запускаем. В заголовке программы видим строчку "Unregistered". А на ввод неправильных регистрационных данных программа реагирует вот таким сообщением:

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

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

Строка сообщения в языковом файле
Строка сообщения в языковом файле

Интересно, что же все-таки побуждает разработчиков запихивать какие-то свои данные в файлы с именами системных библиотек? Если ради спортивного интереса пробежаться по другим dll-файлам в папке с программой, то найдется еще пара-тройка таких же переименованных файлов, не имеющих никакого отношения к PE-формату. Мудачество AS IS. Но сейчас нас интересует строка "Register_Failed", которой соответствует текст сообщения. Очевидно, что она используется для запроса соответствующих данных из XML-файла, и вот эта строка легко обнаруживается в главном исполняемом файле:

Строка в файле
Строка в файле

Переходим к дизассемблеру, чтобы посмотреть, где и каким образом эта строка используется.
  1. .text:007A2028                 call    sub_4E82C4
  2. .text:007A202D                 mov     eax, [ebp+var_40]
  3. .text:007A2030                 lea     edx, [ebp+var_3C]
  4. .text:007A2033                 call    sub_416A34
  5. ; Указатель на первую строку
  6. .text:007A2038                 mov     edx, [ebp+var_3C]
  7. ; Указатель на вторую строку
  8. .text:007A203B                 mov     eax, [ebp+var_C]
  9. ; Вызвать функцию сравнения двух строк
  10. .text:007A203E                 call    sub_408A0C
  11. ; Если строки не равны, то вывести сообщение о неправильной регистрации
  12. .text:007A2043                 jnz     short loc_7A209A
  13. .text:007A2045                 lea     eax, [ebp+var_44]
  14. .text:007A2048                 push    eax
  15. .text:007A2049                 lea     edx, [ebp+var_50]
  16. .text:007A204C                 mov     eax, [ebp+var_10]
  17. .text:007A204F                 mov     eax, [eax+39Ch]
  18. .text:007A2055                 call    sub_4E82C4
  19. .text:007A205A                 mov     eax, [ebp+var_50]
  20. .text:007A205D                 mov     [ebp+var_4C], eax
  21. .text:007A2060                 mov     [ebp+var_48], 11h
  22. .text:007A2064                 lea     eax, [ebp+var_4C]
  23. .text:007A2067                 push    eax
  24. .text:007A2068                 lea     edx, [ebp+var_54]
  25. .text:007A206B                 mov     eax, offset off_7A2200
  26. .text:007A2070                 call    sub_5F71E0
  27. .text:007A2075                 mov     eax, [ebp+var_54]
  28. .text:007A2078                 xor     ecx, ecx
  29. .text:007A207A                 pop     edx
  30. .text:007A207B                 call    sub_418BAC
  31. .text:007A2080                 mov     eax, [ebp+var_44]
  32. .text:007A2083                 mov     edx, [ebp+var_10]
  33. .text:007A2086                 call    sub_64B0FC
  34. .text:007A208B                 mov     eax, [ebp+var_10]
  35. .text:007A208E                 mov     dword ptr [eax+2B8h], 1
  36. .text:007A2098                 jmp     short loc_7A20B2
  37. .text:007A209A ; --------------------------------------
  38. .text:007A209A loc_7A209A:
  39. .text:007A209A                 lea     edx, [ebp+var_58]
  40. ; Вывести сообщение о неправильной регистрации
  41. .text:007A209D                 mov     eax, offset aRegister_faile
  42. ; "Register_Failed"
  43. .text:007A20A2                 call    sub_5F71E0
  44. .text:007A20A7                 mov     eax, [ebp+var_58]
  45. .text:007A20AA                 mov     edx, [ebp+var_10]
  46. .text:007A20AD                 call    sub_64B0FC
Как же мне нравятся такие конструкции! Берем две строчки, сравниваем, по результатам выводим сообщение о неправильной регистрации. Перед сравнением, очевидно, идет вычисление серийного номера на основании введенного регистрационного email'а. Если интересно, то можно туда заглянуть, но длина кода и обилие вызовов каких-то вспомогательных функций начисто отбивают охоту там ковыряться. Проще воспользоваться отладчиком. Загружаем главный исполняемый файл в OllyDbg, ставим точку останова по адресу 007A203E и запускаем на выполнение. Дальше пробуем зарегистрироваться с любым неправильным серийником. В момент срабатывания точки останова в регистрах EDX и EAX будут следующие данные:

Указатели на строки в регистрах
Указатели на строки в регистрах

Это не что иное, как введенный неправильный серийник и строка, с которой он сравнивается, то есть тоже серийник, только правильный. Копируем правильный серийник, снимаем программу с останова и тут же повторяем регистрацию, но уже с найденной строкой. Повторно стопаримся на точке останова, убеждаемся, что теперь оба регистра ссылаются на одинаковые строки, и получаем полностью зарегистрированную программу:

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

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

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

Осталось проверить программу в работе. Никаких водяных знаков на видео не накладывается, ограничений по обработке видео тоже нет, значит цель достигнута. Сама программа, конечно, далека до идеала, с кучей ошибок, но худо-бедно с поставленной задачей справилась. Нужные мне файлы были успешно отконвертированы.

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

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Sergey (08.12.2015 в 20:01):
Отличная программа MediaCoder. Раньше была полностью бесплатной, потом появилась платная, а в бесплатной установили несколько ограничений - не работает с более чем 12 мегабит/с битрейтом и еще что-то - здесь указано mediacoderhq.com/premium
Для твоей задачи, вполне может подойти и бесплатная. Это скорее оболочка над кучей opensource-программ, но практически все программы такие. Может обрезать, настраивать битрейт и прочее, а если еще залезть глубже - то и менять тонкие настройки в кодеках.

Либо FormatFactory посмотри.
KaktusTV (12.10.2015 в 11:12):
ЦитатаЯ реально не могу понять разработчиков...

Логично, однако таких разработчиков, на мой взгляд, надо всячески холить, лелеять и поддерживать! Их так мало осталось... Все так и норовят какой-нибудь VMProt навесить, гады...
voffka (12.10.2015 в 09:09):
brute, OllyCopy 0.3 от iLovro
ManHunter (08.10.2015 в 10:38):
Правый мыш на регистре -> Follow in Dump.
Правый мыш на дампе, в меню можно выбрать режим отображения данных. А потом прямо там скопировать серийник и вставить в блокнотик.
Как-то так.
brute (08.10.2015 в 09:39):
ManHunter, самое сложное в этой проге - скопировать значение дампа (на который указывает eax) с правильной строкой - чтобы в ручную не набирать. Как скопировал? Я юзал "ScreenshotReader". Может, в Оле есть такие плагины/вкладки?
Медведь-хохотун (06.10.2015 в 14:19):
Avidemux - отличная вещь
ManHunter (06.10.2015 в 14:04):
DRON, спасибо за строчку с параметрами, пригодится. Задача не ежедневная, но мало ли, вдруг опять понадобится.
DRON (06.10.2015 в 13:30):
Я раньше тоже использовал кучу всяких "Ужа_в_Ежа Converter", но потом разобрался с ffmpeg. Там конечно надо курить полутораметровый мануал, но зато все настройки в виде ком-строки и их можно использовать повторно.
В любом случае, у половины этих "конвертеров" под капотом всё тот же ffmpeg и добавлять к нему GUI-багодром смысла не вижу.
Что-угодно в AVI делается как-то так:
ffmpeg -i "file.mkv" -c:v libxvid -vtag xvid -qscale:v 3 -c:a libmp3lame -qscale:a 9 "file.avi"
Muhh -Fly (06.10.2015 в 11:49):
Беда, что зачастую "хочу много денег" программы кривее фришных.
Но при отсутствии времени и тем более специфических знаний проще найти заломанный продукт, коих мягко говоря много.
Например запустил 5 сек. поиск в Гугле:
Bigasoft MKV Converter 3.7.50.5067 [Multi/Ru] - с кряком
http://nnm-club.me/forum/viewt...php?t=726931
и или подобное.
Приятно читать заметки адекватного программиста, продолжай!
ManHunter (06.10.2015 в 08:25):
Может быть и хорошие, только мне надо было не создавать MKV, а из матрешки сделать нормальный человеческий AVI.
brute (06.10.2015 в 07:08):
хорошие проги:
mkvtoolnix, AVI MP4 Converter, Aiseesoft Total Media Converter.

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

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

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