Типы значений в Cheat Engine: байты, float, строки и AOB
Byte, 2/4/8 Bytes, Float, Double, String и Array of byte: что хранит каждый тип, знаковые и беззнаковые числа, порядок байтов little-endian и как выбрать тип, если вы его не знаете.
Каждое сканирование в Cheat Engine задаёт два вопроса: какое значение вы ищете и как оно хранится? Второй вопрос — это выпадающий список Value Type, и неверный тип — самая частая причина, по которой сканирование ничего не находит. В этом руководстве разбирается каждый тип, то, как числа располагаются в памяти, и как выбрать тип, если вы понятия не имеете, что использует игра.
В примерах предполагается, что вы уже умеете делать First Scan и Next Scan. Если нет, начните с руководства по Cheat Engine для новичков. Как всегда, используйте эти приёмы только в одиночных и офлайн-играх и делайте резервные копии сохранений, прежде чем что-либо менять.
Почему тип важен
Память — это просто длинный ряд байтов. Число 1000 хранится не как символы «1», «0», «0», «0»; оно хранится как двоичный шаблон, и один и тот же шаблон означает разное в зависимости от того, как его читать. Четыре байта, означающие 1000 как целое число, как float означают нечитаемо крошечное число. Когда вы указываете Cheat Engine тип, вы сообщаете, сколько байтов читать по каждому адресу и как их интерпретировать. Если тип неверный, введённое вами значение никогда не совпадёт.
Типы вкратце
| Тип | Размер | Диапазон | Типичное применение в играх |
|---|---|---|---|
| Byte | 1 байт | от 0 до 255 (со знаком: от -128 до 127) | Флаги, небольшие счётчики, уровни, количество предметов с лимитом 99 |
| 2 Bytes | 2 байта | от 0 до 65,535 (со знаком: от -32,768 до 32,767) | Старые игры, очки характеристик, стопки в инвентаре |
| 4 Bytes | 4 байта | от 0 до 4,294,967,295 (со знаком: примерно плюс-минус 2,1 млрд) | Деньги, патроны, опыт, большинство целых чисел |
| 8 Bytes | 8 байтов | от 0 до примерно 1,8 x 10^19 (со знаком: примерно плюс-минус 9,2 x 10^18) | Очень большие валюты, метки времени, указатели в 64-битных играх |
| Float | 4 байта | Около 7 значащих цифр | Здоровье, выносливость, позиции, скорость, таймеры |
| Double | 8 байтов | Около 15–16 значащих цифр | Движки и среды выполнения скриптов с двойной точностью |
| String | Переменный | Текст, ASCII или UTF-16 | Имена персонажей, названия предметов, диалоги |
| Array of byte | Переменный | Любая последовательность байтов, допускаются маски | Сигнатуры кода, «сырые» структуры |
Целочисленные типы: Byte, 2 Bytes, 4 Bytes, 8 Bytes
Это целые числа: без десятичной точки, просто количество. Название говорит, сколько байтов использует каждый тип. 4 Bytes — тип по умолчанию в Cheat Engine, потому что он с большим отрывом самый распространённый для счётчиков в современных играх. Число, которое может превысить примерно 4,29 млрд, например валюта на поздних этапах в инкрементальной игре, требует 8 Bytes. Значения, которые никогда не превышают 255, иногда упаковывают в один Byte для экономии места, особенно в старых играх и для флагов «вкл/выкл».
Со знаком и без знака
Одни и те же биты можно читать как значение со знаком (допускаются отрицательные числа) или без знака (от нуля и выше). В 4 Bytes шаблон FF FF FF FF равен -1 со знаком и 4,294,967,295 без знака. Само сканирование сравнивает битовый шаблон, так что это в основном влияет на отображение значений. Переключить запись между знаковым и беззнаковым отображением можно в её контекстном меню в списке адресов. Если значение внезапно показывается огромным числом после того, как вы опустили его ниже нуля, вы смотрите на знаковое значение, отображаемое как беззнаковое, либо в игре произошло переполнение вниз.
Порядок байтов: little-endian на примере
ПК с Windows используют порядок байтов little-endian: младший байт хранится первым. Это важно, как только вы смотрите на память в hex-представлении Memory Viewer или пишете шаблон Array of byte вручную.
Возьмём число 1000, хранящееся как 4 Bytes:
- 1000 в шестнадцатеричной системе —
3E8. - Дополненное до четырёх байтов, это
00 00 03 E8, записанное старшим байтом вперёд, как люди обычно пишут числа. - Little-endian меняет порядок байтов на обратный, поэтому в памяти вы видите
E8 03 00 00.
То же число как 2 Bytes — E8 03, а как 8 Bytes — E8 03 00 00 00 00 00 00. Меняется порядок только байтов, но не hex-цифр внутри байта: E8 остаётся E8.
Float подчиняются тому же правилу. Float 100.0 имеет битовый шаблон 42C80000, который лежит в памяти как 00 00 C8 42. Float 1.0 — это 3F800000, хранится как 00 00 80 3F. Вычислять это вручную утомительно; конвертер значений показывает любое число в десятичном виде, в hex и в байтах little-endian для каждого типа рядом друг с другом.
Числа с плавающей точкой: Float и Double
Float хранят числа с дробной частью. Игры используют их для всего, что меняется плавно или требует десятичных знаков: здоровье, которое восстанавливается на 0.3 за тик, позиция персонажа по X, Y и Z, скорость передвижения, перезарядка в секундах. Полоска здоровья без числа очень часто оказывается float, в котором хранится либо реальное здоровье (скажем, 87.5), либо доля от 0.0 до 1.0.
Double — та же идея, но с 8 байтами и гораздо более высокой точностью. Для игровых значений его используют реже, но некоторые движки и среды выполнения скриптов хранят все числа как double. Если сканирование Float для значения с десятичными знаками не удалось, следующим попробуйте Double.
Поскольку float редко бывают точными, Cheat Engine не требует идеального совпадения. Когда вы выбираете Float или Double, на панели сканирования появляются параметры округления; режим округления по умолчанию позволяет поиску 87 находить 87.4 и подобные значения. Если даже этого недостаточно, используйте тип сканирования Value between с небольшим диапазоном или переключитесь на Unknown initial value и применяйте сканирования Increased и Decreased.
Текст: String в ASCII и UTF-16
Сканирование String ищет текст. Игры хранят текст в разных кодировках, и Cheat Engine позволяет выбирать:
- ASCII или однобайтовый текст: один байт на символ. «Hi» — это
48 69. - UTF-16: два байта на символ, часто встречается в программах и движках для Windows. «Hi» — это
48 00 69 00. Отметьте параметр UTF-16 при сканировании.
Есть также параметр учёта регистра. Поиск имени персонажа — быстрый способ найти структуру данных, принадлежащую этому персонажу, ведь характеристики часто хранятся рядом. Будьте осторожны при изменении строк: запись текста длиннее исходного перезапишет всё, что идёт после него в памяти.
Array of byte (AOB)
Array of byte ищет точную последовательность байтов, записанную в hex через пробелы, например E8 03 00 00. Можно использовать ?? как маску для любого байта, так что 89 83 ?? ?? 00 00 совпадёт с несколькими вариантами. AOB редко применяют для прямого поиска игровых значений. Их главная задача — снова находить определённый участок игрового кода после перезапуска, именно так скрипты Auto Assembler находят код, который патчат.
Тип «All»
Когда вы выбираете All, Cheat Engine ищет ваше значение сразу по нескольким числовым типам, а в результатах видно, как какой тип был найден для каждого совпадения. Какие типы включены, можно настроить в параметрах Cheat Engine. All полезен, когда вы зашли в тупик, но даёт гораздо больше результатов и работает медленнее, так что считайте его запасным вариантом, а не привычкой.
Как выбрать тип, если вы его не знаете
Проходите по пунктам по порядку, начиная New Scan каждый раз, когда тип не подошёл:
- Целое число на экране (золото, патроны, счёт): начните с 4 Bytes и Exact Value.
- Что-то с десятичными знаками, полоска или позиция: попробуйте Float. Используйте Unknown initial value, если число не видно.
- Float ничего не нашёл: попробуйте Double.
- Небольшое число, которое никогда не превышает 255 или 65,535: попробуйте Byte или 2 Bytes.
- Очень большое число: попробуйте 8 Bytes.
- Всё ещё ничего: попробуйте All, затем подумайте, совпадает ли отображаемое число с хранимым. Игры иногда хранят значение, умноженное на 10 или 100, хранят максимум и потраченное количество вместо оставшегося или держат его в закодированном виде. В таких случаях надёжный путь — Unknown initial value со сканированиями Increased и Decreased.
Когда найдёте кандидата, подтвердите его, изменив в списке адресов и понаблюдав за игрой, затем укажите тип в описании записи, чтобы потом не забыть.
Пользовательские и менее распространённые типы
В Cheat Engine есть также тип Binary для отдельных битов, а ещё поддерживаются пользовательские типы, задаваемые небольшим скриптом. Свежие версии включают некоторые пользовательские типы из коробки, например варианты big-endian для редких случаев, когда игра хранит числа в обратном порядке байтов. Они понадобятся вам нечасто, но полезно знать, что они существуют, когда стандартные типы не справляются с необычной игрой.
Итоги
- 4 Bytes для целых чисел, Float для десятичных значений и полосок, Double как следующий вариант, Byte и 2 Bytes для малых значений, 8 Bytes для очень больших.
- Знаковые и беззнаковые — это два способа прочитать одни и те же биты.
- Память хранится в little-endian: 1000 как 4 Bytes — это
E8 03 00 00. - Строки бывают в ASCII и UTF-16; шаблоны AOB ищут «сырые» байты с масками
??. - Используйте конвертер значений, чтобы проверять раскладку байтов, а не считать её вручную.
Комментарии
Комментариев пока нет
Будьте первым, кто поделится своим мнением.