DVD firmware patching — Архив WASM.RU

Все статьи

DVD firmware patching — Архив WASM.RU

Предистория

Недавно в поисках чего бы мне такого еще крякнуть я, можно сказать совсем неожиданно, вспомнил про свой DVD-ROM. Точнее это не было большой неожиданностью, просто моя творческая натура потребовала от меня сразу после покупки DVD-ROM-a немного поиграться с установками региональной защиты. В результате, как всегда и получается, дисковод заблокировался на американском регионе (номер 1), в то время как мне требовалось просмотреть фильм из родной Россияно-Африканской :) 5-ой зоны. Таким образом, остро стал вопрос о том как исправить это положение. Я не буду расспространяться о том, как я отношуть ко всем этим "изобретениям" буржуев, призванных ограничить мои потребительские права.

В данной статье я постараюсь рассказать о том как пропатчить прошивку DVD дисковода, чтобы сделать его мультизонным. Статья состоит из двух частей - теоретической и практической. Теорию я стырил у товарища xdi (xvi@firmware-flash.com, xvi91@hotmail.com), т.к. мой опыт общения с DVD дисководами ограничивался всего несколькими днями. Ну а в практической части описан мой собственный опыт перепрошивания дисковода SONY DDU1621.

Замечание

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

Теория

Немного о региональной защите

Что такое региональная защита? Почему вообще нужно патчить прошивку DVD? Звучить весьма страшновато - это ведь не просто взять и пропатчить какую-нибудь Windows программу. Тогда зачем это нужно?

Для того чтобы содрать с нас побольше денег, ведущие компании договорились, что DVD-диск, купленный где-нибудь в одном месте, нельзя будет просмотреть где-нибудь в другом месте. Например, японский пользователь не сможет просмотреть фильм, купленный в США. Причем это не имеет никакого отношения к языковым барьерам или телевизионным стандартам вроде NTSC или PAL. Также это не имеет отношения к защите от компьютерного пиратства, т.к. конечная цель - запретить прогирывание настоящих лекально купленных фильмов.

Механизм региональной защиты был специально разработан для того, чтобы достичь этой цели - весь мир был поделен на 6 регионов:

региональное деление мира

Суть механизма региональной защиты состоим в следующем: любой DVD плеер или дисковод может проигрывать фильмы только из одного региона. Таким образом, плеер, настроенный на регион 1 может проигрывать фильмы, собранные для региона 1 и.т.д. DVD дисководы обычно продаются уже настроенными на конкретный регион, в котором они были куплены, и, обычно их регион не может быть изменен. Компьютерные DVD дисководы могут изменять свои настройки 5 раз. После этого они блокируются на последнем установленном регионе. Для того, чтобы удостовериться что все производители следуют этим ограничениям, они они заключили лицензионное соглашением CSS о том, чтобы продавать CSS-совместимые устройства. Без этого соглашения никто не может продавать DVD плееры или дисководы. Частью соглашения является механизм региональной защиты.

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

Второе, сами производители не станут давать вам мультизонную прошивку для DVD дисководов. Они заключили соглашение не делать этого. Так что не стоит терять времени, и просить их.

Третье, механизм региональной защиты реализован в DVD дисководе. Чтобы обойти его необходимо пропатчить прошивку. С технической точки зрения, можно обойти этот мехаизм используя некоторую компьютерную программу, но это немного сложнее. Т.к. необходимый CSS Title Key неизвестен, необходимо подобрать его, что может занять некоторое время и привести к задержкам прямо посередине фильма. Также программа проигрывания должна быть неплохо пропатчена, чтобы поддерживать эту фичу. Кроме того, придется делать это для каждой новой версии программы. Более легкий путь сделать свой драйв мультизонным - пропатчить прошивку дисковода, и оставить сам софт нетронутым.

Немного от SCSI и ATAPI

Существуют различные DVD дисководы: SCSI, ATAPI и IEEE1394 (FireWire), и возможно, другие (USB 2 и т.д.). С точки зрения того, чтобы пропатчить их никакой разницы нет. Все они используют одинаковые командные пакеты для того чтобы взаимодействовать с хостовым компьютером. Поэтому, что касается прошивки DVD, можно воспринимать драйвы ATAPI и IEEE1394 как "SCSI поверх другой шины".

Работает все одинаково: хостовый компьютер посылает командный пакет длиной несколько байт, за которым возможно следуют еще несколько байтов параметров и входные и выходные данные (если присутствуют). Большинство пакетов имеют длину 6,10 или 12 байтов длиной, и самый первый из этих байтов содержит код операции, которую должен выполнить дисковод.

Некоторые специфичные для DVD команды

Описания ATAPI/SCSI команды можно найти по адресу: http://ftp.t10.org/ftp/t10/drafts/ Команды, специфичные для DVD находятся в дирректории mmc3.

Возможно вы захотите скачать и прочитать самое последнее описание mmc3. Как минимум, понадобятся описание команд "Report Key" и "Send Key" (опкоды A3 и A4), потому что эти две команды включают в себя механизм региональной защиты (их мы и пропатчим). Ниже приведено краткое описание обоих команд:

Формат команды 'Report Key' и 'Send Key'

Параметр "Key Format" команды "Send Key" (A3) может принимать документированные значения 01, 03, 06, 3F и иногда недокументированные значения, такие как 02, которое часто используется как команда сброса счетчика. За командным пакетом следуют несколько байтов параметров.

Параметр "Key Format" команды "Report Key" (A4) может принимать документированные значения 00, 01, 02, 04, 05, 08, 3F на CPRM совместимых устройствах, документированное значение 11 и иногда недокументированные значения. Дисковод возвращает некоторую информацию хостовому компьютеру когда получает эту команду.

Наибольший интерес представляют команды "Send Key" c параметром "Key Format" равным 06, и команда "Report Key" c "Key Format" равным 04 или 08. В дальнейшем эти команды будут упоминаться как A3/06, A4/04 и A4/08 соответственно.

Команда A4/08 используется для запроса региона, на который настроен дисковод и количества оставшихтся изменений, команда A3/06 используется для изменения региона дисковода. Команда A4/04 возвращается CSS Title Key, который необходим для того, чтобы дешифровать CSS-зашифрованный фильм.

Ниже приведен формат ответа дисковода на команду A4/08:

Формат ответа команды A4/08

Поле 'Changes left' содержим количество (от 0 до 5) изменений региона, которые еще можно выполнить. Поле 'Resets left' содержит число (от 0 до 4) оставшихся сбросов счетчика.

Поле 'State' зависит от поля 'Changes left'. Если 'Changes left' равно 0, 'State' будет в двоичном виде 11. Если 'Changes left' равно 1, 'State' будет 10, и если Changes left' равно 2,3 или 4, 'State' будет 01. Когда 'Changes left' равно 5, 'State' будет 00. Официальные названия этих состояний 'None', 'Set', 'Last Chance', 'Permanent'.

Формат маски региона

Маска региона используется для того чтобы представлять регионы. Это один байт, бит 0 которого соответствует региону 1, бит 1 региону 2, и так до 7 бит, который соответствует региону 8. Каждый бит имеет два значения: true и false. 'True' соответствует нулевому биту, 'false' единичному биту. Обратите внимание, что это прямо противоположно общепринятым нормам.

Команды A3/06 и A4/04 используют маску региона для того, чтобы указать регион диска. Маска региона построена при помощи установки в 'true' региона, который нужно выбрать. Так регион 1 представляется значением FE, регион 2 значением FD, и т.д.

Ниже приведены общепринятые значения маски региона:

Маски регионов

Обратите внимание на 'No Region', которому соответствует значение FF. Когда оно возвращается дисководом, это означает что регион еще не был установлен. Заводские установки: регион не установлены, разрешены 5 изменений региона, разрешены 4 сброса счетчика изменений региона. Когда выполняется сбос счетчика изменений регионов, он устанавливается равным 5, маска региона FF и уменьшается количество разрешенных сброса счетчиков. Изменение региона изменяет маску региона и уменьшает счетчик разрешенных изменений региона. Дисковод отклоняет запросы на изменение региона если счетчик разрешенных изменений равен 0.

Т.к. DVD дисковод может быть настроен на один регион одновременно, команда A3/06 с маской региона с выбранными несколькими регионами будет отклоняться.

Маска региона также используется фильмами для того, чтобы указать, в каких региона фильм может быть проигран. Если бит, соответствующий региону установлен в true (т.е. 0), фильм можен быть проигран устройством, настроенным на этот регион. Маска региона сохраняется в заголовочном секторе CSS глубоко внути внутренней структуры DVD. Копия этой маски региона доступна по смещению 23h файла VIDEO_TS.IFO, который находится в каталоге VIDEO_TS диска.

Различия между мультизонными и заблокированными дисководами

