Cheat Engine 7.7: новые команды Hook и Unhook в AutoAssembler

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Дата публикации: | Версия: 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)

Разбор преимуществ:

  1. Безопасность: Нет риска «забыть» восстановить байты в секции [DISABLE] — unhook делает это гарантированно.
  2. Читаемость: Логика хука отделена от рутины управления памятью.
  3. Автоматическое выравнивание: CE сам обрабатывает случаи, когда инструкция по адресу хука короче 5 байт (размера JMP), используя NOP-прокладки или длинные переходы.
  4. Метка 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.