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

Стратегии поиска значений в памяти

1. Поиск известного значения

Базовый сценарий, при котором целевое значение отображается в GUI приложения и предполагается, что оно хранится в открытом виде.

Алгоритм:

  1. Выбрать тип поиска Exact Value.

  2. Ввести отображаемое значение.

  3. Отсеивать (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 не дал результатов, это не означает отсутствие значения. В таком случае обязательно переходите к стратегиям поиска «Неизвестного значения».

Объект поиска

Тип данных

Контекст/Пример

Количественные метрики

4 Bytes

Патроны, золото, количество предметов, очки навыков.

Крупные накопления

8 Bytes

Опыт в долгосрочных прогрессиях, бюджет в симуляторах (> 2 млрд).

Дробные значения

Float

Здоровье или энергия, если они отображаются с десятичной частью.

Текстовые данные

String

Имя персонажа, название локации или технический идентификатор.

2. Дифференциальный поиск

Применяется, когда точное значение неизвестно, скрыто, зашифровано. Поиск начинается с инициализации сканирования типа Unknown initial value.

2.1. Известная динамика

Сценарий, при котором мы визуально фиксируем вектор изменения состояния (увеличение или уменьшение).

Методы фильтрации:

  • Increased value / Decreased value - при явном изменении.

  • Unchanged value - для отсеивания "шума".

Инверсия логики
Программа может хранить не текущий остаток, а разность с максимумом. В этом случае вектор изменения переменной противоположен визуальному.
Принцип: Когда в интерфейсе параметр уменьшается, значение в памяти растет (увеличивается разрыв с максимумом).
Действие: Если стандартный поиск не дал результатов, смените вектор: ищите Increased Value там, где визуально происходит уменьшение.

Объект поиска

Динамика

Контекст/Пример

Физические атрибуты

Increased / Decreased

Здоровье, выносливость, уровень заряда, кислород.

Пространственные данные

Increased / Decreased

Координаты X, Y, Z; высота прыжка или скорость падения.

Инверсные шкалы

Decreased / Increased

Накопленный урон (растет, когда визуальное HP падает).

Прогресс-бары

Increased / Decreased

Время каста заклинания или заполнение шкалы прогресса.

Проблема микро-детерминизма
При поиске динамических координат (X, Y, Z) или векторов движения часто наблюдаются непрерывные микро-изменения значений во Float или Double, даже если объект визуально статичен.
Причины:

  • Циклы анимации;

  • Математические погрешности при расчете физики и коллизий в каждом кадре;

  • Плавающая точка и специфика округления.

Последствия для поиска: > Стандартный фильтр Unchanged может ошибочно отсеять искомый адрес, так как на низком уровне данные постоянно обновляются.
Рекомендация: > Очень внимательно использовать Unchanged, либо не использовать его вовсе для поиска координат.

Рекомендация по поиску пространственных координат:
При анализе местоположения объекта приоритетной является вертикальная ось (Z). В большинстве игровых движков она имеет предсказуемую положительную динамику при увеличении высоты (прыжок, подъем по лестнице). В то же время поиск по горизонтальным осям (X, Y) часто осложнен неопределенностью вектора: направление увеличения или уменьшения значений зависит от ориентации глобальной системы координат и может потребовать инверсивного сканирования.

Описанные алгоритмы охватывают конкретные, наиболее часто встречающиеся сценарии. Если у вас не получилось найти значение сразу - не стоит отчаиваться. Современные приложения сложны, и данные в памяти могут храниться гораздо интереснее, чем кажется на первый взгляд. В такие моменты важно остановиться и подумать: какую логику мог реализовать разработчик?

2.2. Неизвестная динамика, известный факт изменения

Сценарий, при котором мы знаем, что событие произошло, но не знаем математического выражения этого изменения.

Методы фильтрации:

  • Changed value - значение изменилось.

  • Unchanged value - значение осталось прежним.

Объект поиска

Пример

Слоты инвентаря

Соответствие ячейки ID предмета; поиск при ротации содержимого.

Логистика предметов

Номер ячейки/индекса, в которой зафиксирован предмет.

Криптографические ключи

Смена XOR-ключа при записи зашифрованного значения.

Логические триггеры

Изменение флагов состояния (например, переход из In Air в Grounded).

3. Неизвестное число, неизвестная динамика, неизветный факт изменения

Сценарий "Черного ящика": значение неизвестно, динамика неочевидна, стан��артные методы не работают. Это часто указывает на наличие обфускации, сложной структуры данных или серверной синхронизации.

Стратегии решения:

  1. Пространственная локальность:
    Логически связанные переменные часто группируются в рамках одной структуры или класса. На этом основана гипотеза: искомое значение находится в одном блоке памяти (структуре) с уже найденным адресом.

    Метод: Анализ смежных адресов через Memory Viewer, Dissect data/structures.

  2. Функциональная трассировка:
    Если данные зашифрованы или скрыты в памяти, анализируется не само значение, а код, который с ним работает. Цель - найти инструкцию, которая вычисляет или записывает нужный параметр в момент обращения к нему.

    Метод: Использование точек останова (Breakpoints) и механизмов трассировки (Ultimap/Ultimap 2, Code Tracing) для перехвата инструкций.

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

Объект поиска

Стратегия

Сценарий

Зашифрованная валюта

Функциональная трассировка (Ultimap)

Динамическая ротация ключей. Значение в памяти меняется по таймеру независимо от действий пользователя. Трассировка позволяет изолировать код, который постоянно обновляет ячейку, и найти алгоритм расшифровки.

Вероятностные параметры (Крит, Лут)

Функциональная трассировка (Code Tracing)

Состояние энтропии (Seed). Каждое игровое событие инициирует обновление генератора псевдослучайных чисел. Трассировка применяется для поиска инструкций, ответственных за модификацию значения «зерна» (Seed) при обращении к процедурам вычисления вероятности.

Параметры игрока (HP)

Пространственная локальности

Идентификация через открытые «якоря». Искомый параметр зашифрован и имеет динамическую логику, но находится в одной структуре с открытыми данными (например, координатами). Локализация вектора позиции позволяет вычислить смещения до компонентов шифрования HP.

Приведенные сценарии иллюстрируют поиск в условиях полной неопределенности. Эти же стратегии универсальны и позволяют существенно ускорить идентификацию адресов в любых стандартных ситуациях.

Объект поиска

Стратегия

Сценарий

Параметры игрока

Пространственная локальность

Поиск «Здоровья» через адрес «Патронов», так как они являются полями одного объекта.

Характеристики окружения

Пространственная локальность

Поиск параметров региона (гравитация, освещение) через ID локации.

Алгоритмы защиты

Функциональная трассировка

Идентификация процедуры XOR-шифрования через анализ инструкции, записывающей результат в ячейку.

Событийные триггеры

Функциональная трассировка

Поиск функции TakeDamage для обнаружения переменных защиты и сопротивления.

Верификация и интерпретация данных

Обнаружение адреса в памяти является лишь начальным этапом анализа. Идентификация области не гарантирует возможность её модификации из-за механизмов защиты, серверной валидации или многоуровневой инкапсуляции.

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