Портируем старый плагин 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
0x01562BA3 [0x00001354] - sceAudioOutput2Reserve
0x086E5895 [0x000028A4] - sceAudioInputBlocking
0x136CAF51 [0x00000660] - sceAudioOutputBlocking
0x13F592BC [0x000008F4] - sceAudioOutputPannedBlocking
0x2D53F36E [0x00001374] - sceAudioOutput2OutputBlocking
0x38553111 [0x00001E04] - sceAudioSRCChReserve
0x41EFADE7 [0x00000C4C] - sceAudioOneshotOutput
0x43196845 [0x00001390] - sceAudioOutput2Release
0x5C37C0AE [0x00002070] - sceAudioSRCChRelease
0x5EC81C55 [0x00000AD8] - sceAudioChReserve
0x63F2889C [0x00001254] - sceAudioOutput2ChangeLength
0x647CEF33 [0x000012C4] - sceAudioOutput2GetRestSample
- Первая 4-х байтная единица, например 0x01562BA3 - это и есть захешированный номер NID функции.
- Следом в скобках указывается позиция, где она записывается.
- И через тире уже нам дизассемблер даёт подсказку о самом настоящем названии функции в нехешированном виде. На самом деле этих названий вы не увидите в файле. Это разработчики PRXTool уже внесли в программу названия основных известных функций, которые не меняются.
Но на самом деле, есть ещё множество подфункций, которые SONY умышленно изменяет при выпуске очередного релиза прошивки. Вот так их опознаёт PRXTool:
0x0B61478E [0x000008F4] - sceAudio_driver_0B61478E
0x0B74AAA2 [0x000028F0] - sceAudio_driver_0B74AAA2
0x2047EAD8 [0x00000578] - sceAudio_driver_2047EAD8
0x20856A07 [0x0000105C] - sceAudio_driver_20856A07
0x2533CE02 [0x000015F4] - sceAudio_driver_2533CE02
0x3E087113 [0x00002680] - sceAudio_driver_3E087113
0x3E3C44F1 [0x00000E68] - sceAudio_driver_3E3C44F1
0x4036F0AE [0x00001E04] - sceAudio_driver_4036F0AE
0x4754D283 [0x000012C4] - sceAudio_driver_4754D283
0x6985717B [0x00000AD8] - sceAudio_driver_6985717B
0x6ACDCBB3 [0x00002934] - sceAudio_driver_6ACDCBB3
То есть, дизассемблер определяет по коду программы область подфункций, принадлежащей основному модулю
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 и вот что он нам выдаёт (я почистил лишние куски кода, которые нам абсолютно не нужны и оставил только названия функций, которые изменяются от прошивки к прошивке):
Name: Music_prx
0xB282F4B2 [0x0000536C] - sceAudio_driver_B282F4B2
0x669D93E4 [0x00005374] - sceAudio_driver_669D93E4
0x138A70F1 [0x0000537C] - sceAudio_driver_138A70F1
0x43645E69 [0x00005384] - sceAudio_driver_43645E69
0xE56B11BA [0x000053A4] - sceDisplay_driver_E56B11BA
0xD6E50D7B [0x000053AC] - scePower_driver_D6E50D7B
0x1688935C [0x000053BC] - scePower_driver_1688935C
0xC4AAD55F [0x000053C4] - sceCtrl_driver_C4AAD55F
Вот это все изменяющиеся функции, используемые плагином для своей работы.
А теперь посмотрим на
SilverSpring's PSP PRX Libraries Documentation Project. Эту тему я специально подготовил, т.к. его сайт постоянно находится в ауте. И он много времени отдал этому проекту, вычисляя NID-ы: имена функций на каждой прошивке.
Итак, открываем
libdoc от прошивки
3.7х и смотрим файлы, соответствующие модулям в плагине music.prx, видим следующие цифры:
kd/audio.prx sceAudio_Driver
<NAME>sceAudio_driver</NAME>
<FLAGS>0x00010011</FLAGS>
<FUNCTIONS>
<FUNCTION>
<NID>0x138A70F1</NID>
<NAME>sceAudio_driver_138A70F1</NAME>
</FUNCTION>
<FUNCTION>
<NID>0x43645E69</NID>
<NAME>sceAudio_driver_43645E69</NAME>
</FUNCTION>
<FUNCTION>
<NID>0x669D93E4</NID>
<NAME>sceAudio_driver_669D93E4</NAME>
</FUNCTION>
<FUNCTION>
<NID>0xB282F4B2</NID>
<NAME>sceAudio_driver_B282F4B2</NAME>
</FUNCTION>
</FUNCTIONS>
kd/display.prx sceDisplay_Service
<NAME>sceDisplay_driver</NAME>
<FLAGS>0x00010011</FLAGS>
<FUNCTIONS>
<FUNCTION>
<NID>0xE56B11BA</NID>
<NAME>sceDisplay_driver_E56B11BA</NAME>
</FUNCTION>
</FUNCTIONS>
kd/power.prx scePower_Service
<NAME>scePower_driver</NAME>
<FLAGS>0x00010011</FLAGS>
<FUNCTIONS>
<FUNCTION>
<NID>0x1688935C</NID>
<NAME>scePower_driver_1688935C</NAME>
</FUNCTION>
<FUNCTION>
<NID>0xD6E50D7B</NID>
<NAME>scePower_driver_D6E50D7B</NAME>
</FUNCTION>
</FUNCTIONS>
kd/ctrl.prx sceController_Service
<NAME>sceCtrl_driver</NAME>
<FLAGS>0x00010011</FLAGS>
<FUNCTIONS>
<FUNCTION>
<NID>0xC4AAD55F</NID>
<NAME>sceCtrl_driver_C4AAD55F</NAME>
</FUNCTION>
</FUNCTIONS>
Сравнив показания плагина
music.prx выше и функций прошивок 3.7х здесь, мы видим, что идёт 100% совпадение!!!
Скажу больше, в прошивке 3.90 нет этих цифр впомине. То есть, там НИДы функций полностью изменены. Поэтому заявление разработчика, что он адаптировал плагин под прошивку 3.90 - явная ложь.
Итог: нам теперь явно ясно, что для портирования плагина под прошивку 6.60, необходимо искать соответствующие НИДы функций в этих файлах:
Название файла Название модуля
kd/audio.prx sceAudio_Driver
kd/display.prx sceDisplay_Service
kd/power.prx scePower_Service
kd/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 в других прошивках, что явно вывело на аналогичный код и выдало изменившиеся НИДы, как на тарелочке с голубой каёмочкой.
И в результате получилась вот такая таблица:
M U S I C . P R X P L U G I N f o r P S P -= by AhMan =- |
Necessary Data | Firmwares NID's | Comments |
FILE | MODULE | FUNCTION | 3.7x | 3.80/3.90 | 3.95/4.01 | 5.00/5.50 | 6.20 | 6.35 | 6.60/6.61 | EDITED |
audio.prx | sceAudio_driver | sceAudio_driver_ | 138A70F1 | D4828217 | C3C2C4B4 | 3E3FAE75 | F462A7B9 | 0399579B | B7F5A1B2 | hw.h; sceAudio_driver.S |
audio.prx | sceAudio_driver | sceAudio_driver_ | 43645E69 | 94E28BDD | CD272A5D | 909092AB | E26E49E7 | 475F41FE | AC81DE4F | hw.h; sceAudio_driver.S |
audio.prx | sceAudio_driver | sceAudio_driver_ | 669D93E4 | 4036F0AE | C15BE9A3 | BFC404F6 | A502088E | E9BCD519 | 837701CC | hw.h; sceAudio_driver.S |
audio.prx | sceAudio_driver | sceAudio_driver_ | B282F4B2 | 80BCF50C | FCC526B7 | 322078A5 | 77EBE4A2 | A388ABDB | 9D77949E | sceAudio_driver.S |
audio.prx | sceAudio_driver | sceAudio_driver_ | 035C14C6 | 2047EAD8 | F7083625 | 324BA73D | A5C0603B | D35EFCD9 | 671E97E8 | init.c |
audio.prx | sceAudio_driver | sceAudio_driver_ | 798FB2A3 | C66BDCA1 | 61BBE62D | F355A263 | 2FD643D0 | A906D208 | 5CDEF9A4 | init.c |
audio.prx | sceAudio_driver | sceAudio_driver_ | D6620E8E | 9DA39F69 | BCD3344C | 1A7526DD | 45457EE5 | 686AC4F4 | E440DF7D | init.c |
audio.prx | sceAudio_driver | sceAudio_driver_ | 47D06FE6 | BE6F1721 | 850A552B | E8D4EE26 | 548EEFD1 | C847973E | 17D856B9 | init.c |
audio.prx | sceAudio_driver | sceAudio_driver_ | 5140D94F | 0B61478E | C4839793 | DC34AC20 | 23F19798 | B29D727F | B7CCF1D7 | init.c |
display.prx | sceDisplay_Service | sceDisplay_driver_ | E56B11BA | 3749CDA0 | C28EFAA7 | D8D2FD35 | 64EE9BF2 | 08A10838 | FBB369FD | sceDisplay_driver.S |
loadcore.prx | LoadCoreForKernel | LoadCoreForKernel_ | CF8A41B1 | F17DD6DD | 98D2CF2B | 0B53340F | BEF0A05E | EF8A0BEA | F6B1BF0F | LoadCoreForKernel.S |
sysmem.prx | SysclibForKernel | strcspn | 89B79CB1 | 89B79CB1 | 89B79CB1 | 89B79CB1 | Missing | Missing | Missing | config.c |
sysmem.prx | SysclibForKernel | strspn | 62AE052F | 62AE052F | 62AE052F | 62AE052F | Missing | Missing | Missing | config.c |
sysmem.prx | SysclibForKernel | strtok | 87F8D2DA | 87F8D2DA | 87F8D2DA | 87F8D2DA | Missing | Missing | Missing | config.c |
power.prx | scePower_Service | scePower_driver_ | 1688935C | 94C3991E | 2A12371B | 78834264 | BF5BA7FC | 9F53A71F | 04711DFB | scePower_driver.S |
power.prx | scePower_Service | scePower_driver_ | D6E50D7B | 94BC4918 | 19387EF4 | AF23EFA6 | 1A41E0ED | 8BA12BAF | 766CD857 | scePower_driver.S |
power.prx | scePower_Service | scePower_driver_ | 4431FF21 | 114D3560 | 9AF4290C | 775DA498 | 9CDB22B5 | A2E9E73F | E52B4362 | init.c (3.5x 0xD66EF08D) |
ctrl.prx | sceController_Service | sceCtrl_driver_ | C4AAD55F | D65D4E9A | 591B3F36 | 6B247CCE | 3CA6922B | 18654FC0 | 2BA616AF | sceCtrl_driver.S |
| | | ↑ ↑ ↑ | | | | | | ↑ ↑ ↑ | |
Music plugin version 055 ported to sony PSP 3.90 firmware.
Cpasjuste @ http://mydedibox.fr/ | Music plugin v056 for 6.60/6.61 firmware
ported by ErikPshat |
Скачать: обновлённый плагин для 6.60/6/61 можно
отсюдава.