Читерство для нубов
Один из тредов на форуме натолкнул меня написать небольшой эдиториал по читерству и внутреннему устройству игр. Кто не заинтересован в жульничестве тоже заходите узнать больше про принцип работы игр будет интересно.
Вступительное слово
Некоторые считают читерство постыдным занятием. И, в какой-то мере, я с ними соглашусь мне тоже неприятно наблюдать за детьми, которые впервые взяли в руки редактор оперативной памяти и вписывают себе максимальные значения, чтобы появиться на доске почёта, но в читерстве есть намного больше. Это доступ к ресурсам, не использованным в игре, это возможность исправить ошибки гейм дизайнера самостоятельно, это замечательное ощущение, когда ты нашёл ту самую переменную, просеяв несколько миллионов. Подобное стоит попробовать если не для упрощения игрового процесса, то для возможности узнать игру с новой стороны.
Как оно работает?
Начнём с самого низкого уровня. Если вы заглядывали под крышку системного блока, то, наверняка, знаете, что в компьютере есть два типа памяти: ПЗУ (постоянное запоминающее устройство жёсткий диск) и ОЗУ (оперативное запоминающее устройство оперативка). Пропуская кучу технической лабуды, всё, что работает на компьютере в данный момент, выгружает некоторые данные с жёсткого диска в оперативную память, ради быстрой работы. Это же относится к играм.
Вот так подобные данные выглядят на практике. Каждая программа имеет свой небольшой кусочек оперативки, в котором находится всё, с чем ей придётся работать в ближайшем времени.
Что это значит в контексте читерства? Все значения, все переменные хранятся в легко определяемом месте и, пусть они иголка в стоге сена, с настойчивостью компьютера и наблюдательностью пользователя можно быстро найти эти значения.
Как читить?
Программы для поиска и редактирования значений сейчас есть почти везде. Для PSP это TempAR, для телефонов на базе Android это GameGuardian, для PS3 есть беспроводной дебаггер и огромное количество других, о которых я не знаю, но процесс и техники, если не одинаковые, то очень похожие:
Поиск значения
Самой простой техникой будет поиск известного значения. Возьмём, для примера, террарию (уж что под руку подвернулось).
У нас есть некоторое количество ресурсов, которое мы хотели бы увеличить (в случае на скриншотах это 8 слитков). Циферка у нас уже есть, поэтому поиск достаточно прост: выбираем процесс нашей игры, вбиваем в строку переменной нашу 8 и запускаем поиск значения (в случае с Cheat Engine это First Scan, для остальных программ название хоть и может меняться, но суть остаётся та же).
Скорее всего, наш редактор памяти выдаст нам несколько десятков/сотен/тысяч/десятков тысяч/миллионов результатов, среди которых есть нужный нам участок памяти. Так как количество слитков, это управляемая переменная, мне достаточно выбросить один слиток, чтобы моя переменная изменилась.
На втором скриншоте красные значения это те, которые только что изменились. Самые яркие изменились прямо сейчас, менее яркие изменились несколько секунд назад. Так можно наблюдать, как компьютер переписывает информацию в оперативной памяти.
Вводим новое значение, нажимаем Next Scan и все переменные, которые не захотели меняться (а значит, не имеют отношения к нашим слиткам), будут отсеяны со списка. Процесс отсеивания может занимать от одного до нескольких десятков шагов, в зависимости от сложности игры и способа поиска (для поиска точной переменной, обычно, достаточно просева в два приёма).
Наверняка, вам будут попадаться числа, размером в 1, 2 и 4 байта. Не забывайте, что сисла, размером в 1 байт могут хранить в себе значение от 0 до 255 (если вы ищете что-то, вроде значения денег и точно знаете, что оно может выходить за рамки, значит смотрите числа большего размера).
Обычно, нас интересуют четырёхбайтовые значения, они обычно зарезервированы под важные переменные. Когда вы нашли такую (или две-три таких переменных), то достаточно поменять их на нужное нам значение и вуаля.
«Мягкий» поиск
Или, как его называют технари, поиск строки методом аппроксимации.
Этот режим поиска используется для переменных, точное значение которых мы не знаем, но можем догадываться о их поведении (становится больше, становится меньше, остаётся равным). Мягкий поиск, обычно, требует намного больше ресурсов, так как приходится полностью сохранять процесс игры и уже потом сравнивать его со следующим. Дополнительно, такой поиск может занять больше шагов отсеивания (очень редко случается, когда мягкий поиск выдаёт нужную переменную в три-четыре приёма).
В целом, процесс очень похожий, просто мы не вводим значение нашей переменной, а создаём дамп памяти на первом шагу. На каждом последующем шагу мы выбираем как изменилась наша переменная (для самых сложных поисков рекомендую использовать «изменилась осталось равна», вместо строгих «стала больше стала меньше»).
Подобный поиск хорошо подходит для моментов, когда, вместо точного количества очков жизни, например, на экране отображается полоска. Как раз для такого мягкий поиск и был придуман.
Ручной поиск
Самый сложный, но и самый плодотворный из методов. Для этого придётся зайти в блок оперативной памяти, который выделен для игры, самому и найти значение, ориентируясь на знакомые места или уже известное расположение переменных. От себя добавлю небольшую историю, когда мне очень уж хотелось посмотреть на категорию редких предметов и, найдя одну переменную мягким поиском, я заодно нашёл адресное пространство всего блока переменных, в которых хранилось количество предметов в инвентаре.
Напоследок
Не стоит забывать, что переменные это не только цифры на экране. Переменные это расположение персонажа, расположение предметов, врагов, переменные отвечают за столкновение с текстурами и границами уровня. Таким способом можно сделать намного больше, чем просто добавить себе ресурсов.