Данным методом, о котором пойдёт речь ниже, запакованы все кастомные файлы кастомной прошивки:
kd
galaxy.prx
idcanager.prx
march33.prx
popcorn.prx
systemctrl.prx
usbdevice.prx
vshctrl.prx
vsh/module
recovery.prx
satelit.prx
А так-же, этим способом можно распаковывать и запаковывать любые кастомные файлы PRX, файлы тем, программ и игр Homebrew и т.п..
После успешного усвоения данного урока, у вас на декриптовку будут уходить считанные секунды... Итак, начнём!
Наша работа будет производится в 3 этапа:
Данные файлы состоят из двух частей - Заголовка ~PSP и собственно самого Исполняемого Кода ELF.
"Заголовoк ~PSP" - это та часть кода, которая содержит технические данные о файле и метод защиты (проверка целостности данных). Находится в начале файла от 0х00 до 0х14F включительно в 16-ричной системе исчисления и содержит ровно 0х150 Байт (336 байт)
Примечание: когда перед цифрами пишем 0х или после символ h - имеется в виду шестнадцатеричное число.
Например 0х150 либо 150h байт в 16-ричной системе = 336 байт в десятичной.
"Исполняемый Код ELF" - находится после Заголовка, начиная от 0х150 включительно и до конца файла. Как оказалось - это попросту самодостаточный архив GZIP. Такой архив легко можно распаковать любым современным архиватором WinRar, 7Zip, ZIP и пр.
Архивный файл GZIP должен иметь расширение .gz на конце, после точки.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I. Декриптовка
Декриптовка - это самый лёгкий и быстрый этап.
Для примера я взял файл recovery.prx из flash0 своей прошивки, который лежит в папке: flash0:/vsh/module/...
Вам понадобится Хекс-редактор, после установки которого, у вас появиться в контекстном меню при клике правой кнопкой мыши на файле - пункт "Hex Edit with Hex Workshop".
Нажмите правой кнопкой на файле recovery.prx, предварительно скопированном из прошивки на компьютер и выберите в открывшемся контекстном меню этот пункт "Hex Edit with Hex Workshop". Этот файл откроется в Хекс-редакторе.
Скрин
Как я говорил в предисловии, файлы в прошивке находятся в запакованном виде. На это указывает начало файла в заголовке в правом столбце: ~PSP
1.Заголовoк - ~PSP - это та часть кода, которая содержит технические данные о файле и метод защиты (проверка целостности данных).
Находится в начале файла от 0х00 до 0х14F включительно в 16-ричной системе исчисления и содержит ровно 0x150 Байт
Здесь, как раз, вы этот заголовок и видите. Он выделен чёрным цветом с красной окантовкой и составляет ровно 0x150 байт, о чём свидетельствуют цифры внизу, в выделенной красным рамке (Sel от слова Select - выбрано, выделено):
Если у вас таблица выглядит не так как на рисунке, то для представления в однобайтном формате, сделайте следующее:
зайдите в меню "Options->Preferences..." и выставьте так, как показано на рисунке ниже, затем нажмите кнопку "ОК":
Теперь мы видим числа побайтово, то есть попарно по два числа. Один байт - это двухзначное число в 16-ричной системе исчисления от 00 до FF.
Нам нужно из файла выдернуть "Исполняемый код ELF", который фактически и есть GZIP-архив, о котором я упоминал в предисловии. Он начинается от 0х150 включительно и до конца файла, сразу после "Заголовка ~PSP", выделенного на скрине выше. Чем мы и займёмся далее...
Ставим курсор в начало строки 0х150. Число 0х150 - это не что иное, как 00000150 в левом вертикальном столбце отсчёта, просто записываются, для удобства, без лишних нулей спереди. Эта цифра так же отображается в нижней строке окна программы под названием "Caret: 00000150" и указывает на позицию, где находится курсор, как показано на рисунке ниже:
Нажмите в верхнем меню "File->Save As...".
В открывшемся окне сохранения введите название файла, как "recovery.gz" и нажмите кнопку "Сохранить" - не забыли, что это у нас GZIP-архив?
После сохранения, код в хекс-редакторе изменится с красного на чёрный. Теперь вы можете совсем закрыть хекс-редактор и перейти в папку с сохранённым только-что GZIP-архивом.
Разархивируйте полученный архив любым архиватором. Вы получите файл "recovery", но без всякого расширения. Нажмите на файле правой кнопкой мыши и выберите из раскрывшегося контекстного меню пункт "Переименовать". Добавьте расширение ".prx" к названию файла "recovery" и нажмите Enter. Правда можно было обойтись с переименованием, если бы вы сразу сохраняли файл под названием "recovery.prx.gz", тогда он уже лежал бы в архиве с нужным расширением.
Но мне просто захотелось усложнить вам задачу ))).
Всё, декриптованный файл "recovery.prx" у вас готов!!!
Убедиться в этом можно, открыв его в хекс-редакторе и увидев заветное слово ELF в начале файла:
Скрин
Если вы видите эти три буквы ELF в начале файла, то знайте, что перед вами - декриптованный файл.
А когда вы видите слово ~PSP в начале файла, то перед вами упакованный зашифрованный файл.
Выделите весь код файла, нажав CTRL + A и запишите на бумажке значения всего выделенного декриптованного ELF-файла внизу в области Sel: 0xF55E. Эта цифра нам понадобится в самом конце при криптовке, не забудьте!
В общем, декриптовка определённого файла подразумевает последующую его кастомизацию, в данном случае русификацию, иначе для чего же его декриптовать.
Тут я подумал, зачем же я взял для примера этот recovery.prx?
И..., надумал встроить в него поддержку русских символов.
Как вам известно, в рекавери-меню нет поддержки кириллицы и если вы положите файл с переводом ru_recovery.txt в папку "seplugins" или в корень flash1, то в рекавери-меню вместо русских букв появятся крякозяблики.
Предисловие
Буквы, как известно, нарисованы на квадратике - 16 символов в ширину и 16 рядов в высоту, итого 16х16=256 символов, что соответствует максимальной величине FF в шестнадцатеричной системе. Каждый квадратик с символом (буквой), в свою очередь, состоит из 64-х пикселей по 1 биту. То есть, каждый символ составляет ровно 8 байт, исходя из того, что 1 байт = 8 бит.
Так вот, из этой картинки и берутся буквы, цифры и прочие символы, которые мы видим на экране PSP в виде упорядоченного текста.
В рекавери-меню от Dark_Alex, нет русского алфавита и выглядит его таблица символов так:
А если учесть, что русская кодировка символов находится в диапазоне C0 - FF, как раз в том месте, где находятся всякие ненужные треугольники, кирпичики и гиперборейские символы, то в результате мы имеем в распоряжении полноценный англо-русский алфавит:
Причём все символы из таблицы в Хексе будут иметь код именно такой, если вы возьмёте значения, которые я пронумеровал слева и сверху.
Берём значение по вертикали и добавляем к нему значение по горизонтали, как в шахматах.
Например улыбающийся смайлик, будет иметь код в хексе - 01
Буква Z будет иметь код - 5А
А маленькая русская буква я будет иметь код - FF
Как-же выглядит этот алфавит в Хекс-редакторе и как его отыскать там?
Насколько вы понимаете, иностранные разработчики в таблицу символов не встраивают русский язык, поскольку их это не особо заботит.
Откройте файл, который вы хотите русифицировать.
Нажмите кнопку "Поиск" и введите значение 3C42A581 - это значение в хексе и определяет первые символы в кодовой странице.
Но, перед этими значениями ещё необходимо сделать отступ на 8 нулевых байтов к началу. Поэтому от найденных значений 3C42A581, отсчитайте 8 байт назад. Ведь, как видно на матрице (картинке) с символами, первый символ пустой и составляет 8 байт.
Выделите код, размером ровно 2048 байт. Так как один символ равен 8 байт, а таких символов в матрице 256, то и получаем размер всей матрицы ровно 2048 байт.
Во время выделения, внизу хекс-редактора будет показываться количество выделенной области. В десятеричном отображении вам надо выделить 2048 байт, а в шестнадцатеричном виде эта цифра будет выглядить как 800 шестнадцатеричных символов.
Скопируйте выделенный код и вставьте в новый документ в хекс-редакторе, и сохраните его как, например FONT.BIN. Это и будет бинарная матрица шрифта.
Теперь вы можете посмотреть этот файл в RomArtist_v1.42.rar и наглядно, без искажений, увидеть таблицу символов, состоящую из алфавита с дополнительными символами. Программа, так-же, позволяет редактировать эту таблицу вручную.
Вы можете вручную вставить на место выделенной таблицы другую, нарисованную вами или уже готовую ruFont.zip, содержащую наряду с английскими, русские символы.
А выглядит эта таблица символов в хексе вот так:
Таблица символов в Хексе
P.S. Для разработчиков: чтобы каждый раз, после компилирования, не искать вручную таблицу символов в скомпилированной программе, чтобы вставить русский шрифт, проще сразу заменить матрицу шрифтов в библиотеке, где она содержиться и вставляется в программу при каждой компиляции.
Эта библиотека находится здесь: c:\pspsdk\psp\sdk\lib\libpspdebug.a
Итак, приступим к русификации!
1. Если вы так и не поняли, из написанного выше, как самому вручную извлечь и вставить свою матрицу шрифтов, то воспользуйтесь программкой, написанной Andy_maN, которая содержит в себе бинарник картинки с англо-русскими символами: PatcheR.1.0b.zip.
2. Запустите файл "PatcheR.1.0b.exe"
3. В первой строке "Что будем патчить:", нажмите на квадратик справа и в открывшемся проводнике укажите ваш декриптованный файл recovery.prx:
4. Этот пункт можете пропустить, но если вы нарисовали свой шрифт и хотите его использовать, то переходите ко второй строчке "Файл патча:", нажмите на квадратик справа ниже и укажите на ваш файл шрифта (2048 байт):
6. Всё, ваш recovery.prx русифицирован!
Такой, декриптованный пока ещё, файл можно положить на место во flash0:/vsh/module/... и он будет прекрасно работать. Не забудьте только положить текстовой документ с переводом ru_recovery.txt в папку "seplugins" или в корень "flash1".
7. Наслаждайтесь русским рекавери-меню!
Но, заметьте, ваш декриптованный файл теперь весит 61,3 Кб (62814 байта), а изначальный исходник весил 25,1 Кб (25784 байта) - это почти в два с половиной раза больше места занимает во flash0.
Чтобы исправить ситуацию, лучше его обратно упаковать и закриптовать.
Поэтому переходим к третьему пункту:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
III) Запаковка с новой криптовкой.
Запаковать обратно вручную так же просто как и распаковать.
Наш декриптованный и русифицированный файл recovery.prx теперь нужно обратно заархивировать в GZIP-архив с нормальной степенью сжатия. Если сильно сжать, то потом просто может немного притормаживать, а так на работоспособность степень сжатия никак больше не влияет. Для этого воспользуйтесь архиватором 7-Zip.
WinRar, к сожалению, не умеет архивировать в GZIP, только разархивировать.
1. Предварительно, прежде чем архивировать, его можно переименовать как заблагорассудится, даже без расширения.
Я, например, его переименовал так: Andy_maN_lupus_ErikPshat_PSPx.Ru - в честь разработчиков русификатора, ну и себя любимого :-), а так же нашего сайта. Для чего? Узнаете далее...
2. Запаковываем в GZIP наш кастомизированный файл recovery.prx ака Andy_maN_lupus_ErikPshat_PSPx.Ru.
2.1. Нажмите правой кнопкой мыши на нашем файле и выберите
в открывшемся контекстном меню: "7-Zip -> Добавить к архиву..."
3. Нажмите правой кнопкой мыши на создавшемся архиве Andy_maN_lupus_ErikPshat_PSPx.Ru.gz и выберите в раскрывшемся контекстном меню пункт: "Hex Edit with Hex Workshop v6.8".
8. Ставим курсор в начало строки 0х150, как показано на рисунке ниже:
Обратите внимание, что код в этой позиции начинается с 1F8B - это волшебная метка начала Gzip-архива.
11. Нажмите сочетание клавиш CTRL + V, чтобы вставить скопированный ранее в "Пункте 5" код нашего кастомизированного Gzip-архива. Обратите внимание, что вставленный код отображается красным цветом и он так же начинается с 1F8B.
Ну вот, файл мы упаковали и собрали. Но ещё не сохраняли...
Теперь дело осталось за малым - сгенерировать и проставить секретные криптографические метки :-)
12. Cразу открою секрет этих меток...
A) В offset: [0x28,0x29,0x2A,0x2B] - указывается размер декриптованного ELF-файла задом наперёд (нули спереди отбрасываются при указании смещений).
Б) В offset: [0xB0,0xB1,0xB2,0xB3] - записан размер GZIP-архива (0х150 - до конца файла).
В) В offset: [0x2C,0x2D,0x2E,0x2F] - указывается размер всего исполняемого кода файла вместе с заголовком ~PSP.
A) Итак, в offset: [0x28,0x29,0x2A,0x2B] - указывается размер декриптованного ELF-файла задом наперёд.
Вспомните, в первой главе в пункте 10, мы записывали этот размер на бумажку. Размер декриптованного ELF-файла у нас составлял 0хF55E, а задом наперёд это значит будет записываться побайтово, как 5EF5.
Прокрутите наш, ещё не сохранённый собранный красный файл в самое начало и смотрите значения в offset: [0x28,0x29,0x2A,0x2B]
Как видите, эти значения 5EF5 как были записаны в оригинальном исходном файле, так они у нас не изменились. По идее распакованный ELF-файл и не должен никогда менятся, т.к. при изменении размера, файл становится нерабочим. Мы просто удостоверились в данном случае, что с этим делом у нас всё в порядке.
Б) Далее, в offset: [0xB0,0xB1,0xB2,0xB3] - записан размер GZIP-архива (0х150 - до конца файла).
Этот параметр очень важный, так как размер GZIP-архива в исходнике по любому будет отличаться от нашего архива по размеру. Просто невозможно подобрать такую степень компрессии, чтобы в точности попасть в размер исходного архива.
А GZIP-архив у нас находится прямо перед глазами, выделенный красным цветом от 0х150 и до конца файла. Поэтому, ставим курсор в начало первой красной строки в offset: 0x150 и нажимаем Shift + End. Размер выделенной области, являющейся GZIP-архивом, который мы запаковали ранее и вставили в эту позицию, смотрим внизу и записываем:
Как видим, размер выделенной области показывает Sel: 0x6143. Значит, в offset: [0xB0,0xB1,0xB2,0xB3] мы должны записать 4361. Нули спереди обычно не пишутся и отбрасываются, поэтому, когда я имею в виду "записать значение 4361" - это надо понимать, что фактически в хексе размер пишеться 4-мя байтами 43610000, ведь мы пишем код задом наперёд, значит читаем его начиная с нулей.
Перемещаемся в начало файла и записываем эти значения:
14. Жмем "File -> Save As..." и сохраняем как recovery.prx в любую свободную папку.
15. Подключаем PSP к компьютеру и кидаем файл во flash0:/vsh/module/...
Создаём на компьютере пустой текстовой документ под названием ru_recovery.txt, копируем в него код из спойлера ниже, сохраняем и закидываем в корень flash1 или в папку seplugins.
Перевод рекавери
Отключено
Включено
По умолчанию
Япония
Америка
Европа
Корея
Великобритания
Мексика
Австралия/Нов. Зеландия
Восток
Тайвань
Россия
Китай
1ый тип отладки
2ой тип отладки
Обычный -Необходим UMD-
Старый OE isofs -Без UMD-
Драйвер M33 -Без UMD-
Sony NP9660 -Без UMD-
Соединение USB
Конфигурация
Дополнительно
Дополнительные настройки
Запустить программу
Частота ЦП
Плагины
Твики реестра
Выход
Назад
Активировать WMA
Активировать Flash Player
USB включено
USB выключено
Отформатировать flash1 и сбросить настройки
Форматирование
состояние
Простые модули UMD/ISO
Выполнять BOOT.BIN в UMD/ISO
Пропускать лого Sony
Прятать повреждённые иконки
Папка приложений
Автозапуск:
Режим UMD
Регион
Использовать VSH меню
Устройство USB
UMD диск
M33 интернет обновление
Прятать PIC0.PNG и PIC1.PNG в меню игры
Всегда подзаряжать по USB
Частота в XMB
Частота в UMD/ISO
Назначение кнопок
O - ввод
X - ввод
WMA уже было активировано.
Активирование WMA...
Flash player уже был активирован.
Активирование Flash Player...
Выходим из меню восстановления
Главное меню
Ядро 1.50
Ядро 5.XX
Плагины XMB
Плагины GAME
Плагины POPS
Использовать version.txt
Таким образом можно распаковывать и назад запаковывать некоторые другие PRX файлы, перечисленные в списке вначале.
У меня на распаковку уходит не более 10 сек, а на запаковку - не более 30 сек.
1. Предварительно, прежде чем архивировать, его можно переименовать как заблагорассудится, даже без расширения.
Я, например, его переименовал так: Andy_maN_lupus_ErikPshat_PSPx.Ru - в честь разработчиков русификатора, ну и себя любимого :-), а так же нашего сайта. Для чего? Узнаете далее...
Дело в том, что когда я архивирую файл в GZIP архив, то название файла сохраняется в коде GZIP архива. И когда я собираю файл и подставляю код архива к заголовку ~PSP исходника, то имя файла в коде так же переезжает в основной файл, что может служить как бы авторской подписью.
хочу русифицировать Ultimate VSH menu для 5.50
там есть файлик vshmenu.prx
декомпресснул в P-ZIP, русифицировал, хотел закомпресить и не вышло. Оказывается он может компресить только файлы у которых знает хедер(c:\Program Files\Highboys Tools\P-Zip\FILES\ сответственно прошивке)
Хотел бы вручную запаковать обратно, но не знаю где там хедер. Подскажите плиз как вычислить. Или укажите на ошибки.
да, он таки есть, в той проге(хедер). Он подойдет если русифицировать Ultimete VSH Menu 2.0
Я же порбую русифицировать Ultimete VSH Menu для 5,50 ген, а там другой хедер, хотя и того же размера, так что выход нашел.
Но другая проблема, я все русифицировал, запаковал, все замечательно, НО весь текст что я ввел кирилицей, отображается латинским. Русскую таблицу всунул верно(проверил в RomArtist) Мож там есть залочка где?
Последний раз редактировалось nagluu; 08.02.2010 в 18:18.
Я же порбую русифицировать Ultimete VSH Menu для 5,50 ген, а там другой хедер
Ну так и нужно использовать этот хедер от недекриптованного файла, который ты потом декриптовал и перевёл.
По-моему там стоит залочка на 128 символов. Поищи поиском, я когда-то русифицировал старую версию и где-то здесь выкладывал, там должен был написать, где стоит залочка.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Патчер залочку не снимает, поэтому залочку нужно искать самому. В принципе это дело 2-ух минут - она находится по адресу 0х40A0.
Там нужно поменять значение 7F на FF (ессно в декриптованном файле).
вот что ты писал. на месте 40A0 стоит 00
как через поиск найти залочку(сам принцип если можно)?
ну так первая попытка русификации и вообще роботы в ХЕКСе =)
щяс почитаю про сдвиги и может получится сделать.
если есть какие еще предложения, пишите, доведем до ума.
ксатити, уважаемый ErikPshat, у всех залочка имеед вид 7F ?
Последний раз редактировалось nagluu; 09.02.2010 в 11:00.
Да 7F (128) - это количество символов английской таблицы. Многие разработчики не умышленно ставят залочку, а просто, чтобы не грузилась в память вся таблица в 256 символов.
1 символ - 8 байт или 64 бита/пикселя.
А лишние 128 символов - это лишние 1024 байта, т.е. 1 Мб.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Другие консоли: Все PSP, все PSV, SCPH-1002, SCPH-102, SCPH-77008, CECH-4208C, SCPH-1000R
Регистрация: 19.03.2008
Адрес: Россия
Сообщений: 5,734
Вы сказали Спасибо: 819
Поблагодарили 3,835 раз(а) в 2,013 сообщениях
Сила репутации: 1
Репутация: 3835 
(репутация неоспорима)
Кстати, почему в шапке всё время мифическая "криптовка" упоминается, когда её тут нет? Только сжатие (компрессия).
И почему нет абзаца со сжатием при помощи софта? Как дополнение к ручному способу.
Yoti, о "криптовке" там в тексте упоминается, в смысле того, что на самом деле это не криптовка, а просто понты.
Дополнительный софт нам не нужен. Тут всё на более низком уровне.
Цель ставилась не научить нажать такую-то кнопочку, а научить видеть и делать всё вручную.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 16.07.2010 в 19:18.
Репутация: 1160 
(за этого человека можно гордиться)
Сообщение от ErikPshat
13. Выделите весь код файла, нажав CTRL + A и запишите на бумажке значения всего выделенного декриптованного ELF-файла внизу в области Sel: 0xf55e. Эта цифра нам понадобится в самом конце при криптовке, не забудьте!
у каждого индивидуальны?????
и последующие значения
Благодарим форумчан, нажимая на кнопочку под полезным сообщением.