Автор: (c)Крис Касперски ака мыщъх
Часть людей предпочитает смотреть видео на компьютере, часть использует для этой цели автономные 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-проигрывателей это попросту невозможно, к тому же элементная база не стоит на месте, а интенсивно обновляется. Не стоят на месте и форматы компрессии аудио/видеоданных. Но полное руководство и не нужно. Мы же, как истинные хакеры, ориентированы не на конечный результат, а на сам процесс его достижения.
Главное - это выбрать изначально правильное направление. Узнать, что хак прошивок вообще возможен и что Линух поджидает нас даже там, где мы совсем его не ожидаем. Открытые проекты - действительно великая вещь, доказывающая превосходство хакерского братства над корпоративным интересом к обогащению путем монополизации права на обладание программным кодом.