Как устроен RGH ?

Автор: | Опубликовано в FAQ Мастерская, Xbox 360, Главная 13 Comments

reset_phat_mini2
В последнее время меня стали часто спрашивать про принцип действия Reset Glitch Hack. Чем был вызван такой интерес именно сейчас, мне не особо понятно. Но раз хотите, вот вам статья..

Сначала разберемся с процессом загрузки Xbox 360. Он состоит из нескольких загрузчиков, запускающих друг друга по цепочке:
bootchain
(более подробно можно почитать здесь)
Самый первый, 1BL, сидит в самом процессоре и никогда не меняется. Он один и тот же во всех приставках Xbox 360 (за исключением, возможно, Winchester)

Второй загрузчик (CB) привязан к Fuse #02 в процессоре. Таким образом, MS прикрывает уязвимые загрузчики — достаточно повысить значение этого фьюза и старый загрузчик просто не запустится. Так прикрыли JTAG. (подробнее про возможные конфигурации Fuse #02 читайте здесь)

Все они перед запуском следующего по очереди загрузчика, проверяют его на валидность. Если хоть немного изменить код, подпись оказывается нарушена и процесс загрузки оборвётся. Чтобы запустить свой код, необходимо подписать модифицированный загрузчик (что невозможно без секретного ключа) или каким-то способом обойти проверку. Последнюю идею и реализует RGH.

    Что такое POST BUS?

postbus
Это восьмибитная параллельная шина, в которую легко записать некоторое число прямо из кода загрузчика. Используется для отладки, проверки работоспособности процессора после изготовления, ну и для RGH 🙂
Благодаря тому, что в процессе загрузки в определенных участках кода происходит запись в эту шину, мы можем определить, на каком этапе исполнения находится процессор! Например, перед началом проверки подписи CB_B, значение шины меняется на 0xDA

    Как запускается неподписанный код?

Основная цель — запустить свой неподписанный загрузчик CD. В случае с одиночным загрузчиком CB, достаточно было «пропустить» лишь одну проверку. В двойной версии, поделённой на CB_A и CB_B, проверки были значительно усилены, так что без модификации CB_B не обойтись. Но CB_B зашифрован ключом CPU, который неизвестен! Как же его модифицировать? К счастью, особенности шифрования RSA таковы, что зная дешифрованные данные, можно поменять их даже не зная ключа. Модифицированный CB_B, конечно же, не будет проходить проверку в CB_A, но мы её «обходим» 🙂

    И как же мы обходим проверки?

Переходим к самым-самым деталям. Почитать подробнее можно здесь.
Основная идея в выключении процессора на очень малое время. При этом, сбрасывается регистр, отвечающий за проверку подписи! (там условие «если 0, то продолжить» — вот тот ноль мы и создаем) Но помимо регистра условия, есть и другие регистры — например, регистр, содержащий адрес CD в памяти. Если он тоже очистится, проверка пройдёт, но система не запустится. В этом и заключается основная проблема стабильности RGH — очистить один регистр, не зацепив другие!

    Ок, как это происходит?

Для выключения процессора, чип посылает сигнал ‘0’ на точку CPU_RST. Подать нужно в определенный момент и на определенное время. Необходима очень высокая точность, поэтому процессор желательно замедлить. В RGH1 для этого использовалась точка PLL, она замедляла процессор в 128 раз, так достигалась превосходная точность и высокая стабильность. На Slim подобной точки найти не смогли, поэтому замедление происходит по шине i2c, всего лишь в 3.1764 раза. Почему так мало? i2c позволяет замедлять и сильнее, но процессор начинает противиться, работая не на той частоте, что задали! При замедлении в 3 раза всё работает более-менее стабильно, так и оставили.

Какртинка в заголовке статьи показывает как примерно должен выглядеть импульс глича моей прошивки под x360ace
reset_phat_mini

    Хм. Тогда почему бы не использовать PLL в случае с RGH2?

При таком сильном замедлении выполнения кода CB_B, процессор перестает работать. Причина мне неизвестна.

    А что такое R-JTAG?

Как я уже писал, JTAG был прикрыт путём повышения значения Fuse #02. Старый загрузчик не запускается, потому что проваливается проверка этого самого фьюза. Вот в R-JTAG эта проверка и обходится с помощью чипа.

    MS ведь пыталась прикрыть RGH?

Да, конечно. Начиная с обновления 14717, в CB_A и CB_B отсутствует запись в POST_BUS, что должно было оставить RGH без точки отсчёта. Обошли эту проблему быстро — проверка Fuse #02 происходила в CB_B, так что хакеры использовали старый CB_A и ещё больше модифицировали CB_B.

Обновление 15572 принесло новый вид шифрования CB_B и невозможность его модификации без ключа CPU. Первое решение было от Team Xecuter — DGX чип. Он позволял запускать незашифрованный CB_B, пропуская сначала процедуру расшифровки, а затем и проверку подписи. Такой двойной обход был очень нестабилен, но всё же работал. Получив ключ CPU, можно было вернуться к старым чипам.

Ну а дальнейшее вам известно — ушлые китайцы добыли сервисный загрузчик MS, который запускал CB_B, зашифрованный нулевым ключом. И больше не было необходимости модифицировать родной CB_B, получился унивесальный образ для любых приставок.

После неудачи с программным отключением POST_BUS, летом 2012 MS просто убрали доступ к шине, убрав дорожки к точкам. Но после нашего релиза и эта проблема была решена. TX выпустили постфикс, китайцы успешно его скопировали, все счастливы.

Наконец, самая последняя ревизия Xbox 360, Winchester на данный момент считается невзламываемой. Обычных сигналов на шине POST нет даже с сервисным загрузчиком. Необходимо искать новую опорную точку. Но кому уже нужна консоль десятилетней давности?

Comments
  1. Posted by arch_saint
    • Posted by RichY
  2. Posted by vitas-iv
    • Posted by RichY
  3. Posted by guido970
    • Posted by RichY
  4. Posted by Armorant
  5. Posted by tesak47
  6. Posted by Mike
  7. Posted by Erik
  8. Posted by Dimuspav
  9. Posted by gusew
    • Posted by gusew

Add Your Comment