Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 109, ЯНВАРЬ 2008 г.

Вооружаем и разоружаем DVD-плееры

Крис Касперски

Хакер, номер #109, стр. 090

Техника перепрошивки аппаратных DVD-плееров с никсами на борту

Часть людей предпочитает смотреть видео на компьютере, часть — использует для этой цели автономные 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/xBSD?! Уже на подходе. Немного терпения. Китайцы, как известно, дерут все, до чего только им удается дотянуться, и no-name DVD-плеер, собранный умельцем по имени Ляо, при ближайшем рассмотрении очень часто оказывается плохой копией хорошего японского плеера. Содрать чужое (и притом лучшее) — экономически выгоднее, чем разрабатывать это самому с нуля. Но воровать нужно тоже с умом, выкидывая максимум деталей и заменяя дорогие комплектующие их дешевыми аналогами.

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

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

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

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

Чтобы не маньячить прямо в магазине (где вскрывать крышку нам все равно не дадут), необходимо заранее изучить доступный модельный ряд и нарыть необходимую информацию в Интернете. Если повезет — мы откопаем не только фотографии платы, но еще и принципиальную схему, которая, впрочем, необязательна. Как вариант, можно приобрести поддержанный DVD с рук у приятеля или, натянув сапоги, совершить набег на любой более-менее приличный радиорынок, где продавцы в курсе темы и знают товар, который они продают. Собственно говоря, no-name продукция распространяется преимущественно через рынки. В салонах бытовой техники ее можно встретить только с перепугу. Оно и понятно. Салоны предпочитают брать продукцию фирм, имеющих развитую сеть сервисных центров, обеспечивающих хотя бы гарантийный ремонт.

Конечно, качество у no-name продукции не ахи, и радости от того, что хакнутый плеер будет воспринимать все форматы… Ну, о какой радости можно говорить, если звук — кошмар, изображение — отвратное… Но тут все не так однозначно. Заплатив за брендовый проигрыватель, не факт, что мы получим достойное качество, особенно если речь идет о пережатых MPEG4 дисках со звуком в MP3. Писать же MPEG4 с малым сжатием и оригинальным многоканальным звуком — смысла нет, ибо по размеру получится тот же самый DVD, да и сами DVD, продающиеся на российских просторах, обычно получены из каких-то левых источников, даже если они "с понтом типа лицензионные".

Качественное видео/звук и плеер с поддержкой MPEG4 не совместимы по определению. Если так уж важно качество, то достаточно прибрести любой приличный DVD проигрыватель из серии MPEG1/MPEG2 only. Если же мы хотим поэкспериментировать – берем no-name DVD с программным декодером и хачим прошивку по полной программе, добавляя туда новые кодеки, чем мы, собственно, сейчас и займемся.

Мочим прошивку

Микрокод программных видеодекодеров особой оригинальностью не отличается. Сначала управление передается на неупакованный boot-блок (расположенный в самом конце дампа), который выполняет некоторую первичную диагностику, инициализирует процессор с контроллером памяти и передает управление распаковщику. С распаковкой китайцы особо не заморачиваются, и прошивка, как правило, упакована стандартным для *nix-систем gzip'ом, так что эта процедура проходит без проблем. Начало упакованного блока в этом случае отмечено сигнатурой 1Fh 8Bh 08h. Просто загружаем дамп прошивки в hiew, выделяем блоком, копируем в файл и натравливаем на него gzip. Если же братья китайцы использовали самопальный упаковщик (временами с ними это случается, причем, судя по стилю кодирования, писали они его под сакэ), изучаем код распаковщика в IDE и здесь же, в IDE, пишем свой собственный скрипт для его распаковки.

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

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

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

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

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

Заключение

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

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

К сожалению, *nix-системами на ПК сегодня уже никого не удивишь. А потому, в порядке эксперимента, мы решили сменить привычный x86 на нетрадиционную процессорную ориентацию, рассмотрев особенности размножения никсов во встраиваемых системах, а конкретнее: в автономных DVD-приводах, скрывающих внутри своих прошивок жестоко урезанное ядро Linux или NetBSD. Именно эту прошивку мы и будем хачить, добавляя поддержку новых кодеков и исправляя ошибки в уже имеющихся. В конце концов, если мы за свободный софт, то нужно следовать духу Open Source не только на компе, но и на всем остальном оборудовании.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001