Портируем старые плагины, такие, как Music.prx, под прошивку 6.60
Портируем старый плагин Music.prx под прошивку 6.60/6.61
В общем пришла идея телепортации старинного отличного плагина Music.prx под прошивку 6.60.
Изначально этот плагин был изготовлен для консоли "neogeoCD 0.91" разработчиками Yoyofr & ZeLurker. Затем AhMan портировал его под PSP, во времена прошивок 3.02 ОЕ и совершенствовал его до прошивки 3.52 M33-2, добавляя кодеки и функционал.
Позже за работу взялся Cpasjuste и выпустил релиз, якобы адаптировав плагин под прошивку 3.90. С тех пор эта версия так и летает по всем просторам интернета и хорошо зарекомендовала себя в работе даже на новых прошивках.
Собственно суть проблемы такова, что на прошивке 6.60 плагин всё же неплохо работает, однако присутствуют свои костыли - это игнорирование настроек в файле конфигурации music_conf.txt, не работающие некоторые функции, по сочетаниям кнопок.
В чём состоит проблема?
Я просмотрел код плагина, он поставляется с исходниками. Несмотря на заявление Cpasjuste о портировании плагина под прошивку 3.90, я прекрасно вижу функции NID-ов от прошивок 3.7x. То есть, в прошивке 3.90 все NID-ы функций поменялись и меняются эти NID-ы постоянно от прошивки к прошивке.
Что такое NID-ы?
Это названия функций, которые вызываются именно по названию и выполняют присущие им действия. Но начиная где-то с прошивок 3.7x, Sony перестала напрямую вызывать функции в файлах своими именами, а стала скрывать их, хешируя названия в 4-байтный код, то есть к названию модуля прикрепляет закодированный номер функции. Вот как это выглядет на небольшом примере, после вывода дизассемблером PRXTool v1.1
Первая 4-х байтная единица, например 0x01562BA3 - это и есть захешированный номер NID функции.
Следом в скобках указывается позиция, где она записывается.
И через тире уже нам дизассемблер даёт подсказку о самом настоящем названии функции в нехешированном виде. На самом деле этих названий вы не увидите в файле. Это разработчики PRXTool уже внесли в программу названия основных известных функций, которые не меняются.
Но на самом деле, есть ещё множество подфункций, которые SONY умышленно изменяет при выпуске очередного релиза прошивки. Вот так их опознаёт PRXTool:
То есть, дизассемблер определяет по коду программы область подфункций, принадлежащей основному модулю sceAudio_driver и, не зная настоящего названия функции, просто подставляет его цифровой хеш к названию основного модуля - sceAudio_driver_0B74AAA2
Что за 4-х байтный хеш функции?
Как я уже упоминал ранее - это хеш полного названия функции. Хотя я и раньше оперировал с хешированными НИДами и умудрялся отыскивать нужные, но не представлял откуда берётся этот хеш. Этот секрет недавно мне поведал frostegater в соседней теме, где он выложил свою консольную утилитку по превращению названия функции в её захешированный вид. Затем Yoti облегчил этот процесс, нарисовав GUI интерфейс для быстрого ввода-вывода информации . Вы можете сами потестить программку: N1D G3N3R@T0R.exe
На данном примере, на скриншоте, я взял первую строчку из 1-го блока кода выше, где указаны нерандомизированные НИДы, чтобы наглядно увидеть вывод хеша из названия функции:
0x01562BA3 [0x00001354] - sceAudioOutput2Reserve
Как видно, название функции sceAudioOutput2Reserve превращается в 4-байтный код 0x01562BA3.
А заменив это название в захешированный вид, его можно использовать как-то так: sceAudio_01562BA3.
Хешь извлекается следующим образом... Из названия функции генерируется чек-сумма SHA-1 (160 bit).
В данном случае SHA-1 равна - A32B56014147A25FDE15A7AF4D596DADA06BE3AB
Затем берутся первые 4 байта и инверсируются побайтно. Получаем 01562BA3.
С чего начинать?
Начинать следует с дизассемблирования этих функций самого плагина music.prx и вот что он нам выдаёт (я почистил лишние куски кода, которые нам абсолютно не нужны и оставил только названия функций, которые изменяются от прошивки к прошивке):
Вот это все изменяющиеся функции, используемые плагином для своей работы.
А теперь посмотрим на SilverSpring's PSP PRX Libraries Documentation Project. Эту тему я специально подготовил, т.к. его сайт постоянно находится в ауте. И он много времени отдал этому проекту, вычисляя NID-ы: имена функций на каждой прошивке.
Итак, открываем libdoc от прошивки 3.7х и смотрим файлы, соответствующие модулям в плагине music.prx, видим следующие цифры:
Сравнив показания плагина music.prx выше и функций прошивок 3.7х здесь, мы видим, что идёт 100% совпадение!!!
Скажу больше, в прошивке 3.90 нет этих цифр впомине. То есть, там НИДы функций полностью изменены. Поэтому заявление разработчика, что он адаптировал плагин под прошивку 3.90 - явная ложь.
Итог: нам теперь явно ясно, что для портирования плагина под прошивку 6.60, необходимо искать соответствующие НИДы функций в этих файлах:
Название файла Название модуля
kd/audio.prx sceAudio_Driverkd/display.prx sceDisplay_Servicekd/power.prx scePower_Servicekd/ctrl.prx sceController_Service
Проще говоря, НИДы плагина прошивки 3.7х необходимо сопоставить НИДам тех же функций прошивки 6.60.
Заменить их в исходниках и заново скомпилировать новый адаптированный плагин под 6.60.
Как правило, у каждого модуля существует определённый набор функций и их количество и порядок в файле редко изменяется. Поэтому, думаю, не составит труда сопоставить НИДы этих прошивок, либо ещё промежуточных и вывести параллели между прошивками.
Далее можно выстроить параллели каждого типа НИДа в каждой прошивке и составить таблицу.
Процесс исследования плагина music.prx
Для начала, необходимо вычислить все функции рандомных NID-ов, используемых плагином. Скачиваем дизассемблер PRXTool и закидываем туда наш подопытный файл music.prx.
Запускаем батник "16. ImpExp & Alias Print.bat" и получаем на выходе все Импорты и Экспорты функций, используемых плагином в текстовом файле "16_Import_Export.txt".
Удаляем все лишние строки со статическими функциями, т.е. у которых нет в названии функции суффикса с 4-значным НИДом.
Далее, вычисляем по рандомным НИДам версию прошивки, от которой эти НИДы были использованы. Ну тут ясное дело, что НИДы функций принадлежат прошивке 3.71.
Поэтому берём файлы прошивок 3.71, в которых используются эти функции и дизасмим их. Так как я больше разбираюсь в HTML, то я выбрал батник дизасма "24. DISASM2HTML.bat" и сохранил результаты в папке под названием прошивки "371". Затем произвёл то же самое действие с аналогичными файлами от других прошивок, чтобы проследить сдвиги функций от прошивки к прошивке.
Таким образом эти HTML файлы от разных прошивок я просто сравнил в браузере. Разница в НИДах и сходство кода видна невооруженным глазом. На этом примере я произвёл поиск в дизассемблированном файле audio.prx.html по НИДу sceAudio_driver_138A70F1 в прошивке 3.71. Затем, посмотрев на окружение найденного, произвёл поиск по соседнему значимому слову sceAudioOutput2Release в других прошивках, что явно вывело на аналогичный код и выдало изменившиеся НИДы, как на тарелочке с голубой каёмочкой.
vash, ууу, как всё запущено Поменяй местами строчки в текстовиках скриншотера и плагина музыки.
Либо поменяй скриншотер, думаю CWCapture 0.5 должен работать.
SILENT-Pavel, тебе нужно описание с инструкцией менять, что работает, а что нет. Например проигрывание из подпапок и кириллические названия. Я щас попробую кириллический шрифт добавить...
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Поменяй местами строчки в текстовиках скриншотера и плагина музыки.
Ты знал и молчал!
Никогда не пользовался плагинами, вот и туплю.
Хотелось-бы добавить, что при изменении уровня громкости, циферки в vol. не меняются, так 100 и остаются. А в самом низу название того самого музыкального файла с трудным именем.
Последний раз редактировалось ErikPshat; 08.04.2014 в 16:20.
Yoti, а вот PROшный я давно не вспоминал )))
А вот у тебя вообще нет table_mode = 5, значит получится байда с гошками 6.10/6.20
Помню в последний раз я его собирал и кидал в тему, вроде там он и есть мой старый космический )
У нас на руках последние под 6.60 только от Проксимы и Нейрона.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 08.04.2014 в 16:22.
vash, ладно, надоело заниматься русификацией плагина. Пусть так и останется, раз всё работает. Я смотрю, символы в названиях как раз берутся из всей матрицы шрифтов, т.е. без ограничений. Просто название песни каким-то образом записывается на карту памяти и считывается средствами PSP уже в другом формате. Видно, что каждая русская буква выводится не одним символом, а двумя, причём в другой кодировке и с другим смещением.
Так что мне пока не под силу разобраться с кодом вывода этой фигни, у кого есть опыт работы с этими кодировками, тот возможно и асилит, например frostegater или Yoti. Тем более, что автор в исходниках вставил такое примечание:
this allows us to parse latin-encoded unicode strings, though it could be better
Давай доканаем лучше PSARDumper... А что, Йотин дампер ты не проверял?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 04.04.2014 в 19:29.
Обычный UTF-8 (2 байта на символ кириллицы) выводимый по байту на символ.
Это я прекрасно знаю, что это русские буквы в UTF-8. На скриншоте всё видно наяву:
Лана - Ты ведь знаешь это.mp3
Там даже отображаются мои символы в матрице шрифтов: символ Наруто, кирпичная кладка для рекавери меню, человечек с поднятой правой рукой, на белом фоне куски букв из строчки PSPx.Ru, которую я растянул на несколько символов длиннее.
То есть, я вижу, что сиволы беруться не в ограниченной области 0x7F(127), а далеко дальше. А значит залочки нет.
Yoti, а что дальше..., что от того, что ты нам открыл великую тайну Буратино: "Что спрятано за холстом"?
Мы знаем, что там находится дверь. А вот что за дверью?
Вопрос в том, как это дело пофиксить. За вывод шрифта отвечает файл в исходниках blit.c.
Но как бы я не менял параметры, всё равно он выводит английские символы по одному байту, а русские названия песен 2-мя байтами, причём с невероятными смещениями.
Например первую букву "Л" в названии песни Лана - Ты ведь знаешь это.mp3 он показывает символами из матрицы 0x509B, вторая буква "а" - 0x50B0
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
То есть, я вижу, что сиволы беруться не в ограниченной области 0x7F(127), а далеко дальше. А значит залочки нет...
Например первую букву "Л" в названии песни Лана - Ты ведь знаешь это.mp3 он показывает символами из матрицы 0x509B, вторая буква "а" - 0x50B0
Хе-хе, нужно просто матрицу кириллицы переместить на 2 строчки выше тогда всё встаёт на свои места.
А да, ещё первый байт мешает, как бы от него избавиться?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram