на главную
об игре
Prince of Persia: Warrior Within 30.11.2004

Взлом игры

В данной теме предлагаю делиться опытом взлома игры (через Artmoney, Chemax, Tsearch, HxD и многие другие программы и трейнеры). Игра множество раз пройдена на Харде без читерства, так что с комментариями типа "Фу, читер!" проходите мимо. Цель данной темы - узнать механизмы и возможности игры, как поведёт она себя в какой-либо ситуации.

Комментарии: 5
Ваш комментарий
Мой взлом Prince of Persia: SoT и WW. Статья 1

Началось всё давным-давно в одной далёкой галактике. Хотя нет! Всё было не так. В то время я занимался съёмками видео про баги WW после различных зипов (зип – баг прохождения сквозь стены с помощью отмотки времени). Активно следил за группой kindred blades и первое время выкладывал видео там. В этой группе как-то выложили редактор сохранений Timeline2. К его возможностям относятся: изменение основного и дополнительного мечей, прочности дополнительного меча, текущего и максимального здоровья, количества песочных резервуаров, возможности игры за Принца или Песчаного Духа, локации, временной линии, уровня сложности.



Заинтересовала меня возможность замены мечей на разных этапах игры. Даже серию роликов снял с кодовым названием "Операция "Меченосец" [https://vk.com/videos-150539102?section=album_5]

С самого начала проекта мне захотелось попробовать сразиться с Дахакой на различных мечах. Но с помощью Timeline2 мне это сделать не удалось: сейвэдитор изменяет мечи только на точках сохранений (фонтанах), а если побежишь к месту битвы не с Водным мечом, то будешь сражаться с Каилиной. Решение было следующим: узнать значения мечей в памяти игры и заменить непосредственно во время боя с Дахакой. Поиск неизвестных значений в Artmoney ничего не дал. Поэтому я пошёл другим путём: взял последний сейв в игре, сделал копию, заменил меч в копии через сейвэдитор и сделал сравнение копии и оригинала по HEX-коду. Результат оказался следующий:



Разница оказалась в 1 оффсете. Проверив все мечи и отсутсвие меча, выяснил, что код меча состоит из 4 байт. HEX-код мечей на рисунке выделен жёлтым цветом. В памяти HEX-коды мечей расположены в обратном порядке.

Орлиный меч - 00 00 00 00. Деревянная палка - 00 00 00 01. Меч Паука - 00 00 00 02. Змеиный меч - 00 00 00 03. Львиный меч - 00 00 00 04. Сломанный Львиный меч - 00 00 00 05. Меч Скорпиона - 00 00 00 06. Водный меч - 00 00 00 07.

