Существуют два основных способа работы читов.
1. Инъекция dll к процессу игры
2. Редактирование чужой памяти
Со вторым всё просто. Подключаемся к процессу, читаем память. Ищем нужные паттерны (или адреса), редактируем.
А вот первый вариант достаточно обширный. На самом деле, если б не было античитов, то всё просто. Подключаемся к процессу, создаем удаленный поток в контексте чужого процесса с вызовом загрузки нужной нам библиотеки. При загрузке библиотеки, она начинает выполняться. Обычно это бесконечный цикл до выгрузки библиотеки. Но античит такое детектит очень легко. Ведь сама библиотека отображается в списке загруженных библиотек. А также, античит может повесить хук на метод загрузки библиотеки и верифицировать "легальность" вызова метода.
По этому, существует более изощренный способ инъекции. Через редактирование памяти. Мы просто всю библиотеку записываем в ОЗУ чужого процесса, определяем все методы этот библиотеки в памяти, а дальше как с обычным инжектом, создаем удаленный поток, но с указанием точки входа в библиотеку напрямую. В итоге, у нас библиотека даже отображаться не будет в списке подгруженных модулей. Называется это ManualMap.
Однако и это детектят. Обычно на стадии доступа к памяти. Детектят используя драйвер. Здесь все ещё сложнее.
Для обхода нам тоже будет нужен драйвер, чтобы поднять наш уровень доступа так сказать. Но это уже потом.
Важный момент. Он состоит в том, что создание читов под Win32 отличается от создания читов под Win64. Это касается архитектуры процесса, а не винды.
P.S. всё это я делал на Delphi, но принцип работы и все методы идентичны почти на всех языках, это ведь WinApi.