Мультизонный (RPC-1) дисковод всегда возвращает CSS Title Key хостовому компьютеру, он ничего не знает о командах A3/06 и A4/08 и не может ни возвращать, ни устанавливать свой регион. Когда команда A3/06 или A4/08 отправляется такому дисководу, он возвращает ошибку "INVALID FIELD IN CDB", означающую что параметр Key Format был нераспознан. Некоторые мультизонные дисководы могут возвращать другие ошибки, такие как "MEDIUM NOT PRESEND" когда диск не вставлен в дисковод. В любом случае, мультизонные дисководы не могут ни возвратить, ни установить свой регион.

Заблокированный дисковод (RPC-2), может быть настроен только на один регион, и будет помнить эти установки после того, как будет отключен от электрической сети. Он будет распознавать команду A4/08 возвращая свой текущий регион и счетчики, и будет также распознавать команду A3/06 изменяя свой регион (если счетчик разрешенных изменений региона не равен 0). Поведение команда A4/04 немного отличается. Если диск авторизован для проигрывания в данном регионе, команда A4/04 работает нормально, если диск не может быть проигран в данном регионе, Title Key не будет возвращаться и софтверный кодек не сможет расшифровать фильм.

Ваш компьютер будет определять, что дисковод мультизонный, посылая команду A4/08. Если дисковод возвращает установки региона - то он заблокирован. Если дисковод отклоняет команду с ошибкой - он мультизонный. Все утилиты проверяют статус RPC дисковода таким образом.

Как RPC-2 дисководы запоминяют свои регионы и счетчики?

Конечно все они используют некоторый тип ПЗУ, но какое значения различные дисководы сохраняют в этой памяти?

Различные дисководы могут по разному хранить свои регионы. Одни могут хранить маску региона, другие сохранять регион по номеру. Есть и другие возможности.

Счетчики тоже могут запоминаться различным образом. Они могут сохраняться в виде обратных счетчиков, представляя количество оставшихтся операций, уменьшаясь при каждой смене региона, или сброса счетчика. Они также могут отчитываться от 0 вверх, представляя собой количество раз, которое была выполнена операция. Также может быть, что они не запоминаются вовсе, но высчитываются исходя из журнала изменения регионов, в котором сохраняются успешные попытки изменить регион дисковода.

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

Как RPC-2 дисководы определяют, что они могут проиграть фильм?

Фактически, дисковод не запрещает читать любые DVD диски, он только отказывается возвращать CSS Title Key для неавторизованного для данного региона диска, так что нельзя расшифровать фильм. Чтобы проверить, может ли она вернуть Title Key фильма, прошивка проверяет маску региона фильма на соответствие своему региону. В зависимости от того как дисковод запоминает свой регион могут использоваться различные алгоритмы.

Если дисковод запоминает маску своего региона, он может просто вычислить двоичный OR своей маски региона и маски региона фильма. Если результат равер FF, фильм не авторизован, если результат не FF, фильм авторизован для просмотра. Данную операцию легко обнаружить в ассемблерном листинг, т.к. она основана на инструкции OR, за которой следует сравнение (COMPARE) и затем условное ветвление по условию равно/не равно (EQUAL/NOT EQUAL CONDITIONAL BRANCH).

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

Замечание: регион 7 и регион 8 могут быть, а могут и не быть распознаны дисководом, т.к. они являются специальным случаем среди других регионах: регион 7 в настоящее время не определен, и регион 8 как специальный международный регион используется (если вообще используется) редко.

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

Шаг 1

Сначала необходимо достать прошивку, чтобы ее патчить. Обычно источником прошивки слушить файл прошивки, который идет вместе с пакетом обновления прошивок, распространяемым производителем. Если прошивка в .HEX или .MOT формате, она должна быть предварительно транслирована в двоичную форму. В данной статье не рассматривается как это сделать, есть много утилит на просторах интернета, которые предназначены для этой цели. Учтите только, что файлы .HEX могуть содержать более 64KB данных, и некоторые утилиты не способны обрабатывать такие большие файлы.

Шаг 2

Теперь надо бы дизассемблировать прошивку. Это предполагает, что вы знакомы с процессором, который используется дисководом. Вот список наиболее часто применяемых процессоров в DVD дисководах: Hitachi H8S, Intel 8051, Zilog Z80, Matsushita 102000, Mitsubishi 7902, Hitachi SuperH. Попробуйте дизассемблировать файл для каждого из этих процессоров и определите какой вариант более всего похож на асемблерный листинг.

Исходники для H8S, 102000, 790, SuperH, 8051 и Z80 дизассемблеров доступны по адресу:

http://perso.club-internet.fr/farzeno/firmware/

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

Шаг 3

