Навеяно недавней дискуссией про игры с донатом. Собственно, в нормальных, сингл играх микротранзакции уже не новость. Тот же Dead Space 3, говорят, еще в свежих Assassin Creed появилось. Логично ожидать, что это безобразие продолжится и таких игр будет появляться все больше. Следовательно, вопрос читерства становится все более актуальным. Мы же не хотим донатить и тем самым поощрять скотскую тенденцию.
Не, разумеется, можно играть честно и набирать нужные ресурсы в самой игре. Но разработчики не дураки, и чтобы стимулировать геймеров к донату, они, можно не сомневаться, позаботились о том, чтобы честная игра была некомфортной, и нужное количество ресурсов или опыта можно было добыть только путем страданий. Да даже если и достаточно быстро набирается честно - один черт, если бы я хотел играть в тупой фарм одних и тех же локаций, я бы давно играл в какую-нибудь ММО, которые все без исключения про тупой фарм одних и тех же локаций. Так что будем читерить.
Собственно, о читерстве речи уже и нет. Мы используем возможность, предусмотренную в игре самими разработчиками как часть игрового процесса. Т.е. все честно. То, что они сделали ее платной - да пошли они в жопу.
Для лечения игры будем использовать Cheat Engine. Есть еще аналогичная по возможностям софтина - Artmoney, но я ее не знаю. Вообще, с помощью CE начитерить себе нужное количество денег, опыта, ресурсов, да и вообще чего угодно - не представляет ни малейшей проблемы. Но есть одно неудобство: при каждом запуске игры (а в некоторых играх - и при каждой загрузке локации) нужные переменные приходится искать заново.
Ниже описан самый простой из нескольких возможных способов, как автоматизировать этот процесс. К сожалению, не идеальный, работает не со всеми играми. Но с большинством. Зато простой и можно быстро сделать. А вот если простой способ не прокатит - тогда уже можно начинать разбираться с особенностями игры индивидуально, или заглянуть на форум Cheat Engine и посмотреть там, скорее всего, кто-нибудь уже выложил подходящий скрипт.
Как водится, сколько-нибудь толковый гайд гуглом найти проблематично. Даже тот, по которому разбирался я - давно сгинул, и сайт тоже. Так что, пока что-то еще помню, решил записать здесь. Чтобы, если когда-нибудь понадобится, не искать и не напрягать память.
Простой способ (поиск одноуровневых указателей)
1. Для начала находим адрес переменной, отвечающей за нужный нам игровой параметр. Подробно про этот шаг писать смысла нет, он общеизвестен. Копируем адрес в нижнее окно.
2. В нижнем окне кликаем правой кнопкой по строке адреса и в появившемся меню выбираем "Find out what writes to this address" - ставим бряк на запись. Даем разрешение на запуск дебаггера.
3. Возвращаемся в игру и проделываем там что-нибудь, что изменит нужное нам значение. Покупаем/продаем, если ищем деньги, или подставляемся под пулю, если здоровье.
4. Переключаемся на CE и в окне дебаггера видим появившуюся запись из одной или нескольких строк. Выбираем одну (вида mov [eax+xxx],ecx) и нажимаем сбоку кнопку "More information".
5. Кликаем правой кнопкой по списку адресов вверху и нажимаем "copy info to clipboard". Копируем куда-нибудь в блокнот. После этого закрываем окно информации и в окне дебаггера нажимаем кнопку "Stop", чтобы не гонять лишние процессы. Закрываем дебаггер.
Картинка №1.
6. В основном окне CE в окно для поиска вводим адрес, который видели в указанном на картинке №1 месте. Ставим рядом галку Hex, тип значения - 4 байта. Нажимаем поиск. Листаем появившийся список адресов и находим первый, отмеченный зеленым - статический адрес. Копируем его вниз. Если на данном этапе зеленых адресов не нашлось - значит, с этой игрой не все так просто, и чтобы создать чит, понадобится скрипт на языке ассемблера. Или пробуем способ, описанный во второй части заметки.
7. В нижнем окне дважды кликаем по адресу (именно там, где в заголовке таблицы указано "Adress").
Картинка №2.
8. Копируем из верхней строки адрес вида "program.exe+HEX".
9. Ставим галку "Pointer". Ниже появляется два новых поля, верхнее, где был адрес, становится недоступным. В самое нижнее поле вставляем адрес, скопированный сверху. Тип выставляем такой же, какой был у исходной переменной, непосредственно содержащей нужное нам значение. В рассматриваем примере это однобайтовая переменная.
10. Рассчитываем смещение. Запускаем вендовый калькулятор в шестнадцатиричном режиме и из адреса исходной переменной ( 07B2D52B ) вычитаем адрес, который искали в пункте 6 ( 07AF0020 ). Полученное число ( 3D50B ) вставляем во второе снизу поле над адресом. Впрочем, это же смещение и так было в окне информации дебаггера. Если знать, на что смотреть - можно не считать. Заодно можно и описание какое-нибудь вбить.
Картинка №3.
11. Жмем "Ok". В принявшей нужный нам вид строке в нижнем окне CE кликаем правой кнопкой по значению в колонке "Value" и выбираем пункт "Show as decimal", чтобы число наших денег/здоровья/патронов показывалось в десятичном формате, для удобства. Удаляем из нижнего окна все лишнее и сохраняем результат в виде файла *.CT. Теперь не надо будет каждый раз после запуска игры заново искать нужные переменные, достаточно загрузить этот файл в CE.
PS: Спойлер. Чтобы не считать смещение, достаточно посмотреть на команду, в примере - eax+ebx. Внизу в окне информации дебаггера был список значений. Смотрим значения регистров, eax - это адрес, тот же самый, который мы копировали в поиск. Следовательно, ebx - смещение.
Сложный способ (поиск многоуровневых указателей)
1. Начинаем точно также. Находим адрес нужной переменной и копируем его вниз.
2. Правой кнопкой кликаем по строке в нижнем окне и выбираем пункт "Pointer scan for this adress". В появившемся окне ничего не меняем, жмем "Ok".
3. Появится окно с предложением сохранить файл, вводим какое-нибудь имя и подтверждаем. Начнется обработка, которая может занять довольно длительное время. По окончании выскочит окно с результатом.
4. Закрываем все окна, кроме основного окна СЕ. Выходим из игры. Запускаем игру заново. В окне CE снова открываем процесс игры. Отвечаем "No" на вопрос, хотим ли мы сохранить ранее найденные результаты.
5. В основном окне CE слева, над нижним окном, нажимаем кнопочку "Memory View". Откроется новое окно с дампом памяти, в верхнем меню которого следует выбрать Tools -> Pointer Scan. После чего снова появится уже знакомое нам окно указателей.
6. В окне указателей в верхнем меню выбираем File -> Open и открываем сохраненный в пунте 3 файл. Теперь в верхнем меню уже этого окна выбираем Pointer scanner -> Rescan memory - Removes pointers not pointing to the right adress. В появившемся новом окне ставим переключатель вверху в положение "Value to find" и вводим в поле ниже число, соответствующее тому, какое значение имеет в игре нужный нам параметр на данный момент. И указываем справа его тип, тот же самый, что мы искали в самый первый раз. (Как вариант - ищем не по значению, а по адресу, если не поленились найти его заново). Жмем "Ok", снова появляется окно для сохранения файла, сохраняем. Можно перезаписать старый. Теперь процесс занимает намного меньше времени и некоторое количество результатов отсеивается.
7. Повторяем пункты 4-6 раз пять или больше, пока количество результатов не перестанет уменьшаться заметно.
8. Когда количество найденных результатов стало более-менее стабильным, начинаем отлавливать среди них нужный. Сортируем значения по "Base Adress" и выбираем штук пять из тех, которые относятся к основному процессу игры. Если таковых не осталось - тогда сойдет и из игровых модулей. Выбираем наугад и дважды кликаем по каждому, после чего готовые указатели копируются в нижнюю таблицу основного окна CE.
9. Продолжаем выполнять пункты 4-6 с той разницей, что при перезагрузке процесса игры теперь сохраняем ранее найденные результаты. После каждой загрузки процесса смотрим нижнюю таблицу и выкидываем адреса, чье значение не соответствует актуальному игровому параметру или вообще осталось не определено. После этого грузим, как ранее, Pointer scanner, проводим новую фильтрацию и добавляем в нижнюю таблицу несколько свежих адресов.
10. Продолжаем развлекаться до достижения стабильного результата - пока хотя бы один из записанных в нижней таблице адресов не будет при каждом запуске игры неизменно показывать актуальный результат. Собственно, вот оно и есть, что нам и требовалось.
11. Выкидываем из таблицы все лишнее и сохраняем нужное в файл *.CT. Удаляем созданный при сканировании указателей файл(ы) *.PTR и огромную кучу накопившихся к тому времени временных файлов. Впрочем, с удалением можно и погодить пару дней, на случай, если после пары перезагрузок найденные адреса все-таки слетят. Т.е. окажется все-таки не то. Чтобы можно было продолжить с того момента, на котором остановились, а не начинать все заново.
Картинки, зачем-то вставленные движком форума еще раз
-
Скрыть объявление
Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.
-
Скрыть объявлениеЕсли Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.
Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
- Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
- Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
- Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
- Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
С уважением, администрация форума Old-Games.RU
Комментарии
Сортировать комментарии по