Данным методом, о котором пойдёт речь ниже, запакованы все кастомные файлы кастомной прошивки:
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-SonyNP9660 -Без UMD-СоединениеUSBКонфигурацияДополнительноДополнительныенастройкиЗапуститьпрограммуЧастотаЦППлагиныТвикиреестраВыходНазадАктивироватьWMAАктивироватьFlash PlayerUSBвключеноUSBвыключеноОтформатироватьflash1 и сбросить настройкиФорматированиесостояниеПростыемодули UMD/ISOВыполнятьBOOT.BIN в UMD/ISOПропускатьлого SonyПрятатьповреждённые иконкиПапкаприложенийАвтозапуск:
РежимUMDРегионИспользоватьVSH менюУстройствоUSBUMDдискM33интернет обновлениеПрятатьPIC0.PNG и PIC1.PNG в меню игрыВсегдаподзаряжать по USBЧастотав XMBЧастотав UMD/ISOНазначениекнопокO- вводX- вводWMAуже было активировано.АктивированиеWMA...Flashplayer уже был активирован.Активирование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,795
Вы сказали Спасибо: 823
Поблагодарили 3,926 раз(а) в 2,058 сообщениях
Сила репутации: 1
Репутация: 3926 (репутация неоспорима)
Кстати, почему в шапке всё время мифическая "криптовка" упоминается, когда её тут нет? Только сжатие (компрессия).
И почему нет абзаца со сжатием при помощи софта? Как дополнение к ручному способу.
Yoti, о "криптовке" там в тексте упоминается, в смысле того, что на самом деле это не криптовка, а просто понты.
Дополнительный софт нам не нужен. Тут всё на более низком уровне.
Цель ставилась не научить нажать такую-то кнопочку, а научить видеть и делать всё вручную.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 16.07.2010 в 19:18.
Репутация: 1164 (за этого человека можно гордиться)
Сообщение от ErikPshat
13. Выделите весь код файла, нажав CTRL + A и запишите на бумажке значения всего выделенного декриптованного ELF-файла внизу в области Sel: 0xf55e. Эта цифра нам понадобится в самом конце при криптовке, не забудьте!
у каждого индивидуальны?????
и последующие значения
Благодарим форумчан, нажимая на кнопочку под полезным сообщением.