Сейчас, когда вы дизассемлировали прошивку, вам нужно найте месте где патчить. Вначале, нужно отыскать, где сохраняется регион дисковода. Самый простой путь достичь этого - найти обработчик A4/08, который возвращает маску региона дисковода хостовому компьютеру.

Обычно прошивки имеют размер 64KB, 128KB и даже больше, так что нахождение нужного кода в нескольких десятках тысяч ассемблерных линий может показаться сложной задачей. К счастью, есть одна операция, которая всегда была надежным помошников: параметр формата оператий A3 и A4 должен быть извлечен из байта, в котором также находится параметр AGID. Обычно это выполняется при помощи операции AND байта и значения 3F. Поиск при помощи регулярного выражения "AND.*3F" (или похожего) оставит несколько кандидатов из которых можно легко выявить те, которые соответствуют командам A3 и A4. Это можно сделать исследуя код как рассказано ниже. Различные опции будут либо проверяться одна за другой, сравнением с различными значениями, либо в виде индексов в таблице. Оба метода можно легко обнаружить и сравнивая значения, которые проверяются вы легко найдете два обработчика команд. Заметьте, что проверке по таблице или сравнению параметров часто предшествуют проверки на валидность других параметров. Например параметр AGID, к примеру, не обязательно должен быть валиден в связке с теми параметрами, которые нас интересуют. Так что обработчки A4 может быть обнаружет в результате немедленного сравнения извлеченного значния и 08.

Теперь, когда найдент обработчик A4, нужно пройти по коду до обработки параметра Key Format равного 08. В конце концов вы найдете обработчик A4/08 и код, который возвращает регион. Обратите внимание как сохраняется регион (по номеру, маске и т.д.) и на его адрес.

Шаг 4

Теперь обратите внимание на все ссылки на регион дисковода (или маску региона) в прошивке. Нам нужно идентифицировать все эти ссылки или, как минимум, понять что они делают с регионом дисковода. Возможные варианты использвания (не все присутствуют во всех прошивках):

  1. Инициализация. Во время запуска, дисковод читает ПЗУ для того, чтобы восстановить последний регион, который был запомнен. Некоторые прошивки читают регион из NVRAM или FLASH памяти каждый раз когда он нужнен, так что этот код может вызываться из нескольких мест.
  2. По умолчание регион не установлен. В первый раз, когда подключается питание к дисководу (еще на заводе), ПЗУ дисковода не инициализировано, так что прошивка принимает следующие установки: регион не выбран, осталось 5 изменений региона, 4 сброса счетчиков.
  3. Сохранение региона. Когда регион изменяеться, он должен быть запомнен и записан в постоянную память.
  4. Прямое сравнение. Эти сравнения нужны как часть обработчика A3/06 когда запрошено последнее изменение региона, т.е. осталось только одна возможность изменить регион. В этом случае, для того, чтобы предотвратить случайные ошибки, обязательно должен быть вставлен диск, который настроен на конечный регион, и только на него.
  5. Косвенные сравнения. Это проверки совместимости регионов. Некоторые являются частью обработчика A3/06, т.к. дисковод будет изменять свой регион, если вставлен фильм, который авторизован для данного региона. Другие являются частью механизма региональной защиты, т.к. обработчик A4/04, который проверяет разрешено ли вернуть Title Key.

Шаг 5

Достаточно разговоров, настало время патчить!

Вначале, необходимо модифицировать обработчик A3 так, чтобы он не распознавал параметр Key Format равный 06. Затем, тоже самое нужно сделать с обработчиком A4, так, чтобы он не распознавал параметр Key Format равный 08.

Далее надо запатчить проверки на совместимость регионов так, чтобы они всегда совпадали.

Возможно вы также захотите модифицировать имя прошивки, если да, учтите, что оно может быть представлено в перевернутом формате на ATAPI устройствах, т.к. ATAPI дисковод может быть опрошен двумя командами: собственно командой ATAPI и по старому стилю идентификации IDE. Строка идентификации IDE может сохраняться в перевернутом формате, так что прошивка с названием "ABCD" может быть представлена как "BADC" где-то внути файла. Переименовывать ли пропатченную прошивку - это ваш собственный выбор. Некоторые делают это, некоторе не делают. Главное, что пропатченная прошивка является мультизонной, а не ее имя.

О чем еще не было сказано

Процесс описанный выше несколько идеализирован. В действительности все может быть сложнее (или проще):

  1. В некоторых прошивках (Matsushita DVD-RAM дисководы) есть вызов подпрограммы вне области прошивки, которая проверяет совместимость регионов (т.к. она за пределами прошиваемой обсласти - ее нельзя запатчить). Есть прошивки, в которых содержится скрытая контрольная сумма, при несовпадении которой дисковод выталкивает диск.
  2. Конкрольные суммы: Большинство дисководов проверяют прошивку, до того как ее перепрошить. Файл прошивки может содержать заголовки и/или контрольную сумму. Так что необходимо найти алгоритм подсчета контрольной суммы в самой прошивке, затем сделать маленькую программу для расчета правильной контрольной суммы. Эти контрольные суммы - это не результат каких-либо противопатчинговых технологий, это просто механизм, который позволяет предотвраить порчу дисковода в результате неверно загруженой прошивки. Некоторые утилиты записи прошивок достаточно умны чтобы сказать верную контрольную сумму, так что даже не приходится беспокоиться, чтобы ее вычислять!
  3. Некоторые прошивки уже RPC-1 совместимые. В таких прошивках делается проверка, чтобы выявить, является дисковод RPC-1 или RPC-2. Сосмотрите нет ли подобных тестов в обработчике A4/08. Если вы нашли такой тест, он может проверять, установлен или сброшен ли какой-либо джемпер, проверять некоторый флаг где-либо в прошивке, или флаг, устанавливаемый недокументированной программой, и т.д.
  4. Когда вы нашли обработчик A4/08, помните вы видели операцию AND с 3F? Исходный байт был взят из 11-го байта буфера команды. Вычтите 0A из его адреса и получите адрес байта, который содержит код операции. Поискав ссылки на этот байт вы можете найти обработчик команд, затем посмотрите на недокументированные опкоды операций (как правило в диапазоне С0-FF, но также в специфичных для разработчика MODE PAGES или DIAGNOSTICS PAGES). Некоторые могут быть очень интересными, такие как команды сброса памяти дисковода (почти в каждом дисководе), сброса счетчиков (Hitachi GD-7000 и 7500), или даже переключение дисковода в режим RPC-1 временно (LG дисководы) или постоянно (Hitachi GD-3000 и 5000).
  5. Патч обработчика A3/06 может быть не обязателен, т.к. дисковод будет идентифицирован как RPC-1 если команда A4/08 была пропатчена. Есть пропатченные прошивки, в которых эта команда присутствует, и они вполне работали. Однако, команда A3/06 есть часть различия между RPC-1/RPC-2, так что рекомендуется патчить ее в любом случае. Это не займет много времени и это безопаснее.
  6. Некоторые прошивки проверяют установлен ли регион до того как проверить совместимость регионов (и если не установлен, команда завершается с ошибкой), так что либо пропатчите этот код также, или убедитесь что регион был установлен, до того как обновить прошивку. В любом случае, лучше удостовериться, что регион был установлен до того как записывать новую прошивку.
  7. Кто-то может решить пропатчить прошивку просто удалив уменьшение счетчика изменений региона в команде A3/06 (a.k.a бесконечное число жизней :). Этого делать крайне не рекомендуется, т.к. большинство перезаписываемых типов имеют ограниченный жизненный цилк при записи (иногда около 100 раз). Такой патч приведет к тому, что дисковод будет записывать эту память каждый раз и рано или поздно это вызовет отказ памяти NVRAM. Другие дисководы сохраняют изменение регионов "съедая" некоторый зарезервированный кусок памяти. В этом случае, когда память кончиться, дисковод либо испортит основную память, либо откажется изменять свой регион. В любом случае, пройдет некоторое время до того как дисковод откажет, так что публикация такой прошивки - это все равно что ходить по минному полю. Еще раз, не надо патчить прошивку таким образом!
  8. Пропатчим их всех! :) Целая линейка продуктов может разделять одни и те же ресурсы разработки (команда, исходники програм, и т.д.), так что прошивки от дисковода к дисководу очень похожи. Если вы пропатчили один, следующий уже будет легче. Большинство пользователей не имеют достаточно опыта чтобы пропатчить самим, так что если вы преуспели в патчинге своего дисковода, рассмотрите возможность пропатчить еще один из этой же линии продуктов. Это не должно отнять много времени, и это поможет тысячам людей по всему миру.

Практика

Процесс замены прошивки

Перед тем как что-либо прошивать необходимо определить версию прошивки, которая используется в вашем дисководе. Для этого можно использовать утилиту DiscInfo. В моем случае использовалась прошивка S3.1. Затем необходимо найти вариант этой прошивки, которая является мультизонной, или создать такую прошивку самому. :) Мне удалось раскопать RPC-1 прошивку, обработанную товарищем etna, которая называлась S3e1.

Для замены прошивки на DVD дисководах серии SONY DDU1621 можно использовать утилиту mtkflash. Это ДОС приложение и для корректной его работы необходимо запускать его из под чистого ДОС-а. Т.е. придется создать загрузочную дискету, на которую поместить саму утилиту и файлы новой прошивки.

Далее, нужно хорошо представлять себе как подключен ваш DVD дисковод: Primary Master, Primary Slave, Secondary Master или Secondary Slave. В моем случае, DVD дисковод был подключен как Primary Slave, поэтому все последующие команды приведены для этого случая (параметр 2 в команде mtkflash).

Замечание: перед тем как выполнять замену прошивки рекомендуется отключить все CD-RW и другие дисководы, если такие имеются в системе (достаточно просто выдернуть из них кабель питания). Я видел много народу, которые по ошибке прошили свой пишущий CD-ROM вместо DVD. Поверьте, не самая приятная ситуация. :)

Данную утилиту необходимо запустить четыре раза. Первые две команды сохраняют два банка прошивки на диск. Вторые две команды загружают новую прошивку.

mtkflash.exe 2 r /a0 /b back00.bin
mtkflash.exe 2 r /a1 /b back01.bin

mtkflash.exe 2 w /a0 /b bide00.bin
mtkflash.exe 2 w /a1 /b bide01.bin

Параметр 2 говорит о том, что DVD подключен как Primary Slave, параметр r - о том, что необходимо выполнить чтение прошивки и сохранить ее на диск, w - запись с диска. Параметр /aX задает номер банка памяти, над которым производятся операции. А параметр /b указывает, что файл прошивки представлен в двоичном виде.

После каждой команды mtkflash.exe будет предлагать вам перезагрузить компьютер. Однако не поддавайтесь соблазну! :) Необходимо выполнить все четыре команды.

Анализ прошивки S3e1

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

Сравнение файлов BACK00.BIN и BIDE00.BIN
000015C6: 2E 65
00001667: 2E 65
0000B0F5: 4F E4
0000CAC9: 60 00
0000CACA: 21 00
0000D18A: 60 00
0000D18B: 10 00

После того как я наигрался с мультизонным DVD дисководом, ;) у меня проснулся интерес, что же именно было изменено в прошивке? После небольшого исследования я выяснил, что в дисководах SONY DDU1621 использутется процессор i8051. Загрузить файл прошивки в IDA оказалось делом двух минут. Однако тут выяснилось, что я не знаком с ассемблером i8051. В прочем, это не большая проблемма для настоящего кодокопателя - в конце концов это ведь интеловский процессор, так что будем исследовать его по аналогии с i8086. :)

Теперь давайте пройдемся по тем местам, где были сделаны изменения и посмотрим, что имеено было пропатчено. Первые два оффсета 15С6 и 1667 в дизассемблированном листинге указывают на строки, в которых содержится имя прошивки.

MEM_EXT:15BF 45 56 20 52 33 53 31 65 56 44+aEvR3s1evdDorMd:\
.text "EV R3S1eVD-DOR MDD1U26 1                        "
MEM_EXT:15BF 2D 44 4F 52 20 4D 44 44 31 55+                .byte 0
...
MEM_EXT:164D 53 4F 4E 59 20 20 20 20 44 56+aSonyDvdRomDdu1:.text "SONY    DVD-ROM DDU1621 S3e1"
MEM_EXT:164D 44 2D 52 4F 4D 20 44 44 55 31+                .byte 0

Как видно, имя прошивки содержится в двух вариантах, что вполне согласуется с теорией. Здесь просто были изменено текстовое представление версии прошивки с S3.1 на S3e1. Шаг не обязательный, но вполне понятный.

Теперь посмотрим что находится по смещениям CAC9 и CACA:

MEM_EXT:CAB7 E0                                            movx    A, @DPTR
MEM_EXT:CAB8 54 3F                                         anl     A, #0x3F
MEM_EXT:CABA 14                                            dec     A
MEM_EXT:CABB 60 1B                                         jz      MEM_EXT_CAD8
MEM_EXT:CABD 14                                            dec     A
MEM_EXT:CABE 60 1D                                         jz      MEM_EXT_CADD
MEM_EXT:CAC0 24 FE                                         add     A, #0xFE ; '¦'
MEM_EXT:CAC2 60 1E                                         jz      MEM_EXT_CAE2
MEM_EXT:CAC4 14                                            dec     A
MEM_EXT:CAC5 60 20                                         jz      MEM_EXT_CAE7
MEM_EXT:CAC7 24 FD                                         add     A, #0xFD ; '¤'
MEM_EXT:CAC9 60 21                                         jz      MEM_EXT_CAEC
MEM_EXT:CACB 24 C9                                         add     A, #0xC9 ; 'г'
MEM_EXT:CACD 60 22                                         jz      MEM_EXT_CAF1
MEM_EXT:CACF 24 3F                                         add     A, #0x3F ; '?'
MEM_EXT:CAD1 70 22                                         jnz     MEM_EXT_CAF5
MEM_EXT:CAD3 12 D3 08                                      lcall   MEM_EXT_D308
MEM_EXT:CAD6 80 2E                                         sjmp    MEM_EXT_CB06

После нескольких минут раздумий над этим кодом я понял, что он мне что-то очень напоминает. А именно напонимает код, который опитизирующий компилятор генерит для небольшого цикла case. Я преобразовал код к такому виду:

MEM_EXT:CAB7 E0                                            movx    A, @DPTR
MEM_EXT:CAB8 54 3F                                         anl     A, #0x3F
MEM_EXT:CABA 14                                            dec     A
MEM_EXT:CABB 60 1B                                         jz      MEM_EXT_CAD8
MEM_EXT:CABD 14                                            dec     A
MEM_EXT:CABE 60 1D                                         jz      MEM_EXT_CADD
MEM_EXT:CAC0 24 FE                                         add     A, #-2
MEM_EXT:CAC2 60 1E                                         jz      MEM_EXT_CAE2
MEM_EXT:CAC4 14                                            dec     A
MEM_EXT:CAC5 60 20                                         jz      MEM_EXT_CAE7
MEM_EXT:CAC7 24 FD                                         add     A, #-3
MEM_EXT:CAC9 60 21                                         jz      MEM_EXT_CAEC
MEM_EXT:CACB 24 C9                                         add     A, #-0x37
MEM_EXT:CACD 60 22                                         jz      MEM_EXT_CAF1
MEM_EXT:CACF 24 3F                                         add     A, #-0xC1
MEM_EXT:CAD1 70 22                                         jnz     MEM_EXT_CAF5
MEM_EXT:CAD3 12 D3 08                                      lcall   MEM_EXT_D308
MEM_EXT:CAD6 80 2E                                         sjmp    MEM_EXT_CB06

Теперь можно понять, что здесь сначала достается код команды (ANL A, #0x3F). Логично, что ANL - это инструкция AND, а суффикс L указывет на некую длину операнда. Как вы помните в теоретической части предлагалось искать необходимые места в прошивке именно анализируя код, который идет за такими инструкциями. Далее идет инструкция switch (A). Возможные значения A равны: 1,2,4,5,8, 0x3F и 0. Обращаясь к теории находим, что такие параметры используются в обработчике A4. Теперь, нам необходимо пропатчить этот обработчик так, чтобы он не понимал команду A4/08. Что и было сделано путем вставки NOP-ов по адресу СAC9 и CACA. (Премечание: очевидно, что иструкции NOP имеют в архитектуре i8051 опкод 00. Как мило. :)

Теперь взглянем на код, расположеный по смещениям D18A и D18B.

MEM_EXT:D17E 90 80 48                                      mov     DPTR, #0x8048
MEM_EXT:D181 E0                                            movx    A, @DPTR
MEM_EXT:D182 54 3F                                         anl     A, #0x3F
MEM_EXT:D184 24 FD                                         add     A, #0xFD ; '¤'
MEM_EXT:D186 60 10                                         jz      MEM_EXT_D198
MEM_EXT:D188 24 FD                                         add     A, #0xFD ; '¤'
MEM_EXT:D18A 60 10                                         jz      MEM_EXT_D19C
MEM_EXT:D18C 24 C7                                         add     A, #0xC7 ; '¦'
MEM_EXT:D18E 60 23                                         jz      MEM_EXT_D1B3
MEM_EXT:D190 24 3E                                         add     A, #0x3E ; '>'
MEM_EXT:D192 70 23                                         jnz     MEM_EXT_D1B7
MEM_EXT:D194 12 BE 35                                      lcall   MEM_EXT_BE35
MEM_EXT:D197 22                                            ret

Пользуясь приемом, описанным выше преобразуем этот код в следующий:

MEM_EXT:D17E 90 80 48                                      mov     DPTR, #0x8048
MEM_EXT:D181 E0                                            movx    A, @DPTR
MEM_EXT:D182 54 3F                                         anl     A, #0x3F
MEM_EXT:D184 24 FD                                         add     A, #-3
MEM_EXT:D186 60 10                                         jz      MEM_EXT_D198
MEM_EXT:D188 24 FD                                         add     A, #-3
MEM_EXT:D18A 60 10                                         jz      MEM_EXT_D19C
MEM_EXT:D18C 24 C7                                         add     A, #-0x39
MEM_EXT:D18E 60 23                                         jz      MEM_EXT_D1B3
MEM_EXT:D190 24 3E                                         add     A, #-0xC2
MEM_EXT:D192 70 23                                         jnz     MEM_EXT_D1B7
MEM_EXT:D194 12 BE 35                                      lcall   MEM_EXT_BE35
MEM_EXT:D197 22                                            ret

Здесь A может принимать значения 3,6, 0x3F и 1. Вновь обратившись к теории находим, что такие параметры используются в обработчике A3. Согласно классическому учению, нам необходимо разобраться с обработчиком A3/06, так чтобы этот параметр не распознавался дисководом как валидный. Сделаем это занопив соответствующий джамп.

Наконец нам осталось позаботиться об обработчике A4/04. Здесь мы не может просто занопить команду условного перехода в обработчике A4, т.к. команда A4/04 - это именна та команда, которая возвращает CSS Title Key. Мы должны ее модифицировать так, чтобы она возвращала его всегда, независимо от установок фильма и самого дисковода. Для этого вернемся к обработчику A4 и проследуем по команде условного перехода до обработчика A4/04:

MEM_EXT:CAE2                               MEM_EXT_CAE2:                           
                                           ; CODE XREF: MEM_EXT:CAC2.j
MEM_EXT:CAE2 12 B0 A8                                      lcall   MEM_EXT_B0A8
MEM_EXT:CAE5 80 1F                                         sjmp    MEM_EXT_CB06

Исследую подпрограмму MEM_EXT_B0A8 в конце концов приходим к такому коду:

MEM_EXT:B0EB                               MEM_EXT_B0EB:                       
                                           ; CODE XREF: MEM_EXT:B0D6.j
MEM_EXT:B0EB 7F 03                                         mov     R7, #3
MEM_EXT:B0ED 12 30 98                                      lcall   MEM_EXT_3098
MEM_EXT:B0F0 90 80 10                                      mov     DPTR, #MEM_EXT_8010
MEM_EXT:B0F3 E0                                            movx    A, @DPTR
MEM_EXT:B0F4 FE                                            mov     R6, A
MEM_EXT:B0F5 4F                                            orl     A, R7
MEM_EXT:B0F6 FF                                            mov     R7, A
MEM_EXT:B0F7 BF FF 21                                      cjne    R7, #0xFF, MEM_EXT_B11B
MEM_EXT:B0FA EE                                            mov     A, R6
MEM_EXT:B0FB 54 3F                                         anl     A, #0x3F
MEM_EXT:B0FD 60 1C                                         jz      MEM_EXT_B11B

Заметьте здесь магическую инструкцию ANL A, #0x3F. Если посмотреть чуть выше, то можно заметить инструкцию ORL A, R7. По аналогии с инструкцией ANL, догадываемся, что это есть на самом деле инструкция OR. Опять обращаемся к теории. Эта инструкия очень часто используется для проверки соответствия масок регионов дисковода и фильма. Если результат инструкции не 0xFF, фильм авторизован для проигрывания и если результат равер 0xFF нам дают отлуп. Как видно дальше в листинге идет интересная инструкция "CJNE R7, #0xFF, MEM_EXT_B11B", которая и выполняет вышеописанное. Здесь перед нами раскрываются широчайшие возможности как исправить эту несправедливость. :) В оригинальном варианте инструкция ORL A, R7 была заменена на CLR A (т.е. A = 0). В результате следующая инструкция MOV R7, A устанавливала регистр R7 равным 0, ну а команда CJNE работала как ей и полагалось - т.е. типа условный переход. :-))

Больше никаких изменений в прошивку вносить не требовалось (хотя оставался еще банк памяти 1 - насколько я понял все изменения там были аналогичны, даже совпадали оффсеты, но детальное исследование этого я оставлю вам в качестве упражнения).

Для того, чтобы вы могли самостоятельно покопать прошивку, я приложил ее к статье. Это оригинальная RPC-2 прошивка, вытащенная из моего дисковода. Листинг изменений, которые необходимо внести в прошиву, чтобы сделать ее RPC-1 представлен выше.

Желаю успехов!

Sten

2002-2013 (c) wasm.ru