Как найти указатель в cheat engine
Перейти к содержимому

Как найти указатель в cheat engine

  • автор:

Как найти указатель cheat engine вручную.

Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz

Поделиться страницей

  • Russian (RU) Custom
  • Обратная связь
  • Условия и правила
  • Политика конфиденциальности
  • Помощь
  • RSS

Локализация от XenForo.Info

Style Made By: DohTheme

  • Ширина
  • Запросов 39
  • Время 0.5044s
  • Память 7.27MB

Cheat Engine — Поиск указателей

cheatengine_logo2

— От меня ничто не укроется. А разве могут отказать в чём-либо тому, у кого в руках мешок с золотом? Я достаточно богат, чтобы покупать совесть человеческую, управлять всесильными министрами через их фаворитов, начиная с канцелярских служителей и кончая любовницами. Это ли не власть?
Оноре де Бальзак, «Гобсек», 1830 г.

Ола фламанте, амигос унд мучачос!
Настало время вернуться к инструментарию богоподобного Cheat Engine. Всем, кто по каким-то неведомым причинам в нынешние засушливые времена умудрился пропустить вступительный гайд по CE, настоятельно рекомендую ознакомиться, а то и причаститься. В своем потоке сознания я буду исходить из того предположения, что обычный поиск значений в памяти уже освоен поньтингентом, и закидывать пару гранат просвещения в темный подвал невежества по второму разу не нужно. Все возникающие вопросы, замечания, предложения и пожелания долгой и мучительной смерти можно смело направлять в каменты. Сегодня разговор пойдет чуть более сурьезный, но поверхностность рассмотрения в рамках текущего гайда и продуманность инструментов СЕ позволят свести в минимуму многие сложности в самом процессе поиска и отсева энтих самых указателей. Даже если кто-то нихуя не поймет, он все равно сможет искать указатели и полной грудью вдыхать запах игрового напалма по утрам, просто повторяя нужную последовательность действий.
[ Читать дальше. ]
Эти загадочные указатели
Теоретическая часть для понимания сути процесса

Как доподлинно известно, адрес в оперативной памяти — некий условный шестнадцатеричный идентификатор (а еще проще — обычное число) для взаимодействия программы с реальной физической памятью. По конкретному адресу всегда расположен ровно 1 байт информации. При этом значение любой переменной в программе хранится по какому-то адресу, даже у переменной, для которой выделено больше 1 байта. Например, если по адресу 0CC9B840 хранится переменная в 2 байта со значением в 10000, то в памяти по адресу 0CC9B840 будет храниться 10h, а по адресу 0CC9B841 будет храниться 27h (10000 в hex-кодировке будет выглядеть как 1027 с учетом обратного порядка чередования байтов). Но для программы важен именно начальный адрес всего блока из 2 байтов. Просто программа знает, что нужно использовать последовательно 2 байта информации, начиная с байта по искомому адресу — соответствующий тип переменной использовался разъеботчиком при написании исходного кода.

Каждый кулхацкер сталкивается с тем, что ранее найденный адрес со значением здоровья, патронов или выпусков журнала «Горячие попки ванамингосов» после перезапуска игры, уровня, а то и вовсе ВНЕЗАПНО становится нерабочим — теперь в нем хранится какое-то другое значение или вообще мусор (так называемый garbage — данные, на которые больше нет никаких ссылок). И нужно, превозмогая боль и страх, со штангенциркулем искать новый вожделенный адрес. Происходит сие непотребство из-за так называемого динамического распределения памяти — механизма создания и хранения программами данных в оперативной памяти непосредственно в процессе работы самой программы (называется «в рантайме»). Нужно игре выделить какой-то диапазон адресного пространства под свои данные? Да пожалуйста. Во время своей работы игра жонглирует данными постоянно, выделяя и освобождая память по необходимости. Создался новый враг? Отлично, под его данные выделено N байт. Враг получил передозировку киберсвинца в организьме и больше он нам и нахуй не нужон, враг ваш? Память, ранее выделенную под него, можно освободить и сделать доступной для записи каких-то иных данных, например, для спавна другого врага.

06

