MortВо-первых, читы для данной игры уже есть в базе данных. А во-вторых, расскажу:
Что делать, если искомое значение в игре задано не в явном виде? Например шкала здоровья в драчках или в какой-нибудь ещё игре.
В этой теме мы рассмотрим на примере игру God Of War Collection (BCUS98229) и методику создания чит-кодов к здоровью главного персонажа Кратоса. Также познакомимся с числами с плавающей точкой. Но отдельным подготовительным пунктом поговорим, как запустить эту игру под DEX и подключиться к ней через Target Manager API. Мне не сразу это удалось сделать.
Для начала заливаем нашу игру на приставку в виде папки, а не образа, в каталог GAMES. Проверим наличие обновления к данной игре. Оно есть и имеет версию 1.01. Скачиваем патч обновления и распаковываем его. В нашем случае бесполезно работать с файлом EBOOT.BIN, т.к. он всего лишь запускает меню выбора частей игры. Сама же игра первой части God of War - это файл GOW1.self. Сразу поясню, что *. elf файлы на приставке - это исполнительные файлы, как *.exe на компьютере с Windows. Однако, приставка со своей системой защиты не будет запускать простой исполнительный файл. Ей нужен зашифрованный и имеющий цифровую подпись от Sony исполнительный файл. Такой файл называется Signed elf. Вот поэтому и расширение у него *.self. Имейте в виду, что любой EBOOT.BIN файл от любой игры является на самом деле *.self файлом, просто его так переименовали, чтобы он запускался в первую очередь, и заменили общий ключ шифрования dev_klicensee на частный ключ шифрования klicensee (только для PSN игр).
По большому счёту, мы должны были установить патч обновления на приставку и модифицировать файл GOW1.self под DEX из патча, который находится в ../dev_hdd0/game/BCUS98229/USRDIR/. Однако, при такой схеме игра у меня никак не запускалась! Пришлось закинуть с заменой файл GOW1.self из патча в папку с дисковой игрой, а сам патч с приставки удалить. Теперь осталось переделать наш GOW1.self под DEX приставку. К сожалению, наш любимый ESSSE v4.2 не имеет такой функции и автор программы перестал обновлять её и реагировать на сообщения. Так что придётся делать всё вручную. Закидываем GOW1.self в подпапку SELF_Files и выбираем функцию № 2 для переподписи нашего файла и подтверждаем. Видим через секунду, что программа знает ключ шифрования dev_klicensee (Trying Found klicense = 9812F06A923E442DBD3B8CF7AFBC2E87) и способна расшифровать наш файл в обычный GOW1.elf. Подтверждаем. После появления следующего меню с вариантами переподписи файла ничего не нажимаем, а заходим в подпапку Resigned_SELFS и забираем наш расшифрованный файл GOW1.elf и переносим его в корневую папку программы ESSSE. Программу ESSSE можно прямо сейчас просто закрыть.
Теперь из командной строки работаем с программкой make_fself.exe, которая лежит здесь же в корне программы ESSSE. Эта маленькая программка создаёт из *.elf файлов подписанные под DEX приставки *.self файлы. Не знаю, как расшифровывается fself (возможно factory signed elf), но помните, что у нас на выходе получится исполнительный файл
дисковой игры, подписанный под консоль разработчика. И так в моём случае я пишу такую команду в командной строке:
D:\Resigner>make_fself GOW1.elf GOW1.self
Это значит, что наш файл GOW1.elf будет зашифрован и подписан для консоли DEX без сжатия и переименован в GOW1.self. Закидываем его на приставку в папку дисковой игрой и запускаем игру. После появления меню выбора частей игры God of War запускаем первую часть и после появления меню игры подключаемся к игре с помощью NetCheat PS3, используя тип подключения Target Manager API. Начинаем игру и ждём, когда мы получим управление над главным героем.
Неизвестное значение ищется по похожей методике, только начальное значение в поиске мы выбираем, как неизвестное (Unknown Value). В этом случае будет отслеживаться вся память из заданного диапазона поиска. Рекомендую начинать с 4-х байтного значения.
И так, к практике! Кратос стоит у нас на носу корабля, а на него лезут черти с мечами. Ставим игру на паузу и сканируем диапазоны памяти. Похоже, что игра располагается в диапазоне 30000000 - 3B100000. Это значит, что мы должны перелопатить более 46-ти миллионов четырёхбайтных значений. К сожалению, NetCheat PS3 закрывается с ошибкой, если количество найденных вариантов превышает 14 миллионов. Поэтому будем сканировать память кусочками. Ставим поиск в диапазоне 30000000 - 32000000 и ищем Unknown Value. Нас предупреждают, что будет более 8-ми миллионов значений - соглашаемся. После поиска позволяем в игре ударить нашего Кратоса и снова ставим игру на паузу. В этот раз говорим программе, что наше неизвестное значение уменьшилось (Decreased (S)) и отсеиваем значения. Потом ещё раз, и ещё раз... Также полезно иногда побегать, не получив повреждений, и сообщить программе поиска, что наше значение не изменилось (Unchanged). Если в итоге мы ничего не нашли, то переходим к следующей части диапазона 32000000 - 34000000 и повторяем всё сначала. Главное, не перезапускать игру с начала, а продолжать в неё играть, то теряя здоровье, то пополняя его (тогда отсеиваем значения, как Increased (S)). Это делается для того, чтобы адрес со значением здоровья от нас не ускользнул в другую область. Например, ищем мы в диапазоне 30000000 - 32000000, а искомый адрес у нас 32200000. Понятно, что мы его не найдём. Потом мы меняем диапазон поиска на 32000000 - 34000000 и перезапускаем игру сначала. И вот тут наш адрес со здоровьем поменялся на 31D00000, и мы снова его не находим. Думаю, вы поняли, в чём может быть подвох.
И так, у меня очень быстро нашлось здоровье Кратоса 0 30A1EA1C 00000064, но это всего лишь отображение зелёной полоски на экране, которое потом опять приобретает реальное значение. А вот чуть ниже мы видим 0 30A46DD4 42C80000. Это и есть реальное значение здоровья Кратоса. Также мы видим, что полное его здоровье в начале игры составляет 42C80000, что означает 100 в формате с плавающей запятой или плавающей точкой по буржуйски. Для лучшего понимания и закрепления материала найдём здоровье Кратоса сразу в формате с плавающей точкой (float point). Запускаем игру и поиск заново и ищем точное значение (Equal To) типа (Float), равное 100. Потом также отсеиваем и в итоге получим чит-код немного другого формата, более понятного для нас:
2 30A46DD4 100Двойка в начале чит-кода говорит о том, что мы имеем дело со значением с плавающей точкой. И это значение 100. В память приставки на самом деле запишется 42C80000. Т.е. код 0 30A46DD4 42C80000 = код 2 30A46DD4 100, только второй нам более удобен и понятен.
После перезарузки приставки наш чит-код продолжает работать, так что лезть в отладчик и выискивать функцию, уменьшающую здоровье Кратоса, не обязательно.