Эта статья ориентирована на начинающих пользователей Cheat Engine. Здесь собраны базовые рекомендации, методологические подходы и разборы типичных сценариев, с которыми можно столкнуться при попытке найти нужный адрес.
Стратегии поиска значений в памяти
1. Поиск известного значения
Базовый сценарий, при котором целевое значение отображается в GUI приложения и предполагается, что оно хранится в открытом виде.
Алгоритм:
Выбрать тип поиска
Exact Value.Ввести отображаемое значение.
Отсеивать (Next Scan) после изменения значения в игре.
Выбор типа данных
Оптимизация поиска зависит от правильного определения типа данных:
4 Bytes(Int32): Стандарт де-факто для целочисленных значений;Нюанс: Если значение небольшое, поиск
4 Bytesтакже найдет его, даже если оно аллоцировано как8 Bytes(Int64), благодаря архитектуреLittle-Endian;
8 Bytes(Int64): Обязательно для значений, превышающих 2,147,483,647;
Float/Double: Для значений с плавающей точкой;
Byte/2 Bytes: Встречается в ретро-играх или для флагов, но редко используется как основной тип в современных движках;
AllКогда тип данных неочевиден;
Несоответствие уровня представления и хранения
Числовое значение в GUI (экранное значение) часто является результатом пост-обработки или форматирования реальной переменной в памяти.
Типовые расхождения:
Скрытое масштабирование: Значение, визуально похожее на
Float(например, 14.50), может храниться как целочисленный тип4 Bytes(1450), который делится на коэффициент (например, 100) только в момент отрисовки кадра.Округление интерфейса: GUI может отображать целое число
100, в то время как в памяти лежитFloatсо значением99.843. Прямой поиск целого числа в этом случае заведомо провальный.Стратегия действий:
Если поиск черезExact Valueне дал результатов, это не означает отсутствие значения. В таком случае обязательно переходите к стратегиям поиска «Неизвестного значения».
Объект поиска | Тип данных | Контекст/Пример |
|---|---|---|
Количественные метрики |
| Патроны, золото, количество предметов, очки навыков. |
Крупные накопления |
| Опыт в долгосрочных прогрессиях, бюджет в симуляторах (> 2 млрд). |
Дробные значения |
| Здоровье или энергия, если они отображаются с десятичной частью. |
Текстовые данные |
| Имя персонажа, название локации или технический идентификатор. |
2. Дифференциальный поиск
Применяется, когда точное значение неизвестно, скрыто, зашифровано. Поиск начинается с инициализации сканирования типа Unknown initial value.
2.1. Известная динамика
Сценарий, при котором мы визуально фиксируем вектор изменения состояния (увеличение или уменьшение).
Методы фильтрации:
Increased value/Decreased value- при явном изменении.Unchanged value- для отсеивания "шума".
Инверсия логики
Программа может хранить не текущий остаток, а разность с максимумом. В этом случае вектор изменения переменной противоположен визуальному.
Принцип: Когда в интерфейсе параметр уменьшается, значение в памяти растет (увеличивается разрыв с максимумом).
Действие: Если стандартный поиск не дал результатов, смените вектор: ищитеIncreased Valueтам, где визуально происходит уменьшение.
Объект поиска | Динамика | Контекст/Пример |
|---|---|---|
Физические атрибуты |
| Здоровье, выносливость, уровень заряда, кислород. |
Пространственные данные |
| Координаты X, Y, Z; высота прыжка или скорость падения. |
Инверсные шкалы |
| Накопленный урон (растет, когда визуальное HP падает). |
Прогресс-бары |
| Время каста заклинания или заполнение шкалы прогресса. |
Проблема микро-детерминизма
При поиске динамических координат (X, Y, Z) или векторов движения часто наблюдаются непрерывные микро-изменения значений воFloatилиDouble, даже если объект визуально статичен.
Причины:
Циклы анимации;
Математические погрешности при расчете физики и коллизий в каждом кадре;
Плавающая точка и специфика округления.
Последствия для поиска: > Стандартный фильтр
Unchangedможет ошибочно отсеять искомый адрес, так как на низком уровне данные постоянно обновляются.
Рекомендация: > Очень внимательно использоватьUnchanged, либо не использовать его вовсе для поиска координат.
Рекомендация по поиску пространственных координат:
При анализе местоположения объекта приоритетной является вертикальная ось (Z). В большинстве игровых движков она имеет предсказуемую положительную динамику при увеличении высоты (прыжок, подъем по лестнице). В то же время поиск по горизонтальным осям (X, Y) часто осложнен неопределенностью вектора: направление увеличения или уменьшения значений зависит от ориентации глобальной системы координат и может потребовать инверсивного сканирования.
Описанные алгоритмы охватывают конкретные, наиболее часто встречающиеся сценарии. Если у вас не получилось найти значение сразу - не стоит отчаиваться. Современные приложения сложны, и данные в памяти могут храниться гораздо интереснее, чем кажется на первый взгляд. В такие моменты важно остановиться и подумать: какую логику мог реализовать разработчик?
2.2. Неизвестная динамика, известный факт изменения
Сценарий, при котором мы знаем, что событие произошло, но не знаем математического выражения этого изменения.
Методы фильтрации:
Changed value- значение изменилось.Unchanged value- значение осталось прежним.
Объект поиска | Пример |
|---|---|
Слоты инвентаря | Соответствие ячейки ID предмета; поиск при ротации содержимого. |
Логистика предметов | Номер ячейки/индекса, в которой зафиксирован предмет. |
Криптографические ключи | Смена XOR-ключа при записи зашифрованного значения. |
Логические триггеры | Изменение флагов состояния (например, переход из |
3. Неизвестное число, неизвестная динамика, неизветный факт изменения
Сценарий "Черного ящика": значение неизвестно, динамика неочевидна, стан��артные методы не работают. Это часто указывает на наличие обфускации, сложной структуры данных или серверной синхронизации.
Стратегии решения:
Пространственная локальность:
Логически связанные переменные часто группируются в рамках одной структуры или класса. На этом основана гипотеза: искомое значение находится в одном блоке памяти (структуре) с уже найденным адресом.Метод: Анализ смежных адресов через
Memory Viewer,Dissect data/structures.Функциональная трассировка:
Если данные зашифрованы или скрыты в памяти, анализируется не само значение, а код, который с ним работает. Цель - найти инструкцию, которая вычисляет или записывает нужный параметр в момент обращения к нему.Метод: Использование точек останова (Breakpoints) и механизмов трассировки (
Ultimap/Ultimap 2,Code Tracing) для перехвата инструкций.
Данный метод относится к продвинутому уровню анализа и будет подробно разобран ещё не скоро. Сейчас он упоминается лишь для полноты картины.
Объект поиска | Стратегия | Сценарий |
|---|---|---|
Зашифрованная валюта | Функциональная трассировка ( | Динамическая ротация ключей. Значение в памяти меняется по таймеру независимо от действий пользователя. Трассировка позволяет изолировать код, который постоянно обновляет ячейку, и найти алгоритм расшифровки. |
Вероятностные параметры (Крит, Лут) | Функциональная трассировка ( | Состояние энтропии (Seed). Каждое игровое событие инициирует обновление генератора псевдослучайных чисел. Трассировка применяется для поиска инструкций, ответственных за модификацию значения «зерна» (Seed) при обращении к процедурам вычисления вероятности. |
Параметры игрока (HP) | Пространственная локальности | Идентификация через открытые «якоря». Искомый параметр зашифрован и имеет динамическую логику, но находится в одной структуре с открытыми данными (например, координатами). Локализация вектора позиции позволяет вычислить смещения до компонентов шифрования HP. |
Приведенные сценарии иллюстрируют поиск в условиях полной неопределенности. Эти же стратегии универсальны и позволяют существенно ускорить идентификацию адресов в любых стандартных ситуациях.
Объект поиска | Стратегия | Сценарий |
|---|---|---|
Параметры игрока | Пространственная локальность | Поиск «Здоровья» через адрес «Патронов», так как они являются полями одного объекта. |
Характеристики окружения | Пространственная локальность | Поиск параметров региона (гравитация, освещение) через ID локации. |
Алгоритмы защиты | Функциональная трассировка | Идентификация процедуры XOR-шифрования через анализ инструкции, записывающей результат в ячейку. |
Событийные триггеры | Функциональная трассировка | Поиск функции |
Верификация и интерпретация данных
Обнаружение адреса в памяти является лишь начальным этапом анализа. Идентификация области не гарантирует возможность её модификации из-за механизмов защиты, серверной валидации или многоуровневой инкапсуляции.
Важно учитывать, что на данном этапе результат может содержать множество адресов, среди которых могут оказаться как искомые логические переменные, так и их визуальные (экранные) копии, дублирующие структуры или ключи шифрования. Факт нахождения числа - это только фиксация точки входа в логику процесса. В следующих разделах мы обсудим методику верификации, изменение значений и исследование их алгоритмов.