И, собственно, из-за этого блядского цирка с пересозданием объектов и происходит переезд данных на новые адреса в памяти, например, при переходе на новый уровень — игре нужно заново создать уровень и наполнить его объектами. При этом игре лишь нужно знать, с какого адреса будут начинаться данные нового уровня (увязать все это взаимодействие — задача компилятора, программист и в страшном сне заниматься этим не захочет), а относительно этого адреса игра будет пользоваться так называемыми указателями (pointers) на адреса — ссылками на начальные адреса вновь создаваемых объектов согласно принятой иерархии или на адреса, по которым располагаются конкретные значения.
Исходя из сказанного, можно сделать следующие выводы:
1. Память однородна. Ячейка памяти может хранить как исполняемый код, так и какие-то данные.
2. Если данные хранятся непосредственно по какому-то адресу в памяти, доступ к ним осуществляется напрямую при обращении к этому адресу.
3. По какому-то адресу в памяти можно разместить не конечные данные, а указатель — ссылку на какой-то другой адрес, где хранятся нужные данные.
4. Если указатель ссылается на другой указатель, то такой указатель будет называться многоуровневым. Времена одноуровневых указателей давно в прошлом, поэтому 99% нужных нам указателей будут многоуровневыми.

Тут надо сделать маленькое лирическое отступление о причинах возникновения такого порядка вещей. Всему виной повсеместное использование ООП — объектно-ориентированного программирования. Такой подход позволяет оперировать объектами игры как с некими абстрактными структурами данных, и хранить однотипные данные не в обособленных переменных, а в заранее определенном формате. Например, при создании нового объекта типа пони можно последовательно хранить имя пони, тип пони (обычная поня, пегас, единорог, аликорн и т.д.), цвет пони в кодировке RGB, тип кьютимарка (отличительный знак на ляжке — пояснение для жалких унтерменшей, не смотревших прогрессивные мультики про поней). Таким образом, когда будет создан новый объект типа пони, информация о нем будет заранее определенным образом упорядочена при описании структуры или класса объекта.

На абстрактном языке погромирования это может выглядеть следующим образом:
struct Pony
char name[10]; // 10 байт под имя
short type; // 2 байта под тип пони
byte color[3]; // 3 байта под цвет
byte cutiemark; // 1 байт под тип кьютимарка
>

02

Возможность создавать такие однотипные структуры данных позволяет экономить сотни времени, наделяя объекты общими данными и методами работы с ними.

Теперь представим, что мы как-то адекватно хотим описать в коде игры возможность пегасов летать. Создадим некую структуру данных и назовем ее PonyType. Пусть другие типы, кроме пегасов, нас сейчас не волнуют, и мы просто хотим в один байт уместить информацию о возможности или невозможности пони летать.
Для этого объявим в этой структуре логическую переменную canFly типа bool, которая может принимать значения true либо false, занимая при этом ровно 1 байт. Также добавим еще 1 байт под запас энергии для полета.

struct PonyType
bool canFly;
byte energy;
>

А теперь начинается интеграционная дружбомагия. В исходную структуру типа Pony поместим указатель на структуру типа PonyType:
struct Pony
char name[10];
PonyType* type; // тот самый указатель на тип в виде звездочки *
byte color[3];
byte cutiemark;
>

02

Таким образом, при создании нового объекта типа Pony информация о возможности летать и запасе энергии будет передаваться через указатель на структуру PonyType. Чсх, в памяти это будет занимать те же самые 2 байта, как если бы использовали ранее применявшийся целочисленный тип short.

Для программиста, который занимается разработкой структуры типа Pony, теперь не имеет значения, что там внедряет другой программист, занимающийся разработкой структуры PonyType. При правильной организации кода игры любые изменения в структуре PonyType никак не отразятся на работоспособности структуры Pony. Собственно, ради этого все и затевалось. Конечно, на таком простом примере сложно ощутить все преимущества ООП, но мейнстримом он стал не за красивые глаза.
И теперь уже совсем нетрудно построить некоторую цепочку указателей, начиная от создания мира.
Остальные данные структур не отображены для экономии пространства:

// структура лучезарного эквестрийского мира с множеством локаций
struct Equestria
.. // какие-то другие данные
City* city[36]; // для выделения памяти под 36 объектов типа City
>

// структура уютненького Понивилля с множеством поняшек
struct City
..
Pony* pony[100]; // для выделения памяти под 100 объектов типа Pony
>

// структура няшечки Рейнбоу и любой другой пони
struct Pony
..
PonyType* type; // для выделения памяти под 1 объект типа PonyType
>

// структура типа пони
struct PonyType
..
byte energy; // для выделения 1 байта памяти под значение энергии
>

03

