Cheat Engine: что это, как работает и как использовать на примере Windowkill
В этом репозитории я рассказываю о приложении Cheat Engine и показываю, как оно работает на примере моей игры Windowkill.
Cheat Engine — это инструмент для анализа и модификации данных в памяти запущенных приложений (обычно игр). Он позволяет:
- находить значения в оперативной памяти (RAM);
- фильтровать и уточнять результаты поиска по изменениям значений;
- изменять найденные значения в реальном времени;
- анализировать код и структуры данных процесса, устанавливать точки останова и т. д.
Применение:
- обучение программированию и пониманию работы памяти;
- исследование внутреннего устройства игр и приложений;
- отладка (да, разработчики тоже используют CE как вспомогательный инструмент);
- моддинг и эксперименты в одиночных проектах.
Скачать актуальную версию: cheatengine.org/downloads.php. На официальной странице указано, что инструмент предназначен для образовательных целей; возможны ложные срабатывания антивирусов — при проблемах с установкой/запуском временно отключите защиту или добавьте исключение.
Вы запускаете игру, затем Cheat Engine и выбираете процесс игры в списке процессов. После этого CE получает доступ к адресному пространству процесса для чтения/записи.
Предположим, у персонажа 100 единиц здоровья. Вы вводите «100» и запускаете поиск. CE сканирует память процесса и находит все вхождения значения 100. Таких адресов обычно много.
Далее вы сужаете поиск: получаете урон (например, стало 90), задаёте новый фильтр «90». Повторяете цикл «изменить в игре → отфильтровать в CE», пока не останется мало кандидатов или один адрес.
Когда адрес найден, значение можно изменить на лету (например, поставить здоровье 9999). Игра «поверит» этому, потому что читает данные из RAM.
- Временные значения (здоровье, очки, координаты) почти всегда в RAM — их и находит CE.
- Постоянные значения (сохранения, настройки) часто хранятся:
- в файлах на диске (JSON, XML, бинарные сейвы);
- в реестре Windows;
- в локальных мини‑базах (например, SQLite);
- в облаке/на сервере для онлайн‑игр.
Cheat Engine работает именно с памятью процесса. Но понимание «постоянного» хранилища помогает лучше анализировать логику игры:
- Сейвы могут загружаться в память при старте уровня — после этого их можно найти сканированием.
- Некоторые значения пересчитываются кодом каждый кадр, а CE позволяет «поймать» место, где они меняются, через отладчик/точки останова.
Коротко о базах данных в играх:
- SQLite/локальные БД — встраиваемая БД в одном файле; удобна для кроссплатформенных сохранений/таблиц лидеров офлайн.
- Серверные БД (PostgreSQL/MySQL/NoSQL) — используются онлайн‑проектами; данные игрока хранятся на сервере, а клиент получает только копию/срез. В таком случае менять RAM клиента часто бесполезно: сервер регулярно валидирует данные.
Практика на примере Windowkill
Ниже — пошаговая демонстрация поиска и изменения очков в моей игре. Скриншоты находятся в папке foto/ репозитория.
Сначала решаем, что хотим менять. В примере — очки. Смотрим текущее количество очков в игре.
Открываем Cheat Engine и выбираем процесс игры в списке.
Вводим текущее количество очков и запускаем первый поиск (First Scan). Тип значения подбираем в зависимости от игры, чаще всего это 4‑байтное целое (Value Type: 4 Bytes).
Меняем очки внутри игры (например, заработали ещё 6 очков), затем в CE указываем новое значение и запускаем «Next Scan».
Повторяем цикл «изменили в игре → отфильтровали в CE», пока не останется один или несколько правдоподобных адресов.
Когда остался нужный адрес, дважды кликаем по нему, чтобы добавить в нижнюю таблицу. Далее кликаем правой кнопкой → Change record → Value и меняем на желаемое число (например, 100).
Значение обновится мгновенно — видим новые очки.
Ниже — обзор ключевых функций, которыми полезно владеть.
- Exact Value — поиск точного значения (классический случай: 100 → 90 → 80 ...).
- Unknown Initial Value — когда начальное значение неизвестно. Далее используйте фильтры:
Increased,Decreased,Changed,Unchanged. - Value Type — 1/2/4/8 Bytes, Float, Double, String, Array of Byte (AOB), Binary. Часто очки —
4 Bytes, здоровье/таймеры —Float/Double. - Aligned/Unaligned — влияет на то, как CE шагает по памяти (по краям слов/двойных слов).
- Fast Scan / Writable / Executable / CopyOnWrite — флаги для ускорения и ограничения областей поиска.
Ищет последовательности байтов (паттерны), устойчивые к перезапускам. Позволяет находить код/данные даже при изменении адресов.
Адресы данных часто «прыгают» при каждом запуске. Pointer Scan ищет цепочки указателей, которые стабильно ведут к нужному значению. Это ключ к долговечным таблицам.
Исследование структур в памяти, автоматическое определение полей и их типов относительно базового адреса. Полезно для сложных сущностей (например, структура игрока с десятками полей).
Просмотр памяти и кода, навигация по модулям, функциям, символам. Можно ставить breakpoint и отслеживать, где именно код читает/пишет нужный адрес (Find out what writes/accesses this address).
Позволяет приостановить выполнение, посмотреть регистры и стек вызовов, понять, какой участок кода меняет значение. Поддерживаются разные бэкенды отладки, есть «stealth» режимы.
Язык сценариев CE для вставки кода на лету (инжект), изменения инструкций, перехвата функций. Используется для создания стабильных читов, тренеров и фиксов. Скрипты можно сохранять в .CT таблицы.
Изменяет скорость восприятия времени игрой (ускорение/замедление). Работает не во всех проектах (анти‑чит/таймчеки на стороне игры/сервера).
CE имеет встроенный Lua‑интерпретатор: автоматизация действий, создание GUI‑тренеров, горячих клавиш, реакция на события. Таблицы .CT могут включать Lua‑скрипты и формы.
Все найденные адреса/указатели/скрипты удобно сохранять в таблицу. Это позволяет быстро поднимать окружение после перезапуска игры.
Для игр на Unity/Mono доступен анализ управляемых сборок, классов, методов, полей, их адресов и прямые хуки на уровне C#/IL.
Отслеживание, кто читает/пишет указанный адрес. Очень полезно для обратной разработки логики.
- Начинайте с очевидного типа (
4 Bytes), если не уверены — попробуйтеFloat. - Если адрес «живет» недолго, используйте «Find out what writes/accesses this address» и перейдите к анализу кода.
- Для стабильности после перезапуска игры применяйте
Pointer ScanилиAOB Scan. - Для таймеров/скорости — часто подходят
Float/Doubleи фильтрыDecreased/ Increased. - При непредсказуемом формате — используйте
Unknown initial valueи последовательные фильтры изменений.
- Адрес каждый раз меняется. Используйте Pointer Scan или AOB‑сигнатуру.
- Значение не находится. Поменяйте тип (4 Bytes ↔ Float/Double), сканируйте «Unknown initial value» с фильтрами изменений.
- Изменение не влияет на игру. Значение может быть кешировано/пересчитываться — ищите «что пишет в адрес» и фиксируйте код; возможно, данные валидирует сервер.
- Крашится при дебаге. Попробуйте другие настройки отладчика в CE, отключите сторонний анти‑чит, запустите CE от имени администратора.
Cheat Engine — мощный инструмент для изучения программ, памяти и игрового кода. Используйте его ответственно: для обучения, анализа и экспериментов. На примере Windowkill вы увидели базовый цикл: найти → отфильтровать → изменить. Дальше в ход идут продвинутые техники — указатели, сигнатуры, инжекты и скрипты — которые делают результаты стабильными и воспроизводимыми.
| Функция | Что делает |
|---|---|
| Exact Value Scan | Поиск точного значения (100 → 90 → 80 и т. п.) |
| Unknown Initial Value | Поиск при неизвестном начальном значении с фильтрами изменений |
| Next Scan Filters | Фильтры Increased/Decreased/Changed/Unchanged для сужения результатов |
| Value Type | Выбор типа: 1/2/4/8 Bytes, Float, Double, String, AOB, Binary |
| Fast Scan / Writable / Executable / COW | Ограничение областей памяти и ускорение поиска |
| AOB Scan (Array of Byte) | Поиск по сигнатурам байт, устойчивый к смене адресов |
| Pointer Scan | Поиск цепочек указателей для стабильного доступа к значению |
| Freeze (заморозка) | Фиксация значения, чтобы игра не могла его изменить |
| Memory Viewer | Просмотр/редактирование памяти, переход по модулям и адресам |
| Find out what accesses/writes | Отслеживание кода, который читает/пишет адрес |
| Breakpoints (Debugger) | Остановка кода, просмотр регистров/стека, пошаговое исполнение |
| Auto Assembler (AA) | Скриптовый ассемблер CE для инжектов и модификации кода |
| Code Injection | Вставка кода в процесс для перехвата логики |
| Speedhack | Замедление/ускорение выполнения игры |
| Lua Engine | Автоматизация, GUI‑формы тренеров, хоткеи |
| Trainer Maker | Создание тренеров на базе таблиц и Lua |
| Mono features | Анализ классов/методов для игр на Unity/Mono |
| Dissect Structure | Исследование и разметка структур данных в памяти |
| Data Breakpoints | Триггеры на чтение/запись/исполнение в адресе |
Ссылка на репозиторий игры: https://github.com/FitoDomik/Windowkill





