Эта статья ориентирована на начинающих пользователей 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-шифрования через анализ инструкции, записывающей результат в ячейку. |
|
Событийные триггеры |
Функциональная трассировка |
Поиск функции |
Верификация и интерпретация данных
Обнаружение адреса в памяти является лишь начальным этапом анализа. Идентификация области не гарантирует возможность её модификации из-за механизмов защиты, серверной валидации или многоуровневой инкапсуляции.
Важно учитывать, что на данном этапе результат может содержать множество адресов, среди которых могут оказаться как искомые логические переменные, так и их визуальные (экранные) копии, дублирующие структуры или ключи шифрования. Факт нахождения числа - это только фиксация точки входа в логику процесса. В следующих разделах мы обсудим методику верификации, изменение значений и исследование их алгоритмов.
Автор: KXI