Таким образом, например, при перезапуске игры нужно вновь создать объект типа Equestria, записав его начало по новому адресу, а дальше последовательно будет выделена память под 36 объектов типа City, для каждого и которых будет последовательно выделено место под 100 объектов типа Pony, в каждом из которых, в свою очередь, будет выделено место под 1 объект типа PonyType.
Адресация во всех этой махине зависит полностью от одного адреса — адреса начала объекта типа Equestria. И если нас интересует конечный адрес количества энергии на полет конкретной пони, то он каждый раз будет новый. Но с точки зрения игры все остается по прежнему:
→ Она знает начальный адрес, по которому прописался исполняемый код игры.
→ От него она отсчитывает известное количество байт, занимаемое исполняемым кодом и не относящимися к генерации уровня данными, и там начинает записывать данные, уже относящиеся к генерации уровня — то есть создает объект типа Equestria.
→ Далее по системе указателей она доходит до конечного пункта — количества энергии у конкретной пони — и использует его.

На слове последовательно я акцентирую внимание по той причине, что по нашей схеме будет использовано сквозное заполнение адресного пространства оперативной памяти: сначала будут созданы какие-то исходные данные объекта типа Equestria, затем создан первый объект типа City и все объекты типа Pony, затем второй объект типа City и все объекты типа Pony и так далее.

Собственно, зная адрес начала объекта типа Equestria и последовательность смещений до энергии конкретной пони, мы всегда может восстановить искомый адрес энергии. Задача поиска рабочего адреса энергии возлагается на рабочий указатель.
В рассматриваемом случае буквально получается, что объект типа Equestria создается по адресу, по которому была записана в оперативную память сама игра (ее исполняемый файл Game.exe) плюс некоторое смещение 10EF0C, необходимое игре для записи своего исполняемого кода и каких-то иных данных.
Относительно адреса объекта типа Equestria на значение C0 смещено расположение конкретного объекта типа City, относительно которого на значение FAD8 смещено расположение конкретного объекта типа Pony, относительно которого на значение 02FF смещено расположение конкретного объекта типа PonyType, относительно которого на значение 01 смещено расположение искомого значения энергии.
Обладая этой информацией, мы почти всегда однозначно можем определить истинный адрес искомого значения энергии.
04
05

И все это благолепие справедливо, конечно же, в том случае, если нужный нам город и нужная нам поня создаются первыми (вторыми, десятыми, главное — стабильность положения относительно начала) во всем массиве объектов (что часто бывает, поскольку именно относящиеся к игроку данные загружаются первыми). Также нужно уточнить, что адрес объекта типа Equestria может и не быть статическим (то есть неизменным от загрузки к загрузке — в нашем случае это Game.exe + 10EF0C ), если не предопределен конечный объем данных перед его загрузкой. В этом случае адрес начала ключевого объекта должен быть найден способами, не входящими в данный гайд (через поиск так называемых сигнатур — уникальных последовательностей байтов). О сигнатурах мы тоже когда-то обязательно поговорим.

Резюмируя затянувшуюся вводную часть, подчеркну, что никакой мистики тут нет. С точки зрения кулхацкерства указатель — всего лишь ссылка на начальный адрес объекта внутри адресного пространства другого объекта либо непосредственно на адрес, по которому расположены требуемые данные.
Для успешного кулхацкерства достаточно знать, как вся система примерно работает в целом, а также владеть автоматизированными средствами поиска и ручными методами контроля правильности указателей.
К этому и приступим.

Автоматический поиск указателей
Практическая часть для формирования навыков

Если речь идет не об эрпогэ, где достаточно один раз взломать значение каких-нибудь скиллпоинтов, а затем тупо вкачать героя на полный фарш, поиск указателей является обязательной процедурой. Играя в шутер или РТС, хочется всегда иметь под рукой возможность поковырять ресурсы, здоровье или боезапас, не утруждая себя подчас утомительной процедурой поиска нового адреса. Да и в пошаговой эрпогэ каждый бой искать количество очков действия, если их всего два, а то и одно — нахуй так жыдь?
Но на помощь кулхацкерам приходят средства автоматизации СЕ, благодаря которым поиск рабочих указателей является ничуть не более сложной процедурой, чем стандартный поиск адреса.

mafia_main

Процесс поиска предлагаю рассмотреть на примере первой Мафии. Если при взгляде на главное меню у тебя заиграла в голове та самая музыка, а сердце защемило тоской по былому — я тебя понимаю!

Game 2021-03-01 23-16-51-049

