Оглавление
PassMe 2
В статье о «FlashMe» я писал о замкнутом круге, когда для установки этой кастомной прошивки нужно было купить PassMe или специальную плату для WiFiMe, чтобы в итоге избавиться от использования этих двух устройств.
И все было бы нормально, но основная проблема подкралась оттуда, откуда никто не ждал. Nintendo, выпуская более поздние версии Nintendo DS, изменили прошивку. PassMe с WiFiMe просто перестали работать и моментально устарели.
Конечно, это произошло неспроста. PassMe было прикольным устройством, которое использовали все homebrew-разработчики. Но пока устройство было не очень востребованным, Nintendo не обращали внимание на это. А вот когда к этому делу подключились пираты и стали выпускать готовые комплекты для пиратства, в Nintendo засуетились.
Один из первых готовых комплектов для пиратства - картридж SuperPass и SuperCard.
И Passme, и WiFiMe использовали одну и ту же уязвимость – в заголовке картриджа подменялся адрес исполняемого файла игры на адресное пространство, находящееся в GBA флеш-картридже. Потом ARM7 процессор загружал исполняемый файл в оперативную память, а ARM9 сразу начинал загружать игру (ведь был принудительно включен автозапуск игры). Подробнее об этом читайте в статье: «PassMe».
Давайте остановимся чуть-чуть поподробнее на изменениях.
Изменения в прошивке
Nintendo не могли глубоко изменять консоль, ведь тогда, либо старые игры были бы не совместимы с новыми консолями, либо наоборот, новые игры были не совместимы со старыми консолями. То есть, фактически получается, что можно было менять прошивку консоли в достаточно ограниченном диапазоне, а BIOS процессоров вообще нельзя было трогать. Это, в свою очередь, означает, что остались другие уязвимости, которые можно было использовать, но об этом чуть позже.
Для того чтобы устранить проблему, PassMe достаточно было проверять, откуда исполняется код. И после всех изменений, точка входа в игру должна была находится строго в оперативной памяти консоли, по адресу: с 2000000h до 227FFFFh. То есть новая прошивка проверяла, что “entrypoint” процессора ARM7 не стоял в значении 080000C0h (именно такое значение устанавливал PassMe первой версии).
Проблема в том, что это решение ломало PassMe и WiFiMe, но никак не устраняло другие пробелы в безопасности.
Всё это стало предпосылками для появления устройства PassMe 2.
История PassMe 2
Эта история начинается с постов пользователей, которые купили новые Nintendo DS и обратили внимание, что они теперь не работают с PassMe. На разных форумах стали появляться жалобы, но это никак не помогало найти выход из ситуации.
Для homebrew-разработчиков основная проблема заключалась в том, что нужно было купить консоль с новой прошивкой. А, как вы понимаете, на консолях нигде не было написано, новая она или старая. На руках продавцов еще было полно старых консолей.
Первым купить новую консоль получилось у Loopy (основной разработчик FlashMe). Он где-то смог достать версию iQue DS. А она точно была новой, ведь ее продажи стартовали только 23 июля 2005 года.
Loopy достаточно быстро установил какие были изменения в новой прошивке. Он нашел способ обхода введённых ограничений через SRAM память GBA флеш-картриджа, точка входа которой и находилась в диапазоне адресов оперативной памяти. Он даже переделал свой PassMe и выложил все необходимые файлы, чтобы другие пользователи могли повторить его путь.
Что же он придумал?
Он нашел интересное решение, связанное с SWI прерыванием.
Итак, вы включаете консоль и начинаются всякие процедуры с проверками картриджа на оригинальность. В какой-то момент, читая код с картриджа, процессор ARM7 доходил до первой ненулевой SWI функции.
И вот тут вступал в работу PassMe2 – он подменял код, который должен был запуститься из SWI функции на нестандартный вызов BIOS ARM7 процессора, который переходил к SRAM памяти и начинал с ней работать. И вот именно на этом этапе и происходила главная подмена. В SRAM памяти находился код, который говорил процессору ARM7, о том, что нужно загрузить исполняемый файл игры в оперативную память. А дальше всё происходило по стандартному сценарию: когда ARM7 заканчивал загрузку, то говорил процессору ARM9, что все хорошо и можно продолжать работу, а последний начинал автозагрузку игры.
Но тут оставалось две проблемы:
Во-первых, нужен был картридж со SRAM памятью, а они стоили дорого.
Во-вторых, у всех оригинальных картриджей такое прерывание было в разном месте, а кое-где его просто не было.
Наличие флеш-картриджа со SRAM памятью — это проблема пользователей, которая решалась деньгами, тут homebrew разработчики не могли ничего сделать. А вот как узнать, в каком месте находится SWI прерывание в каждой конкретной игре - это большой вопрос. Особенно, если учитывать, сколько уже было разных игр на руках у пользователей.
Natrium42 написал программу callfinder.ds.gba (несмотря на разрешение .gba – это DS игра), которую можно было запустить на старой Nintendo DS, используя PassMe.
Эта программа тестировала игру и возвращала адреса SWI функций. При этом функции не всегда использовались в каждой игре, поэтому иногда возвращалось значение 00000000. Если во всех четырех местах стояло значение 00000000, то игра не подходила.
А дальше DarkFader вручную правил код, который нужно было прошить на PassMe, под каждую конкретную игру. На его сайте можно было увидеть таблицу с готовыми файлами.
Если справа в графах (PassMe CPLD и PassMe SRAM) нет файлов, то игра не подходит.
Оставалось только перепрошить PassMe под конкретную игру и записать сохранение в SRAM память. После этого у вас все должно было работать.
PassMe и PassMe 2 на 99% похожи. Основная разница только в прошивке. Причем, если PassMe 1 работает с любой игрой, то для PassMe 2 подходит только та игра (картридж), на которую он изначально запрограммирован.
Эпилог
У Nintendo не получилось победить сообщество homebrew разработчиков. Не прошло и трех месяцев с момента появления Nintendo DS с новой прошивкой, как появились PassMe 2. Это устройство стало еще менее удобным, чем классический PassMe, но все еще выполняло свои функции.
Но нельзя сказать, что всё это было бесполезным: PassMe и PassMe2 стали важными вехами в развитии Nintendo DS флеш-картриджей. Не за горами было появление устройства NoPass о котором мы поговорим в следующей статье.