Репутация: 229 
(весьма и весьма положительная личность)
(WIP) Портирование decap патча на Prince of Persia: Rival Swords
Порт decap патча RhymeKidder'a для PSP версии Rival Swords (ULUS-10240), включает разрубание монстров в игре. Залил во вложения пропатченный boot.bin и написанную на скорую руку простенькую утилитку, которая патчит boot.bin или iso образ.
Большое спасибо riku.kh3 и Yoti за помощь!
Скриншоты
Архив
На днях я попробовал изучить исходники патча RhymeKidder'a для PC версии, как он включает decap (разрубание монстров), нашёл похожий код в PSP версии с помощью ghidra, получилось даже частично включить decap внеся грубые правки в пару функций.
К сожалению, с полноценным пропатчиванием возникла проблема, а именно в первых двух функциях, для которых применяется более громоздкий алгоритм. Возник вопрос - чем возможно хукнуть вызов функции в boot.bin и какой аналог asm кода должен быть для MIPS?
Другие консоли: Все PSP, все PSV, SCPH-1002, SCPH-102, SCPH-77008, CECH-4208C, SCPH-1000R
Регистрация: 19.03.2008
Адрес: Россия
Сообщений: 5,745
Вы сказали Спасибо: 819
Поблагодарили 3,857 раз(а) в 2,023 сообщениях
Сила репутации: 1
Репутация: 3857 
(репутация неоспорима)
Исходники это, конечно, хорошо, но лучше бы ссылку на источник. В каком виде он сделан? Если это dll, то в случае с psp по аналогии писать плагин. Либо писать вставки кода в свободные места исполняшки с возвратом обратно. Мануал к архитектуре вот, например.
На PSP хуки вам не нужны, продолжайте делать все так же, как и до этого делали - вносить правки непосредственно в сами функции. Если что-то где-то не влезает - заменяете одну из инструкций бранчем, по новому адресу возвращаете замененную инструкцию, свой код и ставите бранч назад (или используете связку jal-jr). Место для своего кода можно взять там, где обрабатываются строки с различными ошибками (0x47D2D4-0x47D30C например).
"decap_archer" вызывает пустую "fix_archer", которая вообще ничего не делает, после чего вызывает саму "decap". То есть ее сразу на "decap" можно заменить.
Остается только "decap_brute" (вернее "fix_brute"): она смотрит одно из значений в стэке. Если оно равно 0x82830304, то это значение заменяется на 0x82830403. Это надо в отладчике уже смотреть где оно на PSP в стэке. Должно быть что-то вроде того:
0x47D2D4:
b 0x47D294
nop
0x47D2DC (decap_brute):
lui v0,0x8283
addiu v0, v0, 0x304
lw v1, 0x???(sp) //адрес_в_стэке
bne v0, v1, лэйбл
nop
addiu v0, v0, 0xFF
sw v0, 0x???(sp) //адрес_в_стэке
лэйбл:
jr
li v0, 1
(по адресу 0x4096c заменить 'jal 0x1E688' на 'jal 0x47D2DC')
Последний раз редактировалось riku.kh3; 30.04.2020 в 09:21.
Репутация: 229 
(весьма и весьма положительная личность)
riku.kh3, спасибо, пробую ковыряться. Сначала в гидре добавил инструкции, затем скопировал их в hex значениях и попробовал заменить в ELF. Но пока что-то не совсем выходит. Эмулятор видит инструкции иначе
Выглядит нормально.
Эмулятор, да, он вместо связки lui и addiu будет отображать псевдоинструкцию 'li v0, 0x82830304'.
Вот так тогда попробуйте:
0x47D2D4:
b 0x47D294
0x47D2D8 (decap_brute):
li v0, 0x82
bne s7, v0, лэйбл
li v0, 0x83
bne s2, v0, лэйбл
li v0, 0x03
bne s3, v0, лэйбл
li v0, 0x04
bne s6, v0, лэйбл
nop
li s3, 0x04
li s6, 0x03
лэйбл:
jr
li v0, 1
(по адресу 0x4096c заменить 'jal 0x1E688' на 'jal 0x47D2D8')
И у вас там в гидре криво некоторые инструкции добавились. В самом эмуляторе попробуйте их скомпилировать (правый клик по инструкции --> Assemble Opcode) и из вкладки 'Memory' переписать hex-значения (одна инструкция = 4 байта).
Последний раз редактировалось riku.kh3; 30.04.2020 в 12:26.
А, нет, стоп, это не Гидра виновата. Тут таблица релокаций ELF вносит изменения в код при загрузке, в ней занулить надо несколько мест. Замените в эмуляторе инструкции на правильные, если все нормально будет работать я посмотрю где там таблица.
Репутация: 229 
(весьма и весьма положительная личность)
riku.kh3, потестил чуть, вроде бы всё нормально. Большое спасибо! Добавил только переход для 0x4096c на 0x47D2D8, и основной decap функции 0x3132b4 заменил код на return 1. Ночью сделаю ещё тест-драйв по сюжетке, если всё будет стабильно то будет релиз
Репутация: 229 
(весьма и весьма положительная личность)
Давненько меня здесь не было Нашёл, наконец, как убрать цензуру в начале игры Пока как тестовый патч, но надеюсь, что ничего случайно не поломалось Попробую на днях пройти, если всё будет ок, то обновлю в шапке.
Репутация: 229 
(весьма и весьма положительная личность)
Upd: прошёл сюжетку, PPSSPP крашнулся один раз, но скорее всего из-за того, что savestate'ами баловался. Обновил шапку, добавил последнюю версию патча. Есть ранние наработки по пересадке эффектов крови песочным монстрам, но из-за того, что ресурсы игры плохо изучены результат пока не совсем удовлетворителен.
Давненько меня здесь не было Нашёл, наконец, как убрать цензуру в начале игры Пока как тестовый патч, но надеюсь, что ничего случайно не поломалось Попробую на днях пройти, если всё будет ок, то обновлю в шапке.
Здравствуй. А как убрать цензуру вначале игры и добавить кровь для версии ПК в патче RhymeKidder?