Оглавление
PassMe
Вы когда-нибудь задумывались как появились флеш-картриджи для Nintendo DS? Если вспомнить консоль Game Boy Advance, то первый флеш-картридж (Flash Advance) появился уже через два месяца после старта продаж самой консоли. А первый флеш-картридж для Nintendo DS появился только через два года!
Устройства для взлома Nintendo DS прошли путь от собранной на коленке платы PassMe до, произведенных в заводских условиях, Flash-картриджей.
PassMe - это первое устройство, которое позволило обойти защиту Nintendo SD и запускать на консоли Homebrew приложения.
История
Для того, чтобы рассказать об устройствах и людях, которые смогли взломать шифрование Nintendo DS, нужно поговорить о том, что представляла собой эта защита.
Наверняка вы обращали внимание, что если вставить картридж в Nintendo DS после включения, то он не отобразится и не запустится. Так происходит, потому что процессор ARM7 при включении консоли проверяет картридж и в случае, если тесты прошли успешно, начинают загружаться исполняемые файлы в основную память.
Разработчики Nintendo решили не зашифровывать весь картридж, потому что это привело бы к неоправданной нагрузке на процессор. Поэтому изначально шифрование применялось лишь к командам между картриджем и процессором, а также была маленькая «Защищённая область» на самом картридже. Там хранилось итоговое значение, которое использовалось для проверки результатов (именно поэтому эта область была зашифрована).
Что происходит при включении консоли со вставленным картриджем?
Консоль Nintendo DS брала из заголовка картриджа различные данные, в том числе уникальный идентификатор игры и использовала его для создания «Ключа 1». Потом с помощью этого ключа копировалась в память «Защищённая область» (она была "с завода" зашифрована этим ключом), после чего ее шифровали с помощью «Ключа 2» (этот ключ создавался путем смешения значения «Ключа 1» с разными случайными значениями, например временем). А потом все данные расшифровывались и проводилось сравнение получившегося проверочного значения с тем, что было изначально. И если что-то не совпадало, то данные затирались и запуск картриджа не происходил. Учитывая количество используемых для шифрования данных, получить другое итоговое значение было крайне легко.
Но самое интересное - дальше. Как я писал выше, консоль берет заголовок картриджа, который имеет различные значения, необходимые для запуска игры. В этом перечне данных был и адрес, который указывал с какого файла начать исполнение игры. Изначально эти данные не были никак зашифрованы. То есть консоли, чтобы включить шифрование, нужно было скачать таблицу данных из заголовка и потом включалось шифрование команд. А это значит, что можно было подменить адрес, откуда должна была исполняться игра, еще до шифрования. И такая подмена ни на что не влияла, потому что только уникальный идентификатор игры для шифрования использовался.
Поэтому передача такого адреса, без проверки откуда будет исполняться код, и было слабым местом Nintendo DS.
А теперь давайте вернемся к истории взлома Nintendo DS.
Эта история начинается с устройства под названием PassMe, которое придумал человек, скрывающийся под ником DarkFader (Rafael Vuijk). В начале 2005 года его никто не знал, но чуть позже он станет достаточно знаменитым. Ведь DarkFader разработал самый первый способ взлома Nintendo DS, который позволил запускать нелицензионный код. А чуть позже он напишет и первый вирус для NDS. Потом будет долго извиняться за это и создаст программу, которая будет восстанавливать консоли. А затем его след затеряется. Интересно, как сложилась его судьба?
DarkFader, еще не имея на руках консоль, сразу написал, что хочет попробовать взломать Nintendo DS и ждет пока она приедет к нему в Голландию.
Когда он впервые увидел Nintendo DS, то решил посмотреть, как взаимодействуют между собой картридж и консоль. Для этого он разработал целое устройство на базе FPGA (программируемая логическая микросхема). С одной стороны в это устройство вставлялся оригинальный картридж, а с другой стороны на ней была расположена самодельная плата (по форме картриджа), которая вставлялась в Nintendo DS.
К сожалению, фотографии этого устройства очень низкого качества.
Такое оборудование позволило не только отслеживать как общаются между собой картридж и консоль, а еще и менять код на лету. Он сразу увидел, что в оригинальном картридже есть заголовок с разными данными. Также он обнаружил, что можно обмануть консоль путем подмены адреса исполняемого файла и заставить ее запускать NDS код не с оригинального картриджа, а с GBA картриджа.
После включения консоли таблица данных заголовка загружалась из картриджа в оперативную память. В это время с помощью промежуточного устройства указатель адреса исполняемого файла подменялся на другой. Nintendo DS делала стандартные проверки (все что нужно шифровалось), а потом процессор ARM9 должен был начать загружать исполняемый файл в оперативную память. Он обращался по уже исправленному адресу и в этот момент начинало происходить исполнение кода из GBA флеш-картриджа.
Потом 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 картридж.
Самое ужасное в этом, что картридж нужно было припаивать напрямую к плате.
Дальше Natrium42 и Lynx придумали интересную фишку, они закупили коннекторы от GameBoy и стали резать их пополам. Так отпала необходимость паять картридж к PassMe.
Тут нужно отметить один нюанс. На старте продаж Nintendo DS продавалась в комплекте с картриджем Metroid Prime Demo.
И первые PassMe работали только с ним. То есть если у вас не было этого картриджа, а был какой-то другой, то вы не могли использовать PassMe.
Но даже если у вас уже была демка игры и купленный PassMe, то что вы получали в итоге?
Вся эта конструкция позволяла запускать с Game Boy Advance флеш-картриджей homebrew Nintendo DS приложения, то есть изначально оригинальные игры от Nintendo запускать было нельзя.
Требовалась модификация игр, а никто не знал, как это сделать. Точнее 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.