Дата публикации: | Версия: Cheat Engine 7.7
Cheat Engine (CE) давно перестал быть просто «поисковиком значений». Сегодня это полноценная среда разработки для моддинга и реверс-инжиниринга. С выходом версии 7.7 (актуальна на начало 2026 года) разработчики сделали значительный шаг в сторону автоматизации и безопасности внедрения кода. Главные звезды этого релиза — расширенный AutoAssembler и нативная поддержка Hook/Unhook-команд.
Если вы помните старые туторы 2011–2012 годов (эпоха CE 5.6–6.0), где хуки писались вручную через jmp/call и приходилось самим вычислять размеры инструкций и восстанавливать оригинальный код, то версия 7.7 делает всё это за вас, предоставляя высокоуровневые абстракции.
Ключевые нововведения AutoAssembler в CE 7.7
Согласно информации из официальных релизов и сообщества (включая репозиторий ALECAKIR/Auto-Assembler-Commands на GitHub), в версии 7.7 были добавлены:
- Условные блоки (Conditional Blocks): Полноценная поддержка логики
if/else/endifпрямо внутри скриптов AutoAssembler без необходимости выносить логику в Lua. - Нативные команды Hook/Unhook: Декларативный синтаксис для установки и снятия хуков.
- Улучшенная обработка ошибок: Более понятные сообщения при синтаксических ошибках в ассемблерных вставках.
- Интеграция с Lua: Бесшовный вызов функций AutoAssembler из Lua-скриптов и обратно.
Глубокий разбор: Команды Hook и Unhook
Это самое значимое изменение для авторов чит-таблиц и тренеров. Раньше стандартный шаблон хука выглядел громоздко:
// Старый стиль (упрощенно)
alloc(newmem, 2048, "game.exe"+12345)
label(return)
label(original_code)
newmem:
// наш код
mov [rbx+10], #100
original_code:
// оригинальные байты (приходилось копировать вручную!)
mov [rbx+10], ecx
jmp return
"game.exe"+12345:
jmp newmem
nop // выравнивание
return:
[DISABLE]
"game.exe"+12345:
db 89 4B 10 // ручное восстановление байтов
dealloc(newmem)
Новый синтаксис (CE 7.7+)
Теперь всё сводится к двум командам: hook и unhook. Движок сам рассчитывает длину инструкций, выделяет память, сохраняет оригинальный код и генерирует переходы.
Синтаксис hook
hook(address, [size], [label_name])
// или
hook("symbol_name", [size])
- address, адрес установки хука (адрес, символ, регистр).
- size (опционально) — количество байт для перехвата. Если не указан, CE сам определит длину инструкции(й) по дизассемблеру.
- label_name (опционально) — метка, куда будет скопирован оригинальный код для вызова (
originalcode).
Синтаксис unhook
unhook(address)
// или
unhook("symbol_name")
Команда полностью восстанавливает оригинальные байты по адресу и освобождает выделенную память.
Практический пример: Бесконечное здоровье (God Mode)
Рассмотрим реальный сценарий: перехват функции получения урона;
Скрипт для CE 7.7
{
Game: ExampleGame.exe
Version: 1.0
Feature: God Mode via Hook Commands
}
[ENABLE]
// 1. Определяем адрес (через AOB или символ)
aobscanmodule(damageHook, ExampleGame.exe, 48 89 51 10 48 8B C1 C3) // mov [rcx+10], rdx ...
registersymbol(damageHook)
// 2. Устанавливаем хук.
// CE сам скопирует инструкции по адресу damageHook в метку original_damage
// и прыгнет на наш код после метки hook_code
hook(damageHook, original_damage)
hook_code:
// RDX = входящий урон. Обнуляем его.
xor rdx, rdx
// Можно добавить логику: если игрок (проверка по RCX), то обнуляем, иначе оригинал
// cmp rcx, [playerBase]
// jne original_damage
// xor rdx, rdx
original_damage:
// Здесь будет вставлен оригинальный код (mov [rcx+10], rdx ...)
// После выполнения CE автоматически вернет управление в игру после хука.
// Явный jmp не нужен!
[DISABLE]
// 3. Чистое удаление одной строкой
unhook(damageHook)
unregistersymbol(damageHook)
Разбор преимуществ:
- Безопасность: Нет риска «забыть» восстановить байты в секции
[DISABLE]—unhookделает это гарантированно. - Читаемость: Логика хука отделена от рутины управления памятью.
- Автоматическое выравнивание: CE сам обрабатывает случаи, когда инструкция по адресу хука короче 5 байт (размера
JMP), используяNOP-прокладки или длинные переходы. - Метка
original_damage: Вызывайте её как функцию (call original_damageили просто падение кода сквозь), чтобы выполнить оригинальную логику.
Условные блоки (Conditional Blocks) в AutoAssembler
Вторая киллер-фича 7.7 — препроцессорные директивы if/else/endif (и ifdef/ifndef). Они работают на этапе компиляции скрипта (парсинга), а не во время выполнения кода игры.
Сценарии использования:
- Поддержка разных версий игры в одной таблице.
- Включение/выключение фич через определения (
define). - Адаптация под архитектуру (x86 vs x64).
Пример: Мультиверсионная таблица
define(GAME_VERSION, 2) // 1 = Steam, 2 = Epic, 3 = GOG
[ENABLE]
if GAME_VERSION == 1
aobscanmodule(healthPtr, GameSteam.exe, 48 8B 05 ?? ?? ?? ?? 48 85 C0)
registersymbol(healthPtr)
elseif GAME_VERSION == 2
aobscanmodule(healthPtr, GameEpic.exe, 48 8B 05 ?? ?? ?? ?? 48 85 C0)
registersymbol(healthPtr)
elseif GAME_VERSION == 3
// GOG версия без Denuvo, другой паттерн
aobscanmodule(healthPtr, GameGOG.exe, 48 8B 0D ?? ?? ?? ?? 48 85 C9)
registersymbol(healthPtr)
else
// Fallback: ручной поиск или ошибка компиляции
// Можно использовать error("Unsupported version")
endif
// Общий код для всех версий
alloc(newmem, 1024, healthPtr)
label(return)
newmem:
mov [rax+10], #1000 // God mode
jmp return
healthPtr:
jmp newmem
nop
return:
[DISABLE]
healthPtr:
// Восстановление зависит от версии, но unhook не нужен, т.к. мы не использовали hook
// Просто читаем сохраненные байты (если использовали readmem) или пишем вручную
// Лучше использовать hook везде для единообразия!
unregistersymbol(healthPtr)
dealloc(newmem)
Важно: Условные блоки позволяют держать один файл .CT для всех билдов игры, просто меняя значение define в настройках таблицы или через Lua GUI.
Интеграция с Lua: Автоматизация рутины
CE 7.7 усилил связку AutoAssembler <-> Lua. Теперь можно генерировать сложные AA-скрипты на лету.
Пример Lua-обертки для быстрого создания хука
function createSafeHook(address, asmCode, hookName)
local script = string.format([[
[ENABLE]
hook(%s, original_%s)
%s_code:
%s
original_%s:
[DISABLE]
unhook(%s)
]], address, hookName, hookName, asmCode, hookName, address)
return autoAssemble(script)
end
-- Использование:
-- createSafeHook("game.exe+12345", "xor rax, rax
ret", "nullifyRax")
Это открывает путь к созданию визуальных конструкторов читов внутри CE, где пользователь выбирает адрес и действие из меню, а Lua генерирует корректный AA-код с хуками.
Ресурсы сообщества и документация
Для глубокого изучения рекомендую следующие источники, которые актуальны на 2026 год:
- GitHub: ALECAKIR/Auto-Assembler-Commands — самый полный справочник команд с примерами. Обязательно в закладки.
- Официальный репозиторий Cheat Engine: cheat-engine/cheat-engine — раздел Releases (последние сборки за февраль 2026) и Wiki.
- Форумы Gamehacklab / Cheat Engine Forum: Разделы «AutoAssembler Engine» и «Lua Scripting» — там обсуждают нюансы новых команд и делятся шаблонами.
- Туторы по x64dbg + IDA Pro + CE: Современный воркфлоу: IDA для статического анализа -> x64dbg для динамической отладки -> CE 7.7 для финальной реализации через
hook.
Типичные ошибки и лучшие практики (Best Practices)
| Ошибка | Решение в CE 7.7 |
|---|---|
| Ручное вычисление размера инструкции для JMP | Используйте hook(addr) без второго аргумента. CE сам определит длину через дизассемблер. |
| Конфликт хуков (два скрипта на одном адресе) | Проверяйте readBytes(address, 1) перед хуком или используйте систему приоритетов в Lua-менеджере таблиц. |
| Краш при отключении (не тот адрес в unhook) | Всегда используйте один и тот же символ/адрес в hook и unhook. Лучше: registersymbol(myHookAddr) -> hook(myHookAddr) / unhook(myHookAddr). |
Использование старых шаблонов alloc/newmem/jmp в новых проектах | Мигрируйте на hook/unhook. Код становится в 3 раза короче и безопаснее. |
Игнорирование if/endif для мультиверсионности | Оберните AOB-сканы в условные блоки. Это стандарт де-факто для публичных таблиц 2026 года. |
команд и условных блоков в AutoAssembler:
- Снизило порог входа для новичков (не нужно знать опкоды
JMP/CALLи выравнивание стека). - Повысило надежность таблиц (меньше крашей при включении/выключении).
- Стандартизировала кодовую базу сообщества (единый стиль хуков).
Если вы еще пишете хуки вручную через alloc и jmp — пора обновить свой стек технологий. Изучите репозиторий Auto-Assembler-Commands на GitHub, скачайте последнюю ночную сборку CE с официального репозитория и начните использовать декларативные хуки уже сегодня. Ваш код станет чище, а таблицы — стабильнее.
Статья подготовлена на основе данных официальных релизов Cheat Engine (февраль-март 2026), документации GitHub-репозитория ALECAKIR/Auto-Assembler-Commands и практики сообщества Gamehacklab/CE Forums.