Искать такие значения в памяти – всё равно, что иголку в стоге... Нет! Пусть будет в песчаной куче! Поэтому я взял HEX-значения перед мечом из сейва и попробовал отыскать эти байты вместе с байтами меча через HEX-редактор памяти TSearch. Совпадений оказалось всего несколько. Но работает данный адрес [D18044] немного не так, как я ожидал. Этот адрес указывает игре, какой меч использовать при загрузке сейва/чекпоинта. Данный адрес после начала новой игры начинает работать только после первого чекпоинта. И мне удалось попробовать сражение с Дахакой разными мечами! Кроме того, адрес оказался статическим, что позволило мне создать простой трейнер sWWord [https://vk.com/doc-150539102_474812966?dl=b57ec41cf83900024a]

0
Мой взлом Prince of Persia: SoT и WW. Часть 2.

Воодушевившись успехом взлома главного меча, я решил продолжить взлом, используя Timeline2 и сравнение сейвов. Выбор пал на дополнительный меч. По тому же сценарию, что и для основного меча, я нашёл адреса. Несколько раз меч удалось заменить, но потом повторить успех не удалось. Адреса то работают, то нет. HEX-коды мечей можно получить сравнением сейвов, но это очень долго – мечей очень много. Существует статья BlackDaemon'а, одного из создателей Timeline2 и 3, где он указывает эти HEX-коды [http://www.pspx.ru/forum/showthread.php?t=105741]. Статья была написана для PSP-версий игр POP: Revelations и POP: Rival Swords (расширенные аналоги WW и T2T), поэтому последний столбик не совсем подходит для PC-версии.


Sad but true
Во время этих событий что-то заставило меня установить полученную бесплатно SOT от UPLAY. Ностальгия, наверное... Я подумал: "А почему бы не взломать и SOT на мечи?" Мечи я взломал. Сейвы с мечами выложил [3 ссылки: https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohranenie_savegame_poetapnoe_prohozhdenie_s_kazhdym_vidom_mechej_1_8_1_4_serpent_mln-84106/; https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohraneniya_savegames_novye_urovni_slozhnosti_hard_impossible_megaimpossible_megaeasy_1_8_1_4_serpent_mln-84722/; https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohraneniya_savegames_novye_urovni_slozhnosti_meganormal_megahard_1_8_1_4_serpent_mln-85395/]. Всё хорошо. Но... всё было не так! Было не так просто, как с WW: для SOT не было сделано своего Timeline. Что же делать? Я взял 2 сейва: до и после взятия 2 меча. Но там оказалось очень много различий.


И была ещё одна сложность: защита игры от изменения сохранений.


Тогда я решил искать в памяти игры через TSearch. Нашёл. Оказалось, что за меч отвечает половина оффсета. HEX-коды мечей для половины оффсета следующие: 1 меч - 0, 2 меч - 2, 3 меч - 4, 4 меч - 6. Всего же для половины оффсета возможно 16 значений от 0 до F. Я проверил их все - в них хранятся только знакомые нам 4 меча. Но оказалось, что не всё так просто с этим адресом. По мере прохождения игры адрес меняет своё положение в памяти игры. Далее я стал исследовать смену 2 меча на 3. По-тихоньку у меня начала образовываться таблица адресов на разных процентах игры. Этому способствовала структура из 3 байт перед мечом и 1,5 байта после (на скриншоте сравнения сейвов данная структура выделена жёлтым цветом).
Эти структуры вокруг меча отвечают за общее и текущее на момент сохранения/чекпоинта количество песочных резервуаров, полуколец, за количество поглощённых песочных облак и за количество поглощённых монстров для создания нового полукольца. Полностью заполненная структура выглядит так: 50 A5 14 60 0A
Благодаря этим структурам я нашёл почти все адреса для всех %. Но иногда у одного и того же % были разные адреса, иногда адрес от одного % был у другого. В итоге у меня была готова таблица для всех процентов кроме 0 и 2, когда у Принца нет песков, данная структура вокруг меча забита нулями, да и сам адрес меча равен нулю. (На 98 меч не даёт изменить скрипт). Как искать нули в памяти игры? Я думал это невозможно. Но я всё же нашёл эти адреса. В этом мне помогла WW. Как? Об этом в следующий раз.

0
Мой взлом Prince of Persia: SoT и WW. Часть 3.

Приостановив исследования SoT, я вернулся к WW. Опять безуспешно попробовал взлом 2 меча. Далее начал искать адреса для создания аналога сейвэдитора, который работал бы с памятью игры, а не с сохранениями.
Все нижеприведённые адреса работают одинаково. Меняем значение. Умираем. Загружаемся. Получаем изменение в игре. Работают они только после первого чекпоинта. Скриптовые изменения могут блокировать возможность взлома (например, получение нового меча)
1. Значения жизни в WW для Харда. Таких оказалось 2. По адресам D18038 и D1803A. По первому адресу хранится текущее значение здоровья при сейве или чекпоинте, а по второму - максимальное при тех же условиях. Числа 2-байтные, теоретически их значения могут быть в пределах 0-65535 (0000-FFFF). Интересный эффект возникает при нуле жизней - Принц умирает при простом прыжке. Диапазон значений жизни для Харда 66-166 [66, 78, 88, 100, 111, 122, 133, 144, 154, 166]
2. 2-байтное значение количества заполненных резервуаров песков при загрузке из сейвов или чекпоинтов расположены по адресу D1803C. Теоретически тут тоже 65535, но большое значение тянет за собой вылеты игры. Установив 15, вылетов не обнаружил.
3. Следующий адрес D1803E. Также 2-байтный. Открытая песочная сила. Диапазон значений: 0-9. [0 - None; 1 - Recall; 2 - Eye of the Storm; 3 - Breath of Fate; 4 - 4 Sand Tanks; 5 - Ravages of Time; 6 - 5 Sand Tanks; 7 - Wind of Fate; 8 - 6 Sand Tanks; 9 - Cyclone of Fate]
4. Следующий адрес D18040. 2-байтный. Здесь расположены данные о взятых апгрейдах здоровья. Число бинарное. Количество единиц в нём указывает на количество взятых апгрейдов, а положение каждой единицы в числе соответствует определённому апгрейду. То, что адрес меняется при взятии апгрейдов заметил Я, а бинарную суть данного адреса уловил DedGameOver.

5. D18042 - прочность 2-го оружия. 2 байта. 0-65535. Если ставишь 0, можно сделать 1 удар.
Скин Принца заменить не удалось. Не знаю почему, но не работает. В сейвэдиторе работает, через память не работает. Если интересно, вот значения из Timeline2 (порядок обратный, как в хексе): No Prince - E3 0E 00 04; Yes Prince - 48 28 08 2B; Yes Sand Wraith - 64 EF 00 3B
Как вы возможно заподозрили, все эти адреса находятся рядом друг с другом. В общем виде получается некая структура, а выглядит она так:



А теперь самое интересное! Как же мне удалось взломать мечи в SoT в начале игры, где искать нужно одни нули? Структура WW имеет 2 значения здоровья (например, 64 00 64 00). Случайно, блуждая по HEX-коду памяти SoT, я обнаружил похожую структуру, только числа там 4-байтные (64 00 00 00 64 00 00 00). Я нашёл эту структуру в начале SoT, поменял значение, где должен быть меч, и... удалось! Ещё можно поставить все пески и полукольца (но после получения кинжала), поставить маленькое здоровье, чтобы усложнить игру, или, наоборот, большое, чтобы упростить. Можно отключить силу песков. К тому же появляется куча багов. Например, при использовании 3 и 4 мечей на индусах (третьим мечом некоторых индусов убивать можно только одиночными ударами; при ударе четвёртым по индусу труп мёртвого предшественника исчезает). При отрицательном здоровье колья и сейвы не срабатывают. Баги с HUDом. И другое. Всё это я использовал в своих видео. [ https://vk.com/videos-150539102?section=album_7 ] Для простых людей возня с хексом - непосильная задача, а написать годный трейнер для меня слишком сложно. Поэтому решил выложить в виде сейвов. Загрузил в начале, начал проходить с новым параметром, что-то не получилось - загрузил следующий. [3 ссылки: https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohranenie_savegame_poetapnoe_prohozhdenie_s_kazhdym_vidom_mechej_1_8_1_4_serpent_mln-84106/ ; https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohraneniya_savegames_novye_urovni_slozhnosti_hard_impossible_megaimpossible_megaeasy_1_8_1_4_serpent_mln-84722/ ; https://www.playground.ru/cheats/prince_of_persia_the_sands_of_time_sohraneniya_savegames_novye_urovni_slozhnosti_meganormal_megahard_1_8_1_4_serpent_mln-85395/ ]

-1