Ну что ж, искать мы будем указатель на адрес, по которому хранится количество патронов в магазине оружия, находящегося в руках у игрока. Это весьма полезный указатель, позволяющий нам забыть про необходимость перезарядки абсолютно любого вооружения. Здесь и далее я считаю, что поиск соответствующего адреса не вызывает проблем. Если таковые имеются, можно либо перечитать вступительный гайд по СЕ, либо задать вопрос тут в каментах.
Значение патронов в текущем оружии хранится в обычной целочисленной переменной 4 байта, никаких трудностей при поиске и отсеве возникнуть не должно даже у новичков в использовании СЕ.

m01_0

Итак, значение найдено. Действующий адрес 16В4744С.

m02_0

Жмакаем правой кнопкой по адресу и выбираем пункт Pointer scan for this address.

m03

Вылезет окошко опций сканирования, в котором ничего не нужно трогать, а только проконтролировать корректность адреса.

m04

Далее СЕ попросит указать расположение файла результатов сканирования указателей в формате PTR.

m05

После появится окно прогресса сканирования.

m06

И завершится все феерическим количеством найденных указателей (результаты уже сохранены в файл 111.PTR). Предлагаю внимательно изучить результаты.
Сверху слева в выпадающем списке указан формат представления данных по конечному адресу, на который ссылается указатель. В нашем случае это 4 байта целочисленное. Конечный адрес указан в крайнем правом столбце Points to.
Сверху по центру указано общее количество найденных указателей: 26769689. 26 мульёнов — шутка ли?
В крайнем левом столбце Base Address указывается базовый статический адрес, относительно которого выстраивается многоуровневый указатель.
В столбцах Offset 0Offset 6 указывается смещение на каждом уровне многоуровневого указателя.

Если перенести даблкликом найденный указатель в рабочее поле СЕ и даблкликом же в поле Address открыть окно редактирования Change address, можно будет детально изучить всю структуру добавленного указателя. В рабочем поле указатель помечается префиксом P->.
В окне Change address снизу по центру указаны по порядку все уровни указателя, начиная со статического базового адреса. Справа приводится результат по каждому смещению. Результат по предыдущему вычислению становится исходным адресом для следующего уровня.
m07_0
m08_0

Game 2021-03-01 23-26-48-480

Если говорить совсем в открытую, уже сейчас, несмотря на дикое количество результатов, с ними можно работать. Но мы из вредности проведем еще один цикл поиска и отсева. Главное правило при отсеве указателей заключается в максимальном смещении всего адресного пространства, выделяемого под игру. Чаще всего, правда, достаточно игру просто перезапустить, но можно и поизъёбствываться, запустив перед загрузкой игры пару «тяжелых» приложений.
Но мы ограничимся перезапуском самой игры и загрузкой другого уровня. Окно СЕ с результатами поиска указателей по старому адресу остается открытым.

m09_0

В открытом окне СЕ снова выбираем процесс игры. Проводим поиск нужного адреса. Готово.
В окне поиска указателей можно обратить внимание на то, что ранее найденные указатели, отображенные в данный момент на экране, уже не ссылаются на нужный адрес в памяти игры.

m10_0

Теперь достаточно скопировать новый найденный адрес (даблклик по полю Address откроет окно редактирования), затем в окне поиска указателей нужно выбрать пункт меню Pointer scanner > Rescan memory — Removes pointers not pointing to the right address.

m11

В появившемся окне нужно проконтролировать корректность введенного адреса и отметить чекбоксик Only filter out invalid pointers.
После установки чекбоксика изменение адреса и типа отсева станет недоступно.

m12

Снова СЕ предложит нам сохранить результаты отсева указателей в файле PTR. Я рекомендую каждый этап сохранять в отдельной файле, ибо в случае каких-то проблем можно будет без труда загрузить предыдущие результаты. Из окна результатов сканирования Pointer scan это можно сделать через пункт меню File > Open.

m13_0

Результатом предыдущего этапа являются 3кк указателей, что почти на порядок меньше, чем при первом поиске.

С этими результатами уже точно можно работать, но для подстраховки мы проведеи еще и третий цикл.
Game 2021-03-01 23-35-28-575
m15_0

И четвертый цикл отсева произведем не по результатам поиска нового адреса, а по результатам сравнения в текущей сессии значений по адресам, на которые ссылаются найденные указатели. В этом случае нужно изменить тип отсева на Value to find, указать тип значения 4 байта целочисленное и снять чекбоксик Only filter out invalid pointers.
m16
m17_0

