Оглавление
PassMe
Вы когда-нибудь задумывались как появились флеш-картриджи для Nintendo DS? Если вспомнить консоль Game Boy Advance, то первый флеш-картридж (Flash Advance) появился уже через два месяца после старта продаж самой консоли. А первый флеш-картридж для Nintendo DS появился только через два года!
Устройства для взлома Nintendo DS прошли путь от собранной на коленке платы PassMe до, произведенных в заводских условиях, Flash-картриджей.
PassMe - это первое устройство, которое позволило обойти защиту Nintendo DS и запускать на консоли Homebrew приложения.
История
Для того, чтобы рассказать об устройствах и людях, которые смогли взломать шифрование Nintendo DS, нужно поговорить о том, что представляла собой эта защита и как консоль загружала картриджи. Весь этот процесс очень особенный и начинается в момент нажатия кнопки включения консоли, а заканчивается в момент загрузки главного меню консоли.
Итак, вы включили Nintendo DS.
На плате Nintendo DS располагались два чипа BIOS, которые хранили данные, необходимые для процессоров:
BIOS размером 4 КБ, подключенный к шине ARM9.
BIOS размером 16 КБ, подключенный к шине ARM7.
Обратите внимание, что BIOS ARM7 процессора больше по размеру. Он хранит в себе данные шифрования. И доступ к этим данным открывается только один раз – при включении консоли. Наверняка вы обращали внимание, что если вставить картридж в Nintendo DS после включения, то он не отобразится и не запустится. Это связано с защитой. После того, как шифрование будет проверено и картридж подтвержден как оригинальный, таблица шифрования будет удалена из памяти.
Именно BIOSы отвечают за загрузку консоли и картриджа. У них было свое разделение, так BIOS ARM9 отвечал за загрузку всей консоли, а BIOS ARM7 отвечал за проверку и загрузку картриджа в оперативную память.
Условно, загрузку картриджа можно разделить на три части:
1. Считывание и запись заголовка в оперативную память;
2. Считывание и запись защищенной области в оперативную память;
3. Считывание и запись исполняемого файла игры в оперативную память;
Все тексты, картинки, музыка и другие файлы оставались на самом картридже.
Давайте поговорим подробнее о инициализации картриджа.
В заголовке картриджа находилось много разной информации, но с точки зрения стартовой загрузки интересны две строки: «Ключ 1», который нужен был для продолжения загрузки картриджа и строка с адресом исполняемого файла игры.
После того, как заголовок был перенесен и получены данные о ключе, в память копировалась защищённая область (она была "с завода" зашифрована этим ключом). После этого ее шифровали с помощью «Ключа 2» (этот ключ создавался путем смешения значения «Ключа 1» с разными случайными значениями, например временем). Затем все данные расшифровывались и проводилось сравнение получившегося проверочного значения с тем, что было изначально. И если что-то не совпадало, то данные затирались и копирование исполняемого файла не происходило. Учитывая количество используемых для шифрования данных, получить другое итоговое значение было крайне легко. В случае, если всё прошло хорошо, то исполняемый файл Nintendo DS загружался в основную память 4MB PSRAM, а исполняемый файл Game Boy Advance в память 64KB WRAM.
После того, как все загружено в память и готово к старту системы – загружалась основная оболочка Nintendo DS.
Где тут слабое место?
Разработчики Nintendo решили не зашифровывать весь картридж, потому что это привело бы к неоправданной нагрузке на процессор. Поэтому изначально шифрование применялось лишь к командам между картриджем и процессором (причем не всем командам, а только в определенный момент), а также была маленькая «Защищённая область» на самом картридже. Там хранилось итоговое значение, которое использовалось для проверки результатов (именно поэтому эта область была зашифрована).
А теперь давайте вернемся к истории взлома Nintendo DS.
Эта история начинается с устройства под названием PassMe, которое придумал человек, скрывающийся под ником DarkFader (Rafael Vuijk). В начале 2005 года его никто не знал, но чуть позже он станет достаточно знаменитым. Ведь DarkFader разработал самый первый способ взлома Nintendo DS, который позволил запускать нелицензионный код. А чуть позже он напишет и первый вирус для NDS. Потом будет долго извиняться за это и создаст программу, которая будет восстанавливать консоли. А затем его след затеряется. Интересно, как сложилась его судьба?
DarkFader, еще не имея на руках консоль, сразу написал, что хочет попробовать взломать Nintendo DS и ждет, пока она приедет к нему в Голландию.
Когда он впервые увидел Nintendo DS, то решил посмотреть, как взаимодействуют между собой картридж и консоль. Для этого он разработал целое устройство на базе FPGA (программируемая логическая микросхема). С одной стороны в это устройство вставлялся оригинальный картридж, а с другой стороны на ней была расположена самодельная плата (по форме картриджа), которая вставлялась в Nintendo DS.
К сожалению, фотографии этого устройства очень низкого качества.
Такое оборудование позволило не только отслеживать как общаются между собой картридж и консоль, а еще и менять код на лету. Он сразу увидел, что в оригинальном картридже есть заголовок с разными данными. Также у него получалось подменить данные заголовка.
После включения консоли таблица данных заголовка загружалась из картриджа в оперативную память. На этом этапе происходила главная подмена данных. В заголовке картриджа (который выглядел как таблица) менялись следующие данные:
Включалась автозагрузка картриджа (бит автозапуска изменялся с 0 на 1);
Для процессора ARM7 менялся адрес исполняемого файла (на 080000C0h) с Nintendo DS на Game Boy Advance картридж;
ARM9 процессор отправлялся в бесконечный цикл;
Исправлялся CRC код (из-за этого изначально можно было использовать только один картридж Metroid Prime Hunters, ведь правильное значение CRC вычислялось вручную).
Что получалось в итоге?
Вы включали консоль. Процессоры загружали свои BIOS. Дальше загружалась таблица заголовка из Nintendo DS картриджа (загружались уже измененные данные). ARM9 уходил в бесконечный цикл и ждал пока ARM7 закончит проверку NDS картриджа на оригинальность. И вот тут происходило самое интересное.
В обычном случае два исполняемых файла от NDS и GBA картриджа должны были загружаться в свою память (GBA в 64KB WRAM, NDS в 4MB PSRAM). Однако ARM9 процессор продолжал оставаться в бесконечном цикле, а ARM7 процессор вместо того, чтобы загружать исполняемый файл GBA картриджа в 64KB WRAM, загружал исполняемый файл GBA картриджа (там находилась NDS программа) в 4MB PSRAM. Это происходило из-за специального loader файла, который применялся к NDS ROM образу, фактически там стоял простой указатель -> загрузить в основную оперативную память PSRAM. После окончания загрузки ARM7 говорил процессору ARM9, что всё готово. В этот момент должна была произойти загрузка основной оболочки Nintendo DS. Но поскольку был включен автозапуск картриджа, то ARM9 сразу загружал игру.
Потом DarkFader выложил все файлы (в том числе и VHDL код) в интернет, и желающие могли бы повторить его путь. Но, как вы понимаете, далеко не многие могли бы это сделать. Скорее всё бы на этом и заглохло, если бы не Natrium42 (Алексей Карпенко), который решил сам попробовать собрать такое устройство. У него тоже получилось всё весьма громоздким:
Но я бы не стал о нем писать, если бы он смог просто повторить творение DarkFader. Natrium42 значительно уменьшил всю эту конструкцию. Он создал дизайн платы, основанный на CPLD схеме, причем ее размер был 3,5 см на 5,4, то есть не сильно больше, чем у обычного Nintendo DS картриджа. Сравните это с тем, что на фото выше.
Natrium42 выложил этот дизайн в интернет, но написал, что в нём могут быть ошибки. Он заказал печатные платы на заводе и чтобы не ждать, решил собрать прототип на коленке.
Но пока Natrium42 ждал, что ему дойдут платы, Lynx (другой участник NDS комьюнити) уже получил с завода плату по проекту Natrium42 и создал первый картридж, который назывался PassMe.
Самое интересное, что позже Lynx напишет, что у него тогда все не заработало. Но он все равно выложил новость на сайт gbadev.org.
Уж не знаю, работал ли тот самый первый собранный PassMe, но точно можно сказать, что эта тема не заглохла. Изначально Natrium42 не хотел делать готовое устройство. А это бы точно убило проект PassMe. Одно дело, когда вы покупаете готовое устройство и совсем другое - если вам приходится отдельно заказывать плату и искать чипы в магазинах, а потом всё это паять. Поэтому Lynx решил взять эту обязанность на себя. И начал производить готовый продукт.
Что PassMe представляет из себя?
Изначально PassMe умел не очень много. Это была плата, в которую вставлялся оригинальный Nintendo DS картридж.
Самое ужасное в этом, что картридж нужно было припаивать напрямую к плате. Обратите внимание на маленький оранжевый кусок пластика, он нужен был, чтобы PassMe защелкивался как оригинальный.
Позже появилась версия с PCI коннекторами и картридж уже не нужно было припаивать.
Дальше Natrium42 и Lynx придумали интересную фишку, они закупили разъемы от GameBoy и стали резать их пополам. Так отпала необходимость паять картридж к PassMe или делать эти несуразные коннекторы.
Тут нужно отметить один нюанс. На старте продаж Nintendo DS продавалась в комплекте с картриджем Metroid Prime Demo.
И первые PassMe работали только с ним. То есть если у вас не было этого картриджа, а был какой-то другой, то вы не могли использовать PassMe.
Но даже если у вас уже была демка игры и купленный PassMe, то что вы получали в итоге?
Вся эта конструкция позволяла запускать с Game Boy Advance флеш-картриджей homebrew Nintendo DS приложения, то есть изначально оригинальные игры от Nintendo запускать было нельзя. И это было вполне логично. Представьте, что вы установили игру на компьютер, а потом перенесли исполняемый exe файл (который запускает игру) в другое место. Этот файл просто не сможет найти ресурсы игры и выдаст ошибку. Так и здесь, исполняемый файл DS игры попал в правильную оперативную память, но сама игра обращается к NDS картриджу (а там другая игра) и просто не понимает, что файлы хранятся в другом месте.
Требовалась модификация игр, а никто не знал, как это сделать. Точнее DarkFader знал, как это сделать, но не выпустил никаких патчей или программ.
Распределенный взлом
Как я писал выше, первые PassMe работали только с картриджем Metroid Prime Demo. Проблема заключалась в том, что разработчики Nintendo включили в код игры проверку CRC.
Если говорить попроще, то любую программу (и даже строку или предложение) можно представить в виде двоичного кода. И в конце такого кода добавлялось значение, которое рассчитывалось по определенному алгоритму (CRC16 в случае Nintendo DS). Это значение было, по сути, проверочным для кода. То есть если значение совпадало, значит код был передан правильно, а если нет, значит произошла ошибка чтения и оперативная память консоли очищалась.
Теперь представим, что вы подменяете код на другой (как в нашем случае с адресом исполняемого файла), а значит и меняется итоговое значение CRC. Но консоль то не понимает этого и думает, что данные считались с ошибками, поэтому запуск кода не происходит.
Когда у всех на руках одна игра, то можно вручную подобрать такое значение. А что делать, если у каждого своя игра? Нужно каждый раз заново подбирать значение CRC, а это проблема.
Генерация CRC на Nintendo DS происходила с помощью сдвиговых регистров с линейной обратной связью (LFSR). Такой регистр использовался для генерации псевдослучайных чисел. Он отличался от случайного генератора чисел тем, что каждое последующее значение рассчитывалось по формуле, которая зависела от предыдущих чисел.
Для попытки взлома консоли DarkFader разработал программу, которая вычисляла значения LFSR из потока в обратном направлении. Но проблема была в том, что это требовало огромных затрат времени. Поэтому сообщество homebrew программистов Nintendo DS сделало из этого целое состязание. Можно было загрузить программу, а потом попасть в топ.
Очень многие откликнулись на это предложение и стали устанавливать приложение на свой компьютер. Результат был получен примерно через 30 часов. Но при этом суммарное время работы всех компьютеров, а их было более 100, составило 1763 часа, то есть 73 дня!
DarkFader получил все необходимые данные. Примерно через две недели после тестов он переписал VHDL код с динамической CRC генерацией. Это привело к тому, что теперь PassMe не нужна была конкретная игра, а подходила любая.
Эпилог
С этих событий начинается длинная история взлома Nintendo DS. Дальше произойдет очень много интересного и появится много разных устройств и способов обхода шифрования Nintendo DS. Программисты компании Nintendo будут пытаться модифицировать прошивку Nintendo DS, чтобы не допустить обхода защиты, но получится ли у них хоть что-то?
В следующей статье мы поговорим о появлении коммерческих клонов PassMe. Именно с них начинается эпоха Слот-2 Nintendo DS картриджей. И именно DarkFader приложил руку к созданию монополии NeoFlash.