Home » Articles » PSX Manuals

PSX хакинг

[ Оффлайн версия мануала yandex.disc (2,2 Мб) ]

Основные инструменты PSX хакинга:

Автор: Mr2
Мануал вдохновили: dedok179, ENS Player, Raz

* При копировании данного материала на другие сайты, обязательно указывайте ссылку на оригинал.

 Мощное средство для анализа кода:

Debugger - вылавливание\отслеживание нужных участков кода, выполнения кода.
  IDA - именования\комментирования кода.

Дополнительные инструменты:

PSX address calculator - конвертер PSX адресов.
PSIG - генератор инструкций.

Обозначения:

$ - адрес в оперативной памяти(RAM).
f$ - адрес в файле.
I> - инструкция.
f-> - функция.


Алгоритм работы:

 Поиск кода, по переменным:

С помощью ArtMoney  ищем адрес переменной которая хранит номера пресета управления для первого игрока.

* Название игры: Millennium soldier [E] [SLES-01716]

* Пресет управления - один из вариантов раскладки кнопок управления.

Находим такой адрес пресета: $800A6363.

 

  • 1.Ставим брейкпоинт на чтение найденного адреса.(во время игрового процесса)

  • 2.Получаем адрес инструкции читающей номер пресета: I>8001aecc.
  • 3.В окне DISASM мы видим программный код, обработки управления. В таком виде анализировать код не так удобно, как в специализированном дизассемблере IDA.

 Анализ кода:

Отключение инструкций\функций - патчим инструкцию\вызов, смотрим реакцию.

Для начала нам нужно убедиться, ту ли инструкцию мы нашли, для этого отключаем её и смотрим реакцию.

  • 1. Пишем адрес инструкции, и новую инструкцию: NOP =0(4 bytes).
  • 2. Жмём кнопку "Patch".
  • 3. При повторном срабатывании(брейкпоинт на PC = 8001aecc) мы должны увидеть нашу инструкцию.

Так как пресет управления читаться перестал, и независимо от его номера установленного в настройках, всегда работает только первый вариант раскладки управления. Мы делаем вывод, что нашли участок кода обрабатывающий кнопки управления.

Анализ программного кода в IDA:

Чтобы анализ кода был продуктивным, и прост в использовании в будущей модификации, мы воспользуемся мощным средством, позволяющим не только хранить записи, но и переходить по вызовам функций и строить блок схемы кода.

* Программный код обычно хранится в файлах с названием SLUS, SLES, SLPS... В нашем случае это файл: SLES_017.16.

* Бывают варианты с подзагрузкой, распаковкой, генерацией программного кода в процессе игры. То есть не всегда можно дизассемблировать весь код игры за раз.

* Через вкладку Functions, можно выбирать нужную функцию и переходить на неё.

Параллельный анализ кода:

В некоторых случаях требуется узнать результаты выполнения инструкций, их можно отслеживать в окне дебаггера, при пошаговом выполнении кода(кнопкой Step). И параллельно комментировать код в IDA.

Отслеживание вызовов функций:

Для того чтобы добраться до главной функции из подфункции, нужно ставить брейкпоинт на запуск. В IDA мы видим, что функция gamepad_control_8001AC34 вызывается из main(главной) функции игры. Если вы подозреваете что неизвестная функция выполняет известные вам действия, вы также можете использовать отключение вызова функции, как ранее это делалось для инструкции. Отключение вызова либо подтвердит ваши догадки, либо опровергнет.

Модификация программного кода:

 Модификация кода(Munch+PSIG)  - вырезаем код, декомпилируем, редактируем, компилируем.

Поиск свободного места под дополнительный код:

  • 1. Через хекс редактор ищем свободное место в исполняемом файле игры: SLES_017.16 .

  • 2. Проверяем отсутствие записей в найденное место. Конвертируем адрес исполняемого файла f$6A678 в адрес оперативной памяти с помощью PSX address calculator. В дебаггере переходим по полученному адресу $80079E78, и видим что записей во время игры туда не производится. Полной уверенности конечно быть в этом не может, для дополнительной проверки можно задействовать брейкпоинты(MemWrite, MemRead).

* Просматривать оперативную память, можно также через хекс редактор, сдампив её. (дамп памяти сохраняется в папке эмулятора: \dump\ram.bin)

Врезка прыжка с перемещением оригинальных инструкций:

Имея на руках код обработки кнопок и свободное место под новый код, мы просто обязаны это использовать. Для упрощение задачи повесим на кнопку select, активацию вибрации для DUALSHOCK геймпада.

Проанализировав ранее найденную функцию gamepad_control_8001AC34, мы находим удобное место врезки прыжка на наш новый код I>8001AF10, который мы запишем в ранее найденное свободное пространство f$6A678.

Врезка прыжка:

Cгенерируем прыжок на наш новый код:

JAL 80079E78 -> 9ee7010c

Конвертируем адрес, в который перезапишем инструкцию:

$8001AF10  -> f$B710

Пропишем сгенерированную инструкцию в исполняемый файл:

f$B710 = 9ee7010c

Перемещение оригинальной инструкции:

Затёртую оригинальную инструкцию I>8001AF10 переносим в наш новый код. С помощью ArtMoney  находим адрес флага вибрации $800A0584 и пишем саму проверку кнопки select.

С помощью PSIG, компилируем наш новый код в исполняемый файл игры SLES_017.16 .

Код получился больше чем мог бы быть, из-за того что проверка происходит многократно, возникает эффект турбо нажатия. Для того чтобы от него избавиться была введена дополнительная проверка и флаг turbo_sel_btn_flag.

* Более подробное описание работы с PSIG есть в мануале модификация кода.

Подводные камни:

  • Инструкция прыжка\перехода(на метку) осуществляется одновременно со следующей за ней инструкцией.

Переход с выполнением

инструкции ANDI

Переход без выполнения

инструкции ANDI     

BEQ a2, zr, 2c
ANDI a2, a1, 2

BEQ a2, zr, 2c
NOOP
ANDI a2, a1, 2

 

  • Инструкции загрузки, требуют ожидания. То есть, нельзя сразу после загрузки производить операции над загруженными данными.
Загрузка без ожидания(неверно) Загрузка с ожиданием(верно)

LW v0, 5C34(v1)
ADDIU a0, v0, 3

LW v0, 5C34 (v1)
ANDI a2, a1, 2
ADDIU a0, v0, 3

* Опасная проблема, эффект проявляется только на реальной консоли PS\PS2.

 

  • Нужно использовать отработавшие\незадействованные регистры, или предварительно сохранить их в стек как это делается тут:
Адрес Регистр

I>8001ac60
I>8001ac64
I>8001ac68

s5
s4
s3

* Естественно при завершении функции, регистры следует загрузить обратно.

 

  • Если внутри функции производится вызов другой функции, нужно сохранять адрес возврата ra:
Запуск функции (неверно) Запуск функции (верно)
JAL my_func

ADDIU sp, sp, -18
SW ra, 10(sp)


JAL my_func

LW ra, 10(sp)
NOOP
JR     ra
ADDIU  sp, sp, 18

* Адрес возврата сохраняется один раз, в начале вызывающей функции. Адрес возврата загружается один раз, в конце вызывающей функции.

 

  • Генерированный\распакованный код, можно декомпилировать из дампа RAM.


Ожидание и итог:

На самом деле качественный ромхаккинг/моддинг, это профессиональное занятие, требующее времени, сил и знаний. Большинство же думает что это обычное развлечение, как прохождение игр. Когда предвкушаемый фан не маячит при изучении хакинга, студент начинает терять запал создать свой шедевр. Но и даже те немногие, кто закончил обучение, и создал свой хак, бывают разочарованными, тем что никто не ценит их многолетний труд.

Стимул:

Хорошим стимулом для хакинга игры, является улучшение какого-то функционала, или дополнение игры новыми возможностями делающими её лучше оригинала.

Вредность:

  • 1. Продуктивное изучение и практика скорее всего нанесут ущерб отношениям с людьми. Проснувшись однажды, ты поймёшь, что кодинг и хакинг, это единственное что есть в твоей жизни.(актуально для про уровня)
  • 2. Продуктивная интеллектуальная работа\изучение длится 4 часа.
  • 3. Ночью нужно спать, тогда мозг будет работать лучше.
  • 4. Сидячий образ жизни рано или поздно приводит к заболеванию сердечно сосудистой системы. Один из выходов.
  • 5. В большинстве случаев, информация переваривается в голове, то есть, понимание сложной информации может прийти само собой через какое-то время. И отдых может оказаться полезнее, зазубривания на износ. Таймер отличный инструмент для самоконтроля.

 

Мануалы:

Ссылки:

Знание языка программирования помогает:

  • Лучше понять логику работы программного кода.
  • Писать инструменты облегчающие модификацию различных ресурсов.

 

Отличные книги по языку программирования, для старта и среднего уровня:

  • 1. “C++ основы программирования” . Автор: Джефф Кент
  • 2. ” Полный справочник по C++”. Автор:  Герберт Шилдт
Category: PSX Manuals | Added by: 2-FACE (2017-05-06)
Views: 165 | Tags: PSX хакинг, Hitmen, Munch, psx, PSiG, PSX Debugger, Artmoney, Debugger, Ida, Griver | Rating: 0.0/0
Total comments: 0
avatar