Как найти адрес памяти в cheat engine
Навеяно недавней дискуссией про игры с донатом. Собственно, в нормальных, сингл играх микротранзакции уже не новость. Тот же 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", чтобы не гонять лишние процессы. Закрываем дебаггер.
6. В основном окне CE в окно для поиска вводим адрес, который видели в указанном на картинке №1 месте. Ставим рядом галку Hex, тип значения - 4 байта. Нажимаем поиск. Листаем появившийся список адресов и находим первый, отмеченный зеленым - статический адрес. Копируем его вниз. Если на данном этапе зеленых адресов не нашлось - значит, с этой игрой не все так просто, и чтобы создать чит, понадобится скрипт на языке ассемблера. Или пробуем способ, описанный во второй части заметки.
7. В нижнем окне дважды кликаем по адресу (именно там, где в заголовке таблицы указано "Adress").
8. Копируем из верхней строки адрес вида "program.exe+HEX".
9. Ставим галку "Pointer". Ниже появляется два новых поля, верхнее, где был адрес, становится недоступным. В самое нижнее поле вставляем адрес, скопированный сверху. Тип выставляем такой же, какой был у исходной переменной, непосредственно содержащей нужное нам значение. В рассматриваем примере это однобайтовая переменная.
10. Рассчитываем смещение. Запускаем вендовый калькулятор в шестнадцатиричном режиме и из адреса исходной переменной ( 07B2D52B ) вычитаем адрес, который искали в пункте 6 ( 07AF0020 ). Полученное число ( 3D50B ) вставляем во второе снизу поле над адресом. Впрочем, это же смещение и так было в окне информации дебаггера. Если знать, на что смотреть - можно не считать. Заодно можно и описание какое-нибудь вбить.
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 и огромную кучу накопившихся к тому времени временных файлов. Впрочем, с удалением можно и погодить пару дней, на случай, если после пары перезагрузок найденные адреса все-таки слетят. Т.е. окажется все-таки не то. Чтобы можно было продолжить с того момента, на котором остановились, а не начинать все заново.
Начну с небольшого отступления от собственно поиска базового адреса.
Так как графический материал статьи составляет 2.36 мегабайта, все скриншоты будут скрыты в тегах more, для экономии вашего трафика, и ускорения загрузки страницы.
Необходимо понимать что "базовый" адрес, требующийся PWGtm (в народе волхак) не является действительно базовым адресом приложения. Он является статическим указателем на некоторые игровые структуры.
О самой программе Cheat Engine, и о ее возможностях, можно прочитать тут. Программа содержит в своем составе обучающие туториалы, призванные научить новых пользователей работе с данной программе. Начиная с этой статьи, я рассмотрю прохождение всех туториалов данной программы. Итак, туториал первый, шаги 1 и 2.
Содержание
Туториал
Слово туториал, происходит от английского слова tutorial, что в переводе означает учебное пособие/руководство. Туториал в программе Cheat Engine, как было сказано выше предназначен обучить нас базовым навыкам взлома видео игр.
Запустить туториал программы Cheat Engine можно из меню Help, основного окна программы.
Сам туториал, представляет собой отдельную программу, состоящую из девяти шагов (на момент написания данной статьи). Мы будем рассматривать каждый шаг отдельно, и в данной статье ограничимся шагами 1 и 2.
Первый шаг программы является инструкцией, как открыть программу и как выбрать взламываемый процесс.
Со второго шага и далее, начинаются практические задания.
Шаг 1
Запустив первый туториал (неигровой), вы увидите первый шаг. В данном шаге описывается, как выбрать целевой процесс туториала для дальнейшей работы с ним.
Либо с помощью соответствующей кнопки на панели инструментов.
Окно выбора процесса выглядит следующим образом.
В окне выбора процесса доступно три вкладки. Applications - выбор запущенной программы по названию приложения. Processes - выбор запущенной программы по названию исполняемого файла. Windows - выбор запущенной программы по названию заголовка ее окна.
Важным нюансом, является то, что в окне выбора целевого процесса можно набирать его название, тем самым выполнять фильтрацию списка. Ввод поддерживаться сразу, достаточно просто начать писать.
Найдя нужный процесс, неважно в какой вкладке, выделяем его щелчком мыши, и нажимаем на кнопку Open. Окно выбора процесса при этом закроется, а в основном окне программы Cheat Engine появится информация о выбранном для работы процессе.
Теперь Cheat Engine может управлять процессом запущенного ранее туториала.
Так как первый шаг туториала носит информационный характер, перейдем к реальной работе с программой, перейдя к следующему шагу. Переходим в окно туториала и нажимаем на кнопку Next.
Шаг 2
Второй шаг представляет собой практическое задание. Выглядит оно следующим образом.
В нашем распоряжении счетчик здоровья Health со значением 100. При нажатии на кнопку Hit me значение здоровья уменьшается. Чтобы решить данное задание, необходимо задать счетчику здоровья значение 1000. Сделать это без применения сторонних программ, естественно невозможно.
Теперь немного теории. При запуске любая программа загружается в оперативную память, и хранит в ней исполняемый код, и все необходимые параметры и значения. Параметры и значения могут представлять собой целые числа, числа с плавающей запятой, и строки. Хранятся они в определенных участках оперативной памяти и имеют свои уникальные адреса.
Cheat Engine позволяет выполнять поиск в области памяти запущенной программы, с целью найти и изменить необходимые значение запущенной программы.
И так, приступим к выполнению шага 2. На данный момент у нас запущен туториал на втором шаге, и так же запущен Cheat Engine с открытым процессом туториала.
Чтобы установить параметру здоровья значение 1000, его нужно сначала найти. Выполним первоначальный поиск текущего известного значения здоровья.
Вводим текущее значение здоровья, в нашем случае это целое число 100, в поле Value (Значение) программы Cheat Engine, и нажимаем на кнопку First Scan (Первое сканирование).
По завершению первого сканирования, левое поле окна Cheat Engine заполнится всеми адресами памяти содержащими число 100. Кроме этого, станет доступна кнопка Next Scan (Последующее сканирование).
Как можно заметить, у текущего процесса, в оперативной памяти сейчас имеется 42 адреса содержащих целое число 100. Чтобы определить, какой из данных адресов отвечает именно за здоровье, необходимо выполнить повторное сканирование среди уже найденных значений, но предварительно изменив, любым из возможных способов, текущее значение здоровья.
В случае с туториалом, в нашем распоряжении имеется кнопка Hit me имитирующая, так сказать, потерю здоровья. В случае реальной игры, вам потребуется получить урон, или выстрелить один боеприпас, в зависимости от того какое значение вы ищите.
Нажмем на кнопку Hit me чтобы значение здоровья уменьшилось.
Значение здоровья изменилось и стало равно 95. Обращаем внимание на таблицу с адресами памяти. Cheat Engine довольно продуманная программа, и как можно заметить изменившиеся значения сразу же отображаются изменив свой цвет на красный.
Если просмотреть весь список адресов, то можно обнаружить, что изменилось значения только для одного адреса. Это в свою очередь означает, что данный адрес памяти отвечает за необходимое нам значение здоровья.
На данном этапе, можно было бы изменить значение данного адреса, и шаг был бы пройден. Но давайте рассмотрим, как осуществляется повторный поиск по уже найденным адресам.
Приступим. Введем изменившееся значение, в моем случае это 95, в поле Value, но уже с последующим нажатием на кнопку Next Scan, тем самым запуская процесс поиска по уже найденным ранее адресам.
После процедуры фильтрации обнаруживаем, что найденный ранее адрес и был искомым.
Теперь осталось только изменить значение данного участка памяти. Для этого достаточно выполнить клик правой кнопкой мыши по целевому адресу, и в открывшемся меню выбрать пункт Change value of selected addresses. После, в открывшемся окне ввести нужное значение, в случае туториала это число 1000, и нажать на кнопку OK.
После изменения значения, замечаем как кнопка Next, окна туториала, стала активной, что свидетельствует об успешном выполнении задания.
Нажав на нее, мы переходим к следующему, третьему шагу данного туториала. Заданием которого является поиск значения индикатора здоровья, представленного в виде полоски без числового обозначения. О прохождении которого мы поговорим в следующей статье.
Cheat Engine – простая программа, которая способна искать в процессе (игре) значения различных параметров (жизни, деньги, характеристики), а также изменять скорость, ускоряя или замедляя процесс игры. Также имеется возможность создавать трейнеры. Впрочем, применение у этой программы можно найти не только в играх. Можно сказать, что эта программа является более продвинутым конкурентом ArtMoney, которая тоже сейчас довольно популярна.
Мы попытаемся рассказать вам обо всех возможностях Cheat Engine. Ну что ж. начнем.
Давайте запустим наш объект изучения (у меня это Cheat Engine 6.1) и посмотрим на картинку:
На скриншоте выше показаны основные элементы интерфейса программы. С ними мы и будем работать.
Process List (кнопка со значком компьютера) - выводит список процессов, в котором нужно выбрать тот процесс, который вы хотите изменять.
Values List 1 (тот, что слева) - список найденных значений в процессе сканирования (адрес и само значение)
First Scan - выполняет первичное сканирование по заданным характеристикам
Next Scan - фильтрует уже найденные значения по заданным характеристикам (которые могут отличаться от начальных, кроме типа значения)
Undo Scan - отменяет (откатывает) список найденных значений к предыдущему сканированию
Value - собственно, поле для ввода значения, которое мы хотим искать
Hex - при включении данной галки можно ввести значение в шестнадцатиричном виде, например FF00
• Unknown initial value - исходное значение не известно
Value Type - тип значения, то есть его числовое представление в памяти процесса
• Binary - двоичное значение (последовательность 0-лей и 1-ниц)
• Byte - байт/shortint (значение от 0 до 255, либо от -128 до 127)
При поиске значения можно вводить как без знаковые, так и знаковые значения, но Cheat Engine выводит все значения в без знаковом виде, поэтому не удивляйтесь, если при поиске вы введёте -12, а в результатах будут значения 244.
• 2 Bytes - 2 байта, word/smallint (значение от 0 до 65535, либо от -32768 до 32767)
• 4 Bytes - 4 байта, dword/int - наиболее часто встречающийся тип (значение от 0 до 2 32 -1, либо от -2 31 до 2 31 -1)
• 8 Bytes - 8 байт, uint64/int64 (значение от 0 до 2 64 -1, либо от -2 63 до 2 63 -1)
• Float - значение с плавающей запятой, точность 32-бит
• Double - значение с плавающей запятой, точность 64-бит
• Array of Bytes - массив (упорядоченная последовательность) байт
• All (Byte to Double) - поиск всех типов, начиная с байт, заканчивая double
Memory Scan Options - настройки сканирования памяти (начинающим это настраивать не обязательно)
Unrandomizer - в данной статье рассматривать не будем
Enable Speedhack - позволяет изменять общую скорость игры (Внимание: использование в играх по сети не рекомендуется, это приводит к нарушению синхронизации и как следствие к отключению от сервера)
Memory View - позволяет просматривать память процесса, а также имеет встроенный дизассемблер (в данной статье рассматриваться не будет)
Clear addresses (кнопка с красным зачёркнутым кругом) - чистит список адресов значений, которые мы выбрали
Add Address Manually - добавление адреса значения в список вручную (если мы уже точно знаем его адрес и тип)
Values List 2 (тот, что внизу) - список выбранных нами значений (галка "заморозка" значения, описание - мы сами его указываем, чтобы не запутаться в значениях, адрес значения в памяти, его тип, и наконец само значение)
С описанием основного интерфейса программы всё, теперь перейдём к практике!
Давайте испытаем программу в действии. Для примера давайте попробуем что-то подменить в игре Герои меча и Магии III. Великолепная, проверенная временем, стратегия.
Запускаем саму игру, запоминаем кол-во денег, которое у нас есть:
После нажатия у нас отобразилось название процесса, стала доступна кнопка First Scan и строка Value. Давайте напишем в Value количество денег (20800) и нажмем на First Scan.
Слева в списке отобразились все найденные значения 20800. Их несколько. Как же нам узнать, какое изменять? Надо продолжить. Давайте сделаем так, чтобы в самой игре число изменилось. Я купил пару воинов, и у меня стало 20100. Пишем это число туда, куда раньше писали 20800 и нажимаем Next Scan.
Ура! У нас осталось одно значение! Кликаем по нему 2 раза и оно попадает в список снизу, там мы его будем изменять. Если у вас не 1 значение, а 2-4 - это не плохо, и зачастую не нужно повторять сканирование, просто выбирайте все значения и изменяйте их. В памяти процесса (игры) могут хранится два значения: одно - фактическое, а второе - отображаемое в процессе игры (при изменении второго ничего кроме цифры на экране не изменится).
Теперь давайте изменим найденное значение на 100000. Нажимаем 2 раза по цифре 20100 в нижнем списке, выскакивает окошко, вводим туда 100000 и нажимаем ОК:
Готово! Теперь у нас 100000 золота! Давайте войдем в игру и проверим, так ли это:
Все верно. Зачастую бывает так, что при переходе обратно в игру значение ВИЗУАЛЬНО не меняется. Для его видимого изменения попробуйте в игре изменить это значение (купить, потратить ресурс), но, даже если вы этого не сделаете, значение будет именно то, которое вы установили в программе. В моём случае именно так и произошло, поэтому для проверки я потратил 250 золота.
Читайте также: