PassMe 2 для Nintendo DS

В статье о «FlashMe» я писал о замкнутом круге, когда для установки этой кастомной прошивки нужно было купить PassMe или специальную плату для WiFiMe, чтобы в итоге избавиться от использования этих двух устройств.

И все было бы нормально, но основная проблема подкралась оттуда, откуда никто не ждал. Nintendo, выпуская более поздние версии Nintendo DS, изменили прошивку. PassMe с WiFiMe просто перестали работать и моментально устарели.

Конечно, это произошло неспроста. PassMe было прикольным устройством, которое использовали все homebrew-разработчики. Но пока устройство было не очень востребованным, Nintendo не обращали внимание на это. А вот когда к этому делу подключились пираты и стали выпускать готовые комплекты для пиратства, в Nintendo засуетились.

PassMe
Один из первых готовых комплектов для пиратства - картридж SuperPass и SuperCard.

И Passme, и WiFiMe использовали одну и ту же уязвимость – в заголовке картриджа подменялся адрес исполняемого файла игры на адресное пространство, находящееся в GBA флеш-картридже. Потом ARM7 процессор загружал исполняемый файл в оперативную память, а ARM9 сразу начинал загружать игру (ведь был принудительно включен автозапуск игры). Подробнее об этом читайте в статье: «PassMe».

Давайте остановимся чуть-чуть поподробнее на изменениях.

Изменения в прошивке

Nintendo не могли глубоко изменять консоль, ведь тогда, либо старые игры были бы не совместимы с новыми консолями, либо наоборот, новые игры были не совместимы со старыми консолями. То есть, фактически получается, что можно было менять прошивку консоли в достаточно ограниченном диапазоне, а BIOS процессоров вообще нельзя было трогать. Это, в свою очередь, означает, что остались другие уязвимости, которые можно было использовать, но об этом чуть позже.

Для того чтобы устранить проблему, PassMe достаточно было проверять, откуда исполняется код. И после всех изменений, точка входа в игру должна была находится строго в оперативной памяти консоли, по адресу: с 2000000h до 227FFFFh. То есть новая прошивка проверяла, что “entrypoint” процессора ARM7 не стоял в значении 080000C0h (именно такое значение устанавливал PassMe первой версии).

Проблема в том, что это решение ломало PassMe и WiFiMe, но никак не устраняло другие пробелы в безопасности.

Всё это стало предпосылками для появления устройства PassMe 2.

PassMe и PassMe2

История PassMe 2

Эта история начинается с постов пользователей, которые купили новые Nintendo DS и обратили внимание, что они теперь не работают с PassMe. На разных форумах стали появляться жалобы, но это никак не помогало найти выход из ситуации.

Для homebrew-разработчиков основная проблема заключалась в том, что нужно было купить консоль с новой прошивкой. А, как вы понимаете, на консолях нигде не было написано, новая она или старая. На руках продавцов еще было полно старых консолей.

Первым купить новую консоль получилось у Loopy (основной разработчик FlashMe). Он где-то смог достать версию iQue DS. А она точно была новой, ведь ее продажи стартовали только 23 июля 2005 года.

IQue DS

Loopy достаточно быстро установил какие были изменения в новой прошивке. Он нашел способ обхода введённых ограничений через SRAM память GBA флеш-картриджа, точка входа которой и находилась в диапазоне адресов оперативной памяти. Он даже переделал свой PassMe и выложил все необходимые файлы, чтобы другие пользователи могли повторить его путь.

PassMe iQue DS

Что же он придумал?

Он нашел интересное решение, связанное с SWI прерыванием.

Итак, вы включаете консоль и начинаются всякие процедуры с проверками картриджа на оригинальность. В какой-то момент, читая код с картриджа, процессор ARM7 доходил до первой ненулевой SWI функции.

Здесь чуть-чуть отвлечемся. Функции SWI (инструкции по программному прерыванию) просто прерывают работу процессора, когда, например, нужно выполнить какую-то важную функцию (или расчеты) прямо сейчас, а не ждать, пока до нее дойдет очередь. При этом в конце выполнения такой функции указывается адрес, откуда процессор должен продолжить выполнение программы. Использование таких функций зависит от разработчика каждой игры.

И вот тут вступал в работу PassMe2 – он подменял код, который должен был запуститься из SWI функции на нестандартный вызов BIOS ARM7 процессора, который переходил к SRAM памяти и начинал с ней работать. И вот именно на этом этапе и происходила главная подмена. В SRAM памяти находился код, который говорил процессору ARM7, о том, что нужно загрузить исполняемый файл игры в оперативную память. А дальше всё происходило по стандартному сценарию: когда ARM7 заканчивал загрузку, то говорил процессору ARM9, что все хорошо и можно продолжать работу, а последний начинал автозагрузку игры.

Но тут оставалось две проблемы:

Во-первых, нужен был картридж со SRAM памятью, а они стоили дорого.

Во-вторых, у всех оригинальных картриджей такое прерывание было в разном месте, а кое-где его просто не было.

Наличие флеш-картриджа со SRAM памятью — это проблема пользователей, которая решалась деньгами, тут homebrew разработчики не могли ничего сделать. А вот как узнать, в каком месте находится SWI прерывание в каждой конкретной игре - это большой вопрос. Особенно, если учитывать, сколько уже было разных игр на руках у пользователей.

Natrium42 написал программу callfinder.ds.gba (несмотря на разрешение .gba – это DS игра), которую можно было запустить на старой Nintendo DS, используя PassMe.

callfinder.ds.gba

Эта программа тестировала игру и возвращала адреса SWI функций. При этом функции не всегда использовались в каждой игре, поэтому иногда возвращалось значение 00000000. Если во всех четырех местах стояло значение 00000000, то игра не подходила.

А дальше DarkFader вручную правил код, который нужно было прошить на PassMe, под каждую конкретную игру. На его сайте можно было увидеть таблицу с готовыми файлами.

DarkFader таблица игр подходящих для PassMe2
Если справа в графах (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 о котором мы поговорим в следующей статье.

Информация РЕКЛАМА:
«ООО АЛИБАБА.КОМ» (РУ),
ИНН: 7703380158
Новинка: флеш-картридж SuperChis для GBA
Новинка: флеш-картридж SuperChis для GBA
Открыть на AliExpress