Blog. Just Blog

Исследование защиты программы DLNow Video Downloader

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

DLNow Video Downloader - платная надстройка над бесплатными инструментами для загрузки видео с множества популярных видеохостингов и конвертирования их в разные форматы. Как это принято среди аффтаров подобных поделий, никаких благодарностей разработчикам бесплатных инструментов они не выражают, придется сделать это самому. Итак, за существование DLNow Video Downloader объявляется благодарность RTMPDump, FFmpeg и youtube-dl. А вот аффтара самой программы за подобные косяки мы сейчас будем опускать на денежку.

Забираем с сайта дистрибутив, устанавливаем, запускаем. Первым делом нас встречает окно ввода серийного номера.

Окно регистрации
Окно регистрации

После ввода серийного номера программа лезет проверять его на свой сервер. Если закрыть доступ фаерволом, то получим сообщение об ошибке.

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

Другое сообщение об ошибке мы получим после ввода левого серийника. Алгоритм генерации, как и алгоритм проверки, мы не знаем, все находится на сервере разработчика. Но можно попробовать сделать так, чтобы программа любой ответ от сервера приняла как корректный. Мы знаем строку сообщения, которое появляется при неправильном ключе. Исполняемый файл ничем не упакован, отправляем его на дизассемблирование и поищем строчку в файле:

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

Теперь обратимся к листингу. Нас интересует участок кода, где эта строка используется. Вот он:
  1. .text:004120ED                 mov     esi, ds:lstrcmpA
  2. .text:004120F3                 lea     eax, [ebp-3D8h]
  3. ; Сравнить полученный результат со строкой "ok"
  4. .text:004120F9                 push    offset aOk_0    ; "ok"
  5. .text:004120FE                 push    eax             ; lpString1
  6. .text:004120FF                 call    esi ; lstrcmpA
  7. .text:00412101                 test    eax, eax
  8. ; Если не равно, то перейти дальше
  9. .text:00412103                 jnz     short loc_41217C
  10. ...
  11. ...
  12. ...
  13. ; Ключ не найден или лицензия уже просрочена
  14. .text:0041217C loc_41217C:
  15. .text:0041217C                 push    offset aKeyNotFound ; "key not found"
  16. .text:00412181                 lea     eax, [ebp-3D8h]
  17. .text:00412187                 push    eax             ; lpString1
  18. .text:00412188                 call    esi ; lstrcmpA
  19. .text:0041218A                 test    eax, eax
  20. .text:0041218C                 jz      loc_412350
  21. .text:00412192                 push    offset aLicenseExpired ; "license expired"
  22. .text:00412197                 lea     eax, [ebp-3D8h]
  23. .text:0041219D                 push    eax             ; lpString1
  24. .text:0041219E                 call    esi ; lstrcmpA
  25. .text:004121A0                 test    eax, eax
  26. .text:004121A2                 jz      loc_412350
  27. ...
  28. ...
  29. ...
  30. .text:00412350 loc_412350:
  31. .text:00412350                 mov     ecx, dword_437654
  32. .text:00412356                 push    offset aThisIsNotAVali
  33. ; "This is not a valid license key."
  34. .text:0041235B                 call    sub_40F550
Строка, полученная из ответа сервера, сравнивается со строкой "ok". Если совпало, то серийник считается правильным и программа переходит в активированный режим. Если это не так, то выводится знакомое сообщение. Чтобы программа воспринимала любой ответ сервера как корректный, надо просто заNOPить условный переход по адресу 00412103. Делаем резервную копию оригинального файла, сохраняем изменения, запускаем программу и пробуем активировать ее любым серийником.

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

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

В строке с параметрами, которая отправляется серверному активатору, одним из значений является какой-то идентификатор. Можно предположить, что при активации выполняется привязка к компьютеру (UPD: я проверил, это действительно так). Если мы хотим, чтобы программа работала, например, с флешки и на любом компьютере, то придется ее патчить. В качестве зацепки для поиска триала лучше всего воспользоваться строчкой, которая дописывается в заголовок незарегистрированной версии. Поищем строчку "Trial" в файле:

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

По перекрестным ссылкам в листинге дизассемблера переходим на следующий код:
  1. .text:00412718                 lea     ecx, [ecx+edi*2]
  2. .text:0041271B                 call    sub_4011D0
  3. .text:00412720 loc_412720:
  4. .text:00412720                 push    offset aTrial   ; "Trial"
  5. .text:00412725                 mov     ecx, ebx
  6. .text:00412727                 call    sub_40F550
  7. .text:0041272C                 mov     edi, eax
  8. .text:0041272E                 lea     ecx, [ebp+String]
  9. .text:00412734                 mov     edx, esi
Тут ничего интересного, листаем выше. А выше будет формирование строки о количестве оставшихся дней пробного периода. Пролистываем все это, пока не доберемся до вот такой строчки:
  1. .text:004125F0                 cmp     dword_436794, 0
  2. .text:004125F7                 jz      loc_412840
На этом этапе выполняется проверка значения переменной по фиксированному адресу, после чего при выполнении условия перепрыгивается вся свистопляска с формированием триального заголовка. Похоже, что именно это нам и надо. Давайте посмотрим, что же находится в dword_436794 и где это значение меняется. Переходим по перекрестной ссылке и что же мы видим?
  1. .data:00436794 dword_436794    dd 1
Это забитое гвоздями начальное значение, сигнализирующее, что программа должна работать в триальном режиме. Все действия, связанные с этой ячейкой памяти - это или проверки ее значения, или в одном месте запись в нее нулевого значения (успешная регистрация). Внимание вопрос. А почему бы нам с самого начала не убедить программу, что она уже активирована и должна работать в полную силу? Для этого заменяем значение DWORD по адресу 00436794 с 1 на 0. Сохраняем изменения.

Триальная надпись в заголовке программы исчезла, окно ввода серийника не появляется, кнопка активации в интерфейсе главного окна пропала. При переводе системных часов на пару месяцев вперед ничего страшного не происходит. Цель достигнута. Защита нейтрализована одним байтом, а точнее даже одним битом.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 749 | Комментариев: 7

Комментарии

Отзывы посетителей сайта о статье
ManHunter (20.09.2018 в 10:42):
Да было б за что :)
Алексей (14.09.2018 в 19:18):
Надо будет попробовать её в деле.. А то я качал постоянно 4K Video Downloader но версия у меня уже старенькая... А эта всё как не как поновее будет. Спасибо ManHunter.
ManHunter (07.09.2018 в 11:52):
Добавил в статью подмену активации. И да, там действительно привязка к железу.
wet (07.09.2018 в 06:21):
ЦитатаЕсли убедить программу, что строки равны при любых раскладах, она активируется и можно будет даже обновлять.

А если обновлённая программа больше не проверяет ни какие ключи на сервере, а только регистрацию в реестре, то значит можно REG файл сделать на все времена? Будет ли от одинаков для разных компьютеров?
ManHunter (06.09.2018 в 23:26):
Зато в патченном виде она прекрасно будет жить на флешке без необходимости активировать на каждом компе :)
pawel97 (06.09.2018 в 23:00):
"Активация нам ничем не поможет"
Ещё как поможет. Разбирал я её, там строка с сервера сравнивается со строкой "ok". Если убедить программу, что строки равны при любых раскладах, она активируется и можно будет даже обновлять.
Есть бесплатный youtube-dl gui, кстати (что статья не о том - знаю).
wet (06.09.2018 в 20:19):
Оригинальное решение. Ведь кто-то же заморочился с проверкой на сервере, придумал, как им казалось, крутую защиту :)
А тут 1 байт бабах... Спасибо

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

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

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