Как всем известно, новые игры, требующие повышенную прошивку, не желают запускаться, пока эта прошивка не будет установлена.
От чего же это происходит?
Какая-то защита, проверяющая версию прошивки по каким-то файлам во Flash0?
Такой вопрос возникал наверное у каждого. Но всё намного проще. Просто-напросто, запускающий файл PRX, он же EBOOT.BIN, находящийся в образе по адресу disk0:/PSP_GAME/SYSDIR/..., упакован в специфический запароленный архив (KL3E, KL4E или RLZ). Так вот, чтобы запустить игру, необходимо подставить пароль на архив, после чего файл извлекается в расшифрованном виде и приобретает рабочее состояние.
Получается такое дело, что предыдущая версия прошивки просто не имеет нового пароля. Вот поэтому новая игра не может запуститься.
Чтобы запускались современные игры, а так-же предыдущие, необходимо, чтобы прошивка имела все предыдущие пароли, называемые по другому - ключи.
Но если запускающий файл игры EBOOT.BIN будет находиться в образе уже в распакованном виде, то естесственно нет необходимости подставлять ключ для распаковки.
Таким образом, SONY прибегает к такому, несколько примитивному методу борьбы с пиратством и в случае взлома пароля от существующей прошивки, выпускает новую версию прошивки, добавляя каждый раз ещё один новый ключ к играм. И конечно, ещё по ключу для распаковки файлов самой прошивки для PSP-1000 и 2000.
Правда некоторые производители игр добавляют к этому ещё свою защиту - на проверку версии прошивки. Но и эта защита была найдена и пофиксена. Как вы знаете, впервые mc707 обнаружил её и выпустил Eboot.bin.Patcher для понижения версии.
Каким же образом работает механизм распаковки зашифрованных файлов?
Чтобы подобрать необходимый ключ под определённый вид файла, сначала определяется "Тег" по заголовку этого файла, состоящий из 4-ёх байт. А уже по этому тегу подставляется необходимый ключ, соответствующий именно этому тегу. В файлах EBOOT.BIN игр этот Тег записан по адресу 0хD0. Его можно увидеть через любой Хекс-редактор или даже через UMDGen:
Скрин
Определив номер тега, подставляется соответствующий ключ и файл рапаковывается в память, приобретая рабочий вид.
Но где-же хранятся все эти теги и ключи к ним?
Вот тут и приходит на ум название файла в названии темы =)).
Итак, я взял на исследование файл loadexec_01g.prx из Flash0 своей толстушки с прошивкой 5.00 М33-6.
Декриптовал его с помощью PRXdecrypter v2.3 и получил ELF-файл в заголовке, как и положено быть декриптованному файлу:
Скрин
Ну и решил сразу проверить на наличие уже известного Тега для прошивки 5.00 - F0 16 94 4C (0х4C9416F0), который можно посмотреть по таблице тегов. И да, тут-же нашёл этот тег в этом файле. Вот он, выделен на скрине чёрным:
Скрин
Но посмотрев немного выше, я обнаружил аббревиатуру "~PSP". В голову пошли подозрительные мысли...
Отсчитав выделением от начала этой аббревиатуры ~PSP до начала найденного тега, получилось смещение ровно D0:
Скрин
Что за чёрт, это ведь тег зашифрованного файла, который находится внутри декриптованного loadexec_01g.prx. Сразу всё встало на места, вспомнив про извлечение какого-то непонятного reboot.bin с помощью PRXdecrypter. Ну и PSARDumper так-же извлекает этот reboot.bin, но происхождение его и использование было не понятным, т.к. в прошивках такого файла не встречается.
Вот где собака зарыта!
Так как PRXdecrypter и PSARDumper почему-то из loadexec_01g(_02g).prx извлекают и декриптуют reboot.bin без заголовка ELF, что мне не понравилось, то мне было проще и быстрее извлечь этот файл целым вручную.
Зная, что размер всего PRX-файла записывается по адресу 0х2С, то я отсчитал от начала это количество байт и посмотрел размер этого файла:
Скрин
Итак, я прочитал размер с позиции 0х2С задом-наперёд как 0х00009480, отображаемый на скрине красным, выделил этот файл, скопировал в новый пустой документ и сохранил под названием reboot.bin.
После декриптовки получил странный файл с названием в заголовке "KL3E", что наводило на мысль об одноимённом формате сжатия:
Скрин
То есть я получил декриптованный файл, но в сильно сжатом виде.
Посмотрев в зашифрованном файле в позиции 0х28 (можно увидеть на предыдущем рисунке), где записан размер декриптованного файла 0х00009324 (37668 байт) и сверив с моим декриптованным, я удостоверился, что всё в точности сходится, а значит декриптовка произошла правильно.
Но, что и следовало ожидать, размер аналогичного файла, извлечённого с помощью PRXdecrypter или PSARDumper был больше в 2 с лишним раза - 76188 байт, из-за того, что файл помимо декриптовки, был ещё и расжат, в отличии от моего, просто декриптованного.
Никакие попытки расжать этот, известный всем декрипторам формат "KL3E" не увенчались успехом. Поэтому мне пришлось убрать его в сторону и просто воспользоваться извлечённым и расжатым reboot.bin с помощью PRXdecrypter-а.
А что-же дальше, в чём соль?
А делалось всё это, в попытке найти теги и ключи, предположительно в этом файле - loadexec_01g(_02g).prx, который в себе ещё содержит reboot.bin.
Итак, искомый файл у нас есть от прошивки 5.00. Теперь требуется найти в нём известные уже теги, характерные этой прошивке. Возьмём их из составленной таблицы, где я выписал известные в свободном доступе теги с ключами:
В reboot.bin от PSP-100x был найден соответствующий тег:
Скрин
В reboot_02g.bin от PSP-200x было найдено 2 тега:
Скрин
Только вот где лежат сами ключи к этим тегам, вероятно в mesg_led.prx или memlmd.prx. А это уже вопрос времени и дизасма )).
И есть ещё 2 тега, сохранившихся со старых прошивок 3.30 и до сих пор не менявшихся.
Один из которых идёт на распаковку конкретно vshmain.prx.
Второй - на прочие не системные файлы прошивки.
И есть 3-ий - для запуска игр, требующих прошивку 5.00. Ключи-то нам известны, но вот где хранятся они - пока загадка.