m18_0

Как видно из количества отсеянных указателей на третьем и четвертом этапах, эти этапы можно было смело пропустить.
И вот здесь кулхацкер задаст себе резонный вопрос: как же работать с тремя миллионами (Карл!) найденных указателей? На помощь пытливому уму придет логика и здравый смысл:
1. Нужно проанализировать базовые адреса в колонке Base Address. Всякие мутные ddl-ки и прочие модули нам вряд ли подойдут. Нужен исполняемый файл или, на крайний случай, какая-то базовая библиотека. В случае с Мафией ориентироваться на Game.exe более чем разумно.
2. Если после очередного отсева есть указатели, ссылающиеся на адрес с некорректным значением (при условии правильно указанного типа значения — целочисленного или с плавающей точкой!), то такие указатели нам явно не подходят.
3. Чем меньше уровней в многоуровневом указателе, тем надежнее будет его использование. Иногда, конечно, и двухуровневые указатели могут отваливаться, но желательно стремиться к меньшему числу уровней.
И именно на этом этапе анализа достаточно кликнуть по заголовку столбца Offset 6, чтобы указатели были рассортированы по количеству уровней.

Теперь нужно легко и непринужденно даблкликом накидать скопом в рабочее поле СЕ указатели второго-пятого уровня различными базовыми адресами и первыми смещениями. В нашем примере очевидно, что Game.exe + 00246D4C является, скорее всего, тем самым правильным базовым адресом, но вот иерархия уровней указателей может не обязательно говорить в пользу меньшего количества уровней. Строго говоря, для точного ответа необходим ручной анализ структур данных, но это уже более комплексный вопрос. Поэтому надо накидать в рабочее поле штук по пять указателей каждого уровня и получить в итоге целую батарею предварительных результатов. В рабочем поле они все выглядят одинаково, но при редактировании можно будет увидеть всю структуру уровней каждого указателя.
m19m20
m21m22

Game 2021-03-01 23-44-04-589

Торжественный момент! Настало время проверить работоспособность найденных указателей.
Как всегда перезапускаем игру и загружаем другой уровень.

m23

Выбираем в открытом окне СЕ процесс игры и — вуаля. Все найденные указатели являются рабочими. Удалять их из экономии пространства я пока не советую, ибо в разных условиях какие-то могут отвалиться и перестать работать, но в целом всё получилось. Можно объединить все указатели в группу в рабочем поле СЕ, выделив их и выбрав в контекстном меню по правой кнопке мыши Add to new group, озаглавив группу и выбрав уверенное No в вопросе «Do you want «address» version?». В настройках группы Group config в контекстном меню можно выбрать Hide children when deactivated и сворачивать всю группу пробелом или кликом по чекбоксу заморозки значения в левой части строки. Табличку можно сохранять и жить припеваючи.

m24

Анализ дампа в окрестностях найденного адреса показал, что за 4 байта до нашего адреса хранится тип оружия, а через 4 байта после — общее количество патронов к данному оружию.

m25

Что же нам теперь, повторять эту возню с поиском указателей еще и на эти адреса? Разумеется, нет.
Достаточно скопировать рабочем поле какой-нибудь корректный указатель с помощью Ctrl + C или пункта контекстного меню Copy, после чего вставить его здесь же по Ctrl + V (Paste).
Откроется небольшое окно, позволяющее указать требуемое смещение.

m26

Альтернативный вариант заключается в копировании всего указателя без изменений и последующего редактирования копии в общем порядке.

Вот и все. Получается уютненькая табличка, которой можно пользоваться в том числе и тогда, когда оружия на миссию вообще не выдают, а покувыркаться с Сарочкой очень хочется — достаточно выставить тип оружия на 10 (томми-ган) и досыпать патронов, не забывая выкинуть его и поднять для корректной обработки появления оружия в руках у персонажа.
m27
sarah

P.S. Ежели гранд-мастера погромирования меня поправят в чем-то и подскажут более корректные формулировки, буду крайне благодарен. В рассматриваемых теоретических вопросах я дилетант, поэтому здоровая критика моего взгляда на проблему будет очень пользительной.

Поиск статического адреса указателя

трейнеры устроены сложнее чем вы думаете. Они же не требуют от вас изменения параметров, чтобы отследить нужный указатель. Вы можете посмотреть на выделение памяти и попробовать «пройтись» по указателям. Т.е. найти точку старта (спросить у ОС). Потом взять от неё отступ перейти в какой-то класс, повторять нужное число раз. Но для этого нужно понимать как работает программа.

21 июл 2016 в 10:55

У меня есть комплект рабочих адресов и у меня нет особой необходимости использовать дизассемблер и писать скрипт, для меня достаточно в ручную найти указатели и сохранить в таблицу.

Как найти указатель в cheat engine

Доброго времени суток, всем участникам клуба! И особенно тем, кто сейчас читает эту тему!

Я столкнулся с такой ситуацией, использую отладчик, нахожу искомый адрес, в котором хранится интересующие меня значение. Но, мне необходимо найти базовый адрес, который ранее найденного динамического адреса! Иными словами: Воспользовавшись отладчиком, Cheat Engine 6.2, я ищу интересующее меня значение, нахожу динамический адрес, в памяти по которому хранится интересующее меня значение -> После чего, командой «find out what writes to this address» вызываю еще одно окошко, где отображается прочая информация, в том числе и выводится инструкция «

mov [ebx], eax

» и собственно, на этом я и встрял.. Я не как не могу понять что делать дальше? Обычно, такого вида строка выглядит, примерно так «

mov [ebx + 4С], eax

» где + 4С — Это число которое является смещением на указатель и т.д. Но, что едлать если его нет, есть только строка вида «

mov [ebx], eax

P.S.: Очень прошу вашей помощи, я уже не один день сижу и пытаюсь понять, как решить эту задачу.

Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,097
Посмотри чему равно значение в EBX — это и будет указатель. И смещение тут не обязательно.
I’m learning to live.
Пользователь
Регистрация: 15.12.2010
Сообщений: 14
Сообщение от Stilet
Посмотри чему равно значение в EBX — это и будет указатель. И смещение тут не обязательно.
Да, это понятно! Например:

EBX = 0BF84074

, его равенство я и пытаюсь искать, но Cheat Engine не чего не находит. Делаю все правильно, вроде бы. В строке поиска значения, устанавливая галочку возле Hex, вбиваю туда 0BF84074 и ноль результатов. Почему там происходит, не могу понять. И так со всеми играми на базе Unreal Engine! Что бы, было проще понять, я так парюсь с Unreal Tournament 2004 и в 3 тоже самое. Я и не знаю что еще делать. Может есть, еще какие предложения.

Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,097

но Cheat Engine не чего не находит

А-а-а, читер. ))))
Так вот где собака зарыла. А я то думаю что за вопрос такой странный )))
Скажем так: Забудь. Обьяснять долго да и бесполезно.

I’m learning to live.
Пользователь
Регистрация: 15.12.2010
Сообщений: 14
Сообщение от Stilet

А-а-а, читер. ))))
Так вот где собака зарыла. А я то думаю что за вопрос такой странный )))
Скажем так: Забудь. Обьяснять долго да и бесполезно.

Я так понимаю, вы и сами не знаете ответа. Или чисто из-за принципа, а. о_О

Суть вот в чем.
— Есть компьютерная игра, Unreal Tournament 3;
— В игре есть счетчик/показатель статистики и тому подобное (Меня интересует считывание информации);
— Мне необходимо, считывать/сверять один из показателей в своей программе. Я пытаюсь это сделать, обратившись к памяти игры. Иными словами, ищу через Cheat Engine нужный адрес, где хранится значение счетчика/показателя. Но, он постоянно меняется и вы наверняка знаете почему, потому что он является динамическим! По этому необходимо найти статический, базовый адрес на искомый адрес счетчика/показателя. Но, как это сделать, если я не могу понять в какую сторону рыть. Смещениями я нечего не добился. Что я делаю не правильно? Самое обидное, это когда ты не понимаешь в чем твоя ошибка.

Сообщение от Stilet
Посмотри чему равно значение в EBX — это и будет указатель. И смещение тут не обязательно.

Я смотрел чему оно равно, оно равно тому адресу который я нахожу, то есть, тот что счетчик/показатель, пробовал искать, но не чего не нашел.

Может быть, я не в той степи ищу. Ну, допустим:
Интересный мне счетчик/показатель находится по адресу 10B57071, после поиска командой @find out what writes to this address» вызываю еще одно окошко, где отображается прочая информация, в том числе и выводится инструкция mov [ebx], eax смотрю значение регистра EBX, оно равно 10B57071, начинаю искать его и нечего. Что за дела. Я знаю что где-то ошибка, но где.

Последний раз редактировалось Stilet; 09.11.2014 в 10:05 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *