Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

articles:dvd-disarm [2017/09/05 02:55] (текущий)
Строка 1: Строка 1:
 +====== DVD-disarm ======
 +<​sub>​{{DVD-disarm.odt|Original file}}</​sub>​
 +
 +====== вооружение и разоружение DVD-проигрывателей\\ или взгляд на линух из подвала китайца Ляо ======
 +
 +крис касперски ака мыщъх, a.k.a. nezumi, a.k.a. souriz, no-email
 +
 +**часть людей предпочитает смотреть видео на компьютере,​ часть — использует для этой цели автономные ****DVD-****проигрыватели главным недостатком которых является плохая поддержка "​левых"​ ****MPEG4****-форматов. народ во всю потрошит прошивки,​ но заснуть в аппарат новую версию кодека — задача,​ прямо скажем,​ не тривиальная. но знание никсов дает нам сто очков вперед.**
 +
 +===== введение =====
 +
 +Поклонники автономных DVD-проигрывателей приводят множество аргументов в их защиту:​ начиная от того, что видео удобнее всего смотреть развалившись на диване перед большим экраном и заканчивая тем, что домашние больше не домогаются до компьютера и потому покупка DVD высвобождает кучу машинного времени,​ которое теперь можно расходовать в наших хакерских целях.
 +
 +Как же! Диски, купленные в соседнем ларьке или переписанные у подруги,​ обычно либо не опознаются вообще,​ либо воспроизводятся с кучей артефактов,​ сотрясая экран в ужасных конвульсиях. Вот и приходится вновь возвращаться к компьютеру (установка свежего кодека на который — не проблема) или осваивать азы нелинейного видео-монтажа,​ занимаясь цифровым ремастерингом,​ перезаписывая фильмы в правильном формате на DVD-болванку. Но это не есть хакерский путь.
 +
 +Чтобы покончить с проблемами раз и навсегда необходимо исправить ошибки производителя непосредственно в самом плеере. Иногда это удается сделать просто обновив прошивку,​ скаченную с официального сайта или позаимствованную у сотрудников сервис-центра,​ но гарантий,​ что она действительно исправит ситуацию — нет никаких. Конечно,​ самостоятельная трепанация прошивок — занятие не для слабонервных и это дело требует как знания кучи ассемблеров,​ так и умения держать паяльник в руках. Во всяком случае,​ объяснять что такое программатор и где его достать мыщъх не собирается. Предполагается,​ что читатель уже имеет опыт модификации прошивок различных устройств и уже давно миновал стадию смены логотипов,​ русификации меню, etc. Если же нет, рекомендую обратится к книге креативного хакера с острова Ява PINCKZACCO — "BIOS: дизассемблирование,​ модификация,​ программирование",​ в которой все это подробно описано.
 +
 +Естественно,​ далеко не каждый DVD-плеер может быть хакунт и пофиксен. Тут все зависит от того какой процент операций декодирования выполняется программно,​ а какой аппаратно. И хотя даже чисто аппаратные декодеры допускают возможность установки программных "​фильтров",​ обрабатывающих сжатые данные на различных стадиях декодирования и потому (теоретически) способные исправлять любые ошибки и "​осиливать"​ новые форматы. Практически же все зависит от мощности видеопроцессора,​ которая обычно выбирается с минимальным запасом.
 +
 +Программные декодеры,​ собранные на базе RISC-процессоров,​ в этом смысле намного более предпочтительны для хакерства,​ поскольку одну программную реализацию кодека ничего не стоит заменить на другую. Хотя и здесь возможны свои нюансы. Например,​ если дешевый DVD-плеер не поддерживает функции Global Motion Compensation,​ появившейся в MPEG4, поскольку у него физически не хватает мощности,​ то даже если мы засунем прошивку с GMC, то работать она будет лишь с дисками,​ записанными в низком разрешении на малых битрейтах. А по мере роста разрешения/​битрейта процессор просто не будет успевать декодировать данные и тогда ему придется либо тормозить со страшной силой, либо дропать кадры. Кстати,​ умение _правильно_ дропать кадры, не теряя при этом синхронизации со звуком,​ присуще далеко не всем проигрывателям,​ но оно по крайней мере лечится доработкой прошивки.
 +
 +===== внутри коробки =====
 +
 +Схемотехнические построения DVD-плееров настолько многообразны,​ что не поддаются никакому учету. В зависимости от степени интеграции компонентой базы, сердцем проигрывателя может быть как одна мега-микросхема,​ так и несколько независимых процессоров. Последнее решение встречается намного чаще и обычно на плате можно найти как минимум один управляющий микроконтроллер и видеопроцессор,​ обеспечивающий аппаратное декодирование MPEG1/​MPEG2(MPEG4). Аудио-процессор может быть как частью видеопроцессора,​ так и автономной микросхемой.
 +
 +Прошивки,​ которыми поставляются в сервис-центры и которые заливаются на плеер через DVD-диск или путем непосредствен него подключения специального шнура к плате, относятся (за редкими исключениями) именно к микроконтроллеру,​ управляющего всеми узлами плеера,​ но в процессе декодирования никак не участвующего. Во-первых,​ для этого у него недостаточно мощности,​ а, во-вторых,​ поток декодированных данных идет в обход него и он имеет к ним лишь косвенный доступ,​ достаточный для наложения текста субтитров на изображение,​ но не более того.
 +
 +Основная обработка совершатся именно в видеопроцессоре,​ построенном на базе RISC-процессора,​ обрабатывающего микрокод,​ который может быть записан как в самом видеопроцессоре,​ так и расположен во внешней перепрограммируемой микросхеме. Последний случай кажется весьма соблазнительным для хакерства. Действительно,​ чисто аппаратных MPEG декодеров нет ни у кого (и никогда не будет) и потому добавление новых кодеков не должно вызвать непреодолимых проблем,​ во всяком случае,​ если плеер уже поддерживает хотя бы какую-то разновидность MPEG4, то у него хватит сил поддержать и остальные,​ пускай и не без оговорок по битрейту и прочим фишкам типа GMC, упирающихся в мощность процессора.
 +
 +Практически же, RISC ядро поддерживает ни с чем не совместимый и абсолютно недокументированный набор команд,​ под которого нет ни дизассемблеров,​ ни трансляторов. Даже если за основу взято ядро популярного процессора,​ набор команд все равно существенно изменен с целью оптимизации под конкретную задачу. В частности,​ поддержка цветового пространства YUV12, где на каждый канал отводится по 12 бит, обуславливает появление команд,​ работающих с 12-битными данными. Увы, видеопроцессор — вещь в себе и его микрокод является собственностью производителя.
 +
 +А где же тут Linux спрашивается?​! Linux уже на подходе. Немного терпения. Китайцы,​ как известно,​ дерут все, до чего только им удается дотянуться и no-name DVD-плеер,​ собранный безымянным китайцем по имени Ляо, при ближайшем рассмотрении,​ очень часто оказывается плохой копией хорошего японского плеера. Содрать чужое (и при том лучше) — экономически выгоднее,​ чем разрабатывать это самому с нуля. Но драть нужно тоже с умом, выкидывая максимум деталей и заменяя дорогие комплектующие их дешевыми аналогами.
 +
 +Завышенная цена на продукцию ведущих фирм не в последнюю очередь связана с необходимостью выплаты лицензионных отчислений отцам-основателям поприетарных видео/​аудио форматов и потому,​ чем больше форматов поддерживает аппарат,​ тем он дороже. И самым дорогим узлом оказывается именно видео/​аудио-процессор,​ в стоимость которого уже включены все отчисления. И какой же китаец в здравом уме и твердой памяти будет закупать видеопроцессоры,​ особенно если их ему не продают,​ поскольку они разработаны непосредственно самим производителем плеера,​ ну или субподрядчиком,​ работающем на производителя по спец. заказу.
 +
 +Содрать же видеопроцессор и самому изготовить точно такой же — технически возможно,​ но… только в условиях крупной лаборатории. Подвалы и гаражи для этого никак не катят. Однозначно не катят. И все же китайцы как-то их передирают. Как?! А очень просто. Они кладут известный орган на неизвестное RISC-ядро и вместо того, чтобы послойно раздербанивать микросхему на сканирующем электронном микроскопе — копируют достаточно хорошо документированный интерфейс видеопроцессора с внешним миром.
 +
 +{{dvd-disarm_Image_0.png?​553}}
 +
 +Рисунок 1 так выглядит RISC-процессор ARM9 от ATMEL, часто используемого в качестве программного декодера в DVD-проигрывателях
 +
 +При этом очень часто они используют широко распространенный RISC-процессор (например,​ ARM) и… открытую библиотеку FFmpeg, для поддержания работоспособности которой в прошивку впендюривается урезанное до безобразия ядро Linux'​а или NetBSD, а точнее даже малая часть ядра. Как минимум потребуется аллокатор — то есть набор функций для работы с динамической памятью. Компилируется все это дело, естественно,​ с помощью GCC, причем,​ в библиотеку FFmpeg вносится минимум изменений. Китайцы тоже не дураки и при "​заимствовании"​ новой версии FFmpeg повторять работу по ее адаптации с нуля — какой им резон? Они же ни от кого не шифруются. И на все юридические проблемы лицензирования плюют с Тянь-Шаня. Конечно,​ это только no-name плюют. А как только Ляо выбирается из темных подвалов в устремившиеся вверх небоскребы — вот тут уже выгоднее становится вставлять в плеер аппаратные декодеры от сторонних производителей,​ чем реализовать их на коленках самостоятельно.
 +
 +{{dvd-disarm_Image_1.png?​545}}
 +
 +Рисунок 2 IDA Pro дизассемблирует код прошивки,​ предназначенной для ARM
 +
 +Короче,​ хачить брэндовые проигрыватели — бесперспективно и для полного счастья нам не хватает только DVD с чисто программным декодером. По каким признакам его можно отличить от остальных?​ Первое — это большое количество поддерживаемых аудио/​видео-форматов,​ перечень которых коррелирует с послужным списком библиотеки FFmpeg. Проигрыватели,​ понимающие только MPEG1/​MPEG2 – явно не наш клиент и идут лесом. Второе – сняв крышку (а ее все таки придется снять),​ мы должны обнаружить достаточно мощный RISC-процессор (ARM7 с крейсерской скоростью в 56 MHz может быть только управленцем,​ но никак не декодером,​ а вот ARM9 200 MHz уже может декодировать MPEG4, записанный без наворотов),​ характерную микросхему перепрограммируемой памяти рядом с ним и необычно большое количество буферных ОЗУ — "​необычно большое"​ для аппаратных декодеров. Собственно говоря,​ именно буферные ОЗУ и позволяют отличить управляющий микроконтроллер от программного видеодекодера.
 +
 +{{dvd-disarm_Image_2.png?​553}}
 +
 +Рисунок 3 здесь,​ на сайте http://​ffmpeg.mplayerhq.hu/​ всегда можно скачать последнюю версию библиотеки FFMPEG
 +
 +Чтобы не маньячить прямо в магазине (где вскрывать крышку нам все равно не дадут),​ необходимо заранее изучить доступный модельный ряд и нарыть необходимую информацию в Интернете. Если повезет — мы откопаем не только фотографии платы, но еще и принципиальную схему, которая,​ впрочем,​ необязательна. Как вариант — можно приобрести поддержанный DVD с рук у приятеля или, натянув сапоги,​ совершить набег на любой более-менее приличный радиорынок,​ где продавцы в курсе темы и знают товар, который они продают. Собственно говоря,​ no-name продукция распространяется преимущественно через рынки. В салонах бытовой техники ее можно встретить только с перепугу. Оно и понятно. Салоны предпочитают брать продукцию фирм, имеющих развитую сеть сервисных центров,​ обеспечивающих хотя бы гарантийный ремонт.
 +
 +Конечно,​ качество у no-name продукции не ахи и радости от того, что хакнутый плеер будет воспринимать все форматы… Ну о какой радости можно говорить,​ если звук — отстой,​ изображение — гадость… Но тут все не так однозначно. Заплатив за качество брендовых проигрывателей,​ мы все равно не продвинемся дальше гадости,​ особенно если речь идет о пережатых MPEG4 дисках со звуком в MP3. Писать же MPEG4 с малым сжатием и оригинальным многоканальным звуком — смысла нет, ибо по размеру получится тот же самый DVD, да и сами DVD, продающиеся на российских просторах,​ обычно получены из каких-то левых источников,​ даже если они с понтом типа лицензионных.
 +
 +Качественное видео/​звук и плеер с поддержкой MPEG4 не совместимы по определению. Если так уж важно качество,​ то достаточно прибрести любой приличных DVD проигрыватель из серии MPEG1/MPEG2 only. Если же мы хотим поэкспериментировать – берем no-name DVD с программным декодером и хакаем прошивку по полной программе,​ добавляя туда новые кодеки,​ чем мы собственно сейчас и будем заниматься.
 +
 +===== мочим прошивку =====
 +
 +Микрокод программных видео декодеров особой оригинальностью не отличается. Прошивка,​ как правило,​ упакована. Сначала управление передается на неупакованный boot-блок (расположенный в самом конце дампа),​ который выполняет некоторую первичную диагностику,​ инициализирует процессор с контроллером памяти и передает управление распаковщику. С распаковкой китайцы особо не заморачиваются и прошивка,​ как правило,​ упакована стандартным для Линуха gzip'​ом,​ так что распаковка проходит без проблем. Начало упакованного блока в этом случае отмечено сигнатурой 1Fh 8Bh 08h. Просто загружаем дамп прошивки в hiew, выделяем блоком,​ копируем в файл и натравливаем на него gzip. Если же братья китайцы использовали самопальный упаковщик (временами с ним это случается,​ причем,​ судя по стилю кодирования писали они его под сакэ) — изучаем код распаковщика в IDE и здесь же, в IDE, пишем свой собственный скрипт для его распаковки.
 +
 +{{dvd-disarm_Image_3.png?​552}}
 +
 +Рисунок 4 ищем сингатуру gzip'​а в прошивке с помощью hiew'​а
 +
 +Распакованная прошивка как правило имеет модульную структуру,​ последовательно копируемую в разные части буферного ОЗУ. Часть модулей содержит код операционной системы (или, точнее,​ все, что от него осталось),​ часть — обеспечивает поддержку ввода/​вывода и примитивной файловой системы,​ состоящей из довольно большого количества кодеков.
 +
 +Кодеки могут представлять собой как двоичные файлы своего собственного формата,​ так и обычный ELF-файл. В любом случае,​ кодеками управляет менеджер,​ передающий им закодированные аудио/​видео данные и забирающий распакованную информацию. В зависимости от количества сакэ, принятого разработчиками,​ видеопроцессор может работать либо в режиме реального времени (то есть выдавать декодированную информацию в строго определенные моменты времени),​ так и просто валить результаты декодирования в буферное ОЗУ, перекладывая заботу о его дальнейшей судьбе на плечи других микросхем. Все это необходимо учитывать при добавлении новых кодеков или модификации уже существующих.
 +
 +Собственно,​ процедура добавления нового кодека проста до безобразия — коль скоро у нас есть какое-то подобие файловой системы (а оно у нас есть) достаточно просто положить туда еще один файл, после чего упаковать все модули обратно gzip'​ом,​ приклеить туда оригинальный boot-блок,​ пересчитать все контрольные суммы и залить прошивку назад в микросхему с помощью программатора.
 +
 +Труднее всего именно выяснить формат кодеков. Он будет явно не от MS. И никаких стандартов на этот счет у нас нет. А потому приходится либо потрошить кодеки,​ входящие в состав исходной прошивки,​ либо дизассемблировать их менеджер,​ состоящих из десятков килобайт кода. В простейшем случае кодек представляет собойобычный ELF экспортирующий несколько функций среди который есть функция с условным названием check_format — ей передается аудио/​видеопоток и она должна сказать готов ли данный кодек его декодировать или нет. В плане хака это наилучший вариант,​ поскольку мы можем добавить поддержку абсолютно любых форматов сжатия и контейнеров,​ использующихся для их хранения. Хуже, если кодек представляет собой бинарный файл, в определенной позиции которого содержится список сигнатур (например,​ кодов fourcc) соответствующих заголовкам форматов,​ которые он готов обрабатывать. В этом случае первичный парсинг формата делает менеджер кодеков и потому нужно быть готовым к тому, что его придется сильно править.
 +
 +Хачинье прошивок немыслимо без отладки,​ но… с отладкой сплошные напряги. Писать эмулятор видеопроцессора со всем его окружением слишком муторно,​ долго и совершенно нецелесообразно,​ к тому же в отсутствии спецификации никогда нельзя быть уверенным,​ что наш эмулятор — правильный. Ничего другого не остается как прибегнуть к отладочной печати. Для этого кодеку достаточно выводить текстовые строки,​ накладывая их поверх распакованных видеоданных. В идеале,​ конечно,​ стоило бы прикрепить активацию отладчика к определенной комбинации кнопок на пульте/​лицевой панели плеера,​ но, увы, видеопроцессору кнопки недоступны,​ и это потребует модификации основной прошивки управляющего микропроцессора. А нам ее модифицировать в лом. Поступим проще. Изготовим специальный отладочный видеодиск,​ содержащий определенную последовательность байт в заголовке/​видео потоке,​ обнаружив которую,​ кодек должен задействовать режим отладочной печати и не выключать ее вплоть до аппаратного ресета/​перезагрузки — иначе как тогда отлаживать проблемные диски?​! То есть отладочный диск только активирует печать,​ а сам по себе может даже не содержать никакой актуальной видеоинформации. К сожалению,​ это не всегда возможно сделать,​ т. к. у некоторых моделей плееров ресет видеопроцессора происходит автоматически при каждой смене диска.
 +
 +===== заключение =====
 +
 +Мыщъх не претендует на создание полного,​ законченного и исчерпывающего руководства по хаку DVD-прошивок. В силу многообразия схемотехнических решений DVD-проигрывателей это попросту невозможно,​ к тому же, элементарная база не стоит на месте, а интенсивно обновляется. Не стоят на месте и форматы компрессии аудио/​видеоданных. Но полное руководство и не нужно. Мы же, как истинные хакеры,​ ориентированы не на конечный результат,​ а сам процесс его достижения.
 +
 +Главное — это выбрать изначально правильное направление. Узнать,​ что хак прошивок вообще возможен и что Линух поджидает нас даже там, где мы совсем его не ожидаем. Открытые проекты — действительно великая вещь, доказывающая превосходство хакерского братства над корпоративным интересом к обогащению путем монополизации права на обладание программным кодом.
 +
 +