DVD-disarm

вооружение и разоружение 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-ядро и вместо того, чтобы послойно раздербанивать микросхему на сканирующем электронном микроскопе — копируют достаточно хорошо документированный интерфейс видеопроцессора с внешним миром.

Рисунок 1 так выглядит RISC-процессор ARM9 от ATMEL, часто используемого в качестве программного декодера в DVD-проигрывателях

При этом очень часто они используют широко распространенный RISC-процессор (например, ARM) и… открытую библиотеку FFmpeg, для поддержания работоспособности которой в прошивку впендюривается урезанное до безобразия ядро Linux'а или NetBSD, а точнее даже малая часть ядра. Как минимум потребуется аллокатор — то есть набор функций для работы с динамической памятью. Компилируется все это дело, естественно, с помощью GCC, причем, в библиотеку FFmpeg вносится минимум изменений. Китайцы тоже не дураки и при «заимствовании» новой версии FFmpeg повторять работу по ее адаптации с нуля — какой им резон? Они же ни от кого не шифруются. И на все юридические проблемы лицензирования плюют с Тянь-Шаня. Конечно, это только no-name плюют. А как только Ляо выбирается из темных подвалов в устремившиеся вверх небоскребы — вот тут уже выгоднее становится вставлять в плеер аппаратные декодеры от сторонних производителей, чем реализовать их на коленках самостоятельно.

Рисунок 2 IDA Pro дизассемблирует код прошивки, предназначенной для ARM

Короче, хачить брэндовые проигрыватели — бесперспективно и для полного счастья нам не хватает только DVD с чисто программным декодером. По каким признакам его можно отличить от остальных? Первое — это большое количество поддерживаемых аудио/видео-форматов, перечень которых коррелирует с послужным списком библиотеки FFmpeg. Проигрыватели, понимающие только MPEG1/MPEG2 – явно не наш клиент и идут лесом. Второе – сняв крышку (а ее все таки придется снять), мы должны обнаружить достаточно мощный RISC-процессор (ARM7 с крейсерской скоростью в 56 MHz может быть только управленцем, но никак не декодером, а вот ARM9 200 MHz уже может декодировать MPEG4, записанный без наворотов), характерную микросхему перепрограммируемой памяти рядом с ним и необычно большое количество буферных ОЗУ — «необычно большое» для аппаратных декодеров. Собственно говоря, именно буферные ОЗУ и позволяют отличить управляющий микроконтроллер от программного видеодекодера.

Рисунок 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, пишем свой собственный скрипт для его распаковки.

Рисунок 4 ищем сингатуру gzip'а в прошивке с помощью hiew'а

Распакованная прошивка как правило имеет модульную структуру, последовательно копируемую в разные части буферного ОЗУ. Часть модулей содержит код операционной системы (или, точнее, все, что от него осталось), часть — обеспечивает поддержку ввода/вывода и примитивной файловой системы, состоящей из довольно большого количества кодеков.

Кодеки могут представлять собой как двоичные файлы своего собственного формата, так и обычный ELF-файл. В любом случае, кодеками управляет менеджер, передающий им закодированные аудио/видео данные и забирающий распакованную информацию. В зависимости от количества сакэ, принятого разработчиками, видеопроцессор может работать либо в режиме реального времени (то есть выдавать декодированную информацию в строго определенные моменты времени), так и просто валить результаты декодирования в буферное ОЗУ, перекладывая заботу о его дальнейшей судьбе на плечи других микросхем. Все это необходимо учитывать при добавлении новых кодеков или модификации уже существующих.

Собственно, процедура добавления нового кодека проста до безобразия — коль скоро у нас есть какое-то подобие файловой системы (а оно у нас есть) достаточно просто положить туда еще один файл, после чего упаковать все модули обратно gzip'ом, приклеить туда оригинальный boot-блок, пересчитать все контрольные суммы и залить прошивку назад в микросхему с помощью программатора.

Труднее всего именно выяснить формат кодеков. Он будет явно не от MS. И никаких стандартов на этот счет у нас нет. А потому приходится либо потрошить кодеки, входящие в состав исходной прошивки, либо дизассемблировать их менеджер, состоящих из десятков килобайт кода. В простейшем случае кодек представляет собойобычный ELF экспортирующий несколько функций среди который есть функция с условным названием check_format — ей передается аудио/видеопоток и она должна сказать готов ли данный кодек его декодировать или нет. В плане хака это наилучший вариант, поскольку мы можем добавить поддержку абсолютно любых форматов сжатия и контейнеров, использующихся для их хранения. Хуже, если кодек представляет собой бинарный файл, в определенной позиции которого содержится список сигнатур (например, кодов fourcc) соответствующих заголовкам форматов, которые он готов обрабатывать. В этом случае первичный парсинг формата делает менеджер кодеков и потому нужно быть готовым к тому, что его придется сильно править.

Хачинье прошивок немыслимо без отладки, но… с отладкой сплошные напряги. Писать эмулятор видеопроцессора со всем его окружением слишком муторно, долго и совершенно нецелесообразно, к тому же в отсутствии спецификации никогда нельзя быть уверенным, что наш эмулятор — правильный. Ничего другого не остается как прибегнуть к отладочной печати. Для этого кодеку достаточно выводить текстовые строки, накладывая их поверх распакованных видеоданных. В идеале, конечно, стоило бы прикрепить активацию отладчика к определенной комбинации кнопок на пульте/лицевой панели плеера, но, увы, видеопроцессору кнопки недоступны, и это потребует модификации основной прошивки управляющего микропроцессора. А нам ее модифицировать в лом. Поступим проще. Изготовим специальный отладочный видеодиск, содержащий определенную последовательность байт в заголовке/видео потоке, обнаружив которую, кодек должен задействовать режим отладочной печати и не выключать ее вплоть до аппаратного ресета/перезагрузки — иначе как тогда отлаживать проблемные диски?! То есть отладочный диск только активирует печать, а сам по себе может даже не содержать никакой актуальной видеоинформации. К сожалению, это не всегда возможно сделать, т. к. у некоторых моделей плееров ресет видеопроцессора происходит автоматически при каждой смене диска.

Мыщъх не претендует на создание полного, законченного и исчерпывающего руководства по хаку DVD-прошивок. В силу многообразия схемотехнических решений DVD-проигрывателей это попросту невозможно, к тому же, элементарная база не стоит на месте, а интенсивно обновляется. Не стоят на месте и форматы компрессии аудио/видеоданных. Но полное руководство и не нужно. Мы же, как истинные хакеры, ориентированы не на конечный результат, а сам процесс его достижения.

Главное — это выбрать изначально правильное направление. Узнать, что хак прошивок вообще возможен и что Линух поджидает нас даже там, где мы совсем его не ожидаем. Открытые проекты — действительно великая вещь, доказывающая превосходство хакерского братства над корпоративным интересом к обогащению путем монополизации права на обладание программным кодом.