Как писать читы для игр

Компьютерные игры открывают перед нами новые миры. И мир читов — один из них. Сегодня мы вместе пройдем путь от теории к практике и напишем собственный чит. Если ты хочешь научиться взламывать исполняемые файлы, то это может стать неплохим упражнением.

Виды читов и применяемые тактики

Существуют разные виды читов. Можно разделить их на несколько групп.

  • External — внешние читы, которые работают в отдельном процессе. Если же мы скроем наш external-чит, загрузив его в память другого процесса, он превратится в hidden external.

  • Internal — внутренние читы, которые встраиваются в процесс самой игры при помощи инжектора. После загрузки в память игры в отдельном потоке вызывается точка входа чита.

  • Pixelscan — вид читов, который использует картинку с экрана и паттерны расположения пикселей, чтобы получить необходимую информацию от игры.

  • Network proxy — читы, которые используют сетевые прокси, те, в свою очередь, перехватывают трафик клиента и сервера, получая или изменяя необходимую информацию.

Есть три основные тактики модификации поведения игры.

  1. Изменение памяти игры. API операционной системы используется для поиска и изменения участков памяти, содержащих нужную нам информацию (например, жизни, патроны).
  2. Симуляция действий игрока: приложение повторяет действия игрока, нажимая мышкой в заранее указанных местах.
  3. Перехват трафика игры. Между игрой и сервером встает чит. Он перехватывает данные, собирая или изменяя информацию, чтобы обмануть клиент или сервер.

Большинство современных игр написаны для Windows, поэтому и примеры мы будем делать для нее же.

Пишем игру на C

Про читы лучше всего рассказывать на практике. Мы напишем свою небольшую игру, на которой сможем потренироваться. Я буду писать игру на C#, но постараюсь максимально приблизить структуру данных к игре на C++. По моему опыту читерить в играх на C# очень просто.

Принцип игры прост: нажимаешь Enter и проигрываешь. Не особо честные правила, да? Попробуем их изменить.

Приступим к реверс-инжинирингу

game_executable.png

У нас есть файл игры. Но вместо исходного кода мы будем изучать память и поведение приложения.

game_behaviour.png

При каждом нажатии Enter жизни игрока уменьшаются на 15. Начальное количество жизней — 100.

Изучать память мы будем при помощи Cheat Engine. Это приложение для поиска переменных внутри памяти приложения, а еще хороший дебаггер. Перезапустим игру и подключим к ней Cheat Engine.

Первым делом мы получаем список всех значений 85 в памяти.

Нажмем Enter, и показатель жизней будет равен 70. Отсеем все значения.

Вот и нужное значение! Изменим его и нажмем Enter для проверки результата.

Проблема в том, что после перезапуска игры значение будет уже по другому адресу. Каждый раз отсеивать его нет никакого смысла. Необходимо прибегнуть к сканированию AOB (Array Of Bytes — массив байтов).

При каждом новом открытии приложения из-за рандомизации адресного пространства (ASLR) структура, описывающая игрока, будет находиться на новом месте. Чтобы найти ее, необходимо сначала обнаружить сигнатуру. Сигнатура — это набор не меняющихся в структуре байтов, по которым можно искать в памяти приложения.

После нескольких нажатий на Enter количество жизней изменилось на 55. Снова найдем нужное значение в памяти и откроем регион, в котором оно находится.

Выделенный байт и есть начало нашего int32-числа. 37 00 00 00 — число 55 в десятичной форме.

Я скопирую небольшой регион памяти и вставлю в блокнот для дальнейшего изучения. Теперь перезапустим приложение и снова найдем значение в памяти. Снова скопируем такой же регион памяти и вставим в блокнот. Начнем сравнение. Цель — найти байты рядом с этой сигнатурой, которые не будут меняться.

Проверим байты перед структурой.

Как видишь, выделенные байты не изменились, значит, можно попробовать использовать их как сигнатуру. Чем меньше сигнатура, тем быстрее пройдет сканирование. Сигнатура 01 00 00 00 явно будет слишком часто встречаться в памяти. Лучше взять 03 00 00 01 00 00 00. Для начала найдем ее в памяти.

Сигнатура найдена, но она повторяется. Необходима более уникальная последовательность. Попробуем ED 03 00 00 01 00 00 00.

В подтверждение уникальности получим такой результат:

Нам необходимо найти отступ от сигнатуры, чтобы получить ее стартовый адрес, а не адрес жизней. Пока сохраним найденную сигнатуру и отложим на некоторое время. Не беспокойся, мы к ней еще вернемся.

Жизненный цикл external

Используя функцию OpenProcess, внешние читы получают дескриптор для нужного процесса и вносят необходимые изменения в код (патчинг) или считывают и изменяют переменные внутри памяти игры. Для модификации памяти используются функции ReadProcessMemory и WriteProcessMemory.

Так как динамическое размещение данных в памяти мешает записать нужные адреса и постоянно к ним обращаться, можно использовать технику поиска AOB. Жизненный цикл external-чита выглядит так:

  1. Найти ID процесса.
  2. Получить дескриптор к этому процессу с нужными правами.
  3. Найти адреса в памяти.
  4. Пропатчить что-то, если нужно.
  5. Отрисовать GUI, если он имеется.
  6. Считывать или изменять память по мере надобности.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.

Я уже участник «Xakep.ru»← Ранее Новая разновидность Mirai расширила свой арсенал новыми процессорами и архитектурамиДалее → APT-платформа TajMahal атакует дипломатов и похищает данные из очереди на печать, CD и не только

Компьютерные игры открывают перед нами новые миры. И мир читов — один из них. Сегодня мы вместе пройдем путь от теории к практике и напишем собственный чит. Если вы хотите научиться взламывать игры, а точнее исполняемые файлы, то это может стать неплохим упражнением для вас.

РЕКОМЕНДУЕМ:Взлом игр Unity на примере игры Poker World

Содержание

Виды читов и применяемые тактики

Существуют разные виды читов для игр. Можно разделить их на несколько групп.

  • External — внешние читы, которые работают в отдельном процессе. Если же мы скроем наш external-чит, загрузив его в память другого процесса, он превратится в hidden external.
  • Internal — внутренние читы, которые встраиваются в процесс самой игры при помощи инжектора. После загрузки в память игры в отдельном потоке вызывается точка входа чита.
  • Pixelscan — вид читов, который использует картинку с экрана и паттерны расположения пикселей, чтобы получить необходимую информацию от игры.
  • Network proxy — читы, которые используют сетевые прокси, те, в свою очередь, перехватывают трафик клиента и сервера, получая или изменяя необходимую информацию.

Есть три основные тактики модификации поведения игры.

  1. Изменение памяти игры. API операционной системы используется для поиска и изменения участков памяти, содержащих нужную нам информацию (например, жизни, патроны).
  2. Симуляция действий игрока: приложение повторяет действия игрока, нажимая мышкой в заранее указанных местах.
  3. Перехват трафика игры. Между игрой и сервером встает чит. Он перехватывает данные, собирая или изменяя информацию, чтобы обмануть клиент или сервер.

Большинство современных игр написаны для Windows, поэтому и примеры мы будем делать для нее же.

Пишем игру на C

Про читы лучше всего рассказывать на практике. Мы напишем свою небольшую игру, на которой сможем потренироваться. Я буду писать игру на C#, но постараюсь максимально приблизить структуру данных к игре на C++. По моему опыту читерить в играх на C# очень просто.

Принцип игры прост: нажимаете Enter и проигрываете. Не особо честные правила, да? Попробуем их изменить.

Приступим к реверс-инжинирингу

Исполняемый файл игры

У нас есть файл игры. Но вместо исходного кода мы будем изучать память и поведение приложения.

Начнем с поведения игры

При каждом нажатии Enter жизни игрока уменьшаются на 15. Начальное количество жизней — 100.

Изучать память мы будем при помощи Cheat Engine. Это приложение для поиска переменных внутри памяти приложения, а еще хороший дебаггер. Перезапустим игру и подключим к ней Cheat Engine.

Подключение CE к игре

Первым делом мы получаем список всех значений 85 в памяти.

Все значения, которые нашел CE

Нажмем Enter, и показатель жизней будет равен 70. Отсеем все значения.

Значение найдено

Вот и нужное значение! Изменим его и нажмем Enter для проверки результата.

Значение изменено
Скрин игры, после того как мы нажали Enter

Проблема в том, что после перезапуска игры значение будет уже по другому адресу. Каждый раз отсеивать его нет никакого смысла. Необходимо прибегнуть к сканированию AOB (Array Of Bytes — массив байтов).

При каждом новом открытии приложения из-за рандомизации адресного пространства (ASLR) структура, описывающая игрока, будет находиться на новом месте. Чтобы найти ее, необходимо сначала обнаружить сигнатуру. Сигнатура — это набор не меняющихся в структуре байтов, по которым можно искать в памяти приложения.

После нескольких нажатий на Enter количество жизней изменилось на 55. Снова найдем нужное значение в памяти и откроем регион, в котором оно находится.

Регион памяти

Выделенный байт и есть начало нашего int32-числа. 37 00 00 00 — число 55 в десятичной форме.

Я скопирую небольшой регион памяти и вставлю в блокнот для дальнейшего изучения. Теперь перезапустим приложение и снова найдем значение в памяти. Снова скопируем такой же регион памяти и вставим в блокнот. Начнем сравнение. Цель — найти байты рядом с этой сигнатурой, которые не будут меняться.

Начинаем сравнивать байты

Проверим байты перед структурой.

Бинго!

Как видите, выделенные байты не изменились, значит, можно попробовать использовать их как сигнатуру. Чем меньше сигнатура, тем быстрее пройдет сканирование. Сигнатура 01 00 00 00 явно будет слишком часто встречаться в памяти. Лучше взять 03 00 00 01 00 00 00. Для начала найдем ее в памяти.

Сигнатура не уникальна

Сигнатура найдена, но она повторяется. Необходима более уникальная последовательность. Попробуем ED 03 00 00 01 00 00 00.

В подтверждение уникальности получим такой результат:

Сигнатура уникальна

Нам необходимо найти отступ от сигнатуры, чтобы получить ее стартовый адрес, а не адрес жизней. Пока сохраним найденную сигнатуру и отложим на некоторое время. Не беспокойтесь, мы к ней еще вернемся.

Жизненный цикл external

Используя функцию OpenProcess, внешние читы получают дескриптор для нужного процесса и вносят необходимые изменения в код (патчинг) или считывают и изменяют переменные внутри памяти игры. Для модификации памяти используются функции ReadProcessMemory и WriteProcessMemory.

Так как динамическое размещение данных в памяти мешает записать нужные адреса и постоянно к ним обращаться, можно использовать технику поиска AOB. Жизненный цикл external-чита выглядит так:

  1. Найти ID процесса.
  2. Получить дескриптор к этому процессу с нужными правами.
  3. Найти адреса в памяти.
  4. Пропатчить что-то, если нужно.
  5. Отрисовать GUI, если он имеется.
  6. Считывать или изменять память по мере надобности.

Пишем внешний чит для своей игры

Для вызова функций WinAPI из C# используется технология P/Invoke. Для начала работы с этими функциями их нужно задекларировать в коде. Я буду брать готовые декларации с сайта pinvoke.net. Первой функцией будет OpenProcess.

Следующая функция — ReadProcessMemory.

Теперь функция для считывания памяти WriteProcessMemory.

Перед нами встает проблема: для поиска паттерна необходимо собрать все регионы памяти процесса. Для этого нам потребуются функция и структура. Функция VirtualQueryEx:

Структура MEMORY_BASIC_INFORMATION:

Теперь можно приступить к написанию кода для самого чита. Первым делом найдем игру.

Затем откроем дескриптор к нашей игре.

Совместим все это в начальном коде.

Мы найдем ID процесса, затем получим его дескриптор и, если что, выведем сообщение об ошибке. Имплементация CriticalError(string) не так важна.

РЕКОМЕНДУЕМ:Лучшие игры для программистов и айтишников

После этого мы уже можем перейти к поиску паттерна в памяти. Создадим общий класс, в котором будут все функции для работы с памятью. Назовем его MemoryManager. Затем сделаем класс MemoryRegion для описания региона памяти. В MEMORY_BASIC_INFORMATION много лишних данных, которые не следует передавать дальше, поэтому я вынес их в отдельный класс.

Это все, что нам нужно: стартовый адрес региона, его размер и его защита. Теперь получим все регионы памяти. Как это делается?

  1. Получаем информацию о регионе памяти на нулевом адресе.
  2. Проверяем статус и защиту региона. Если все в порядке — добавляем его в список.
  3. Получаем информацию о следующем регионе.
  4. Проверяем и добавляем его в список.

После получения регионов просканируем их на наличие нужного нам паттерна. Паттерн состоит из частей двух типов — известного и неизвестного (меняющийся байт): например, 00 ?? ?? FB. Создадим интерфейс для описания этих частей.

Теперь опишем ту часть, которая имеет известный байт.

То же самое провернем со вторым типом.

Теперь сделаем парсинг паттерна из строки.

Как уже делалось выше, проверяем, какой это тип части паттерна, парсим его, если необходимо, и добавляем в список. Надо проверить работу этого метода.

Успех!

</p>

Теперь нам нужно научить наш MemoryManager читать память.

Сначала я написал красивую функцию с использованием Linq для сканирования памяти. Но ее выполнение заняло много времени. Затем я переписал метод без использования этой технологии, и все заработало в разы быстрее. Результат оптимизированной функции:

Быстрое сканирование памяти

Результат оригинальной функции:

Очень медленное сканирование памяти

Теперь поделюсь обретенной на этом этапе мудростью: не бойтесь оптимизировать свой код. Библиотеки не всегда предоставляют самые быстрые решения. Оригинальная функция:

Исправленная функция (просто используй Array.Copy()).

Эта функция ищет паттерн внутри региона памяти. Следующая функция использует ее для сканирования памяти всего процесса.

Добавим две функции для считывания и записи 32-битного числа в память.

Теперь все готово для поиска паттерна и написания основного кода чита.

Находим паттерн в памяти, затем — адрес жизней игрока.

Считываем значение жизней:

Почему бы не дать игроку почти бесконечные жизни?

И снова считаем жизни игрока для демонстрации.

Проверяем

Запустим наш чит, потом запустим игру.

Все работает

Попробуем нажать Enter в «игре».

Жизни изменились

Чит работает!

Пишем свой первый инжектор

Есть много способов заставить процесс загрузить наш код. Можно использовать DLL Hijacking, можно SetWindowsHookEx, но мы начнем с самой простой и известной функции — LoadLibrary. LoadLibrary заставляет нужный нам процесс самостоятельно загрузить библиотеку.

Нам понадобится дескриптор с необходимыми правами. Начнем подготовку к инжекту. Сначала получим у пользователя имя библиотеки.

Затем запросим у пользователя имя процесса и найдем его ID.

У этого кода будут проблемы с процессами с одинаковыми именами.

Теперь можно перейти к первому методу инжекта.

Имплементируем LoadLibrary инжект

Для начала разберем принцип работы данного типа инжектора.

  1. Сначала он считывает полный путь до библиотеки с диска.
  2. Собирает ее в строку. Затем мы получаем адрес LoadLibraryA(LPCSTR) при помощи GetProcAddress(HMODULE, LPCSTR).
  3. Выделяет память для строки внутри приложения, записывает ее туда.
  4. После создает поток по адресу LoadLibraryA, передавая путь в аргументе.
  5. Для работы укажем импорты OpenProcess, ReadProcessMemory, WriteProcessMemory, GetProcAddress, GetModuleHandle, CreateRemoteThread, VirtualAllocEx.

Сигнатуры можно запросто найти на pinvoke.net.

Первым делом откроем дескриптор с полным доступом к процессу.

Превратим нашу строку в байты.

После необходимо выделить память для этой строки.

В функцию передается дескриптор процесса handle: _MAX_PATH (максимальный размер пути в Windows), он равен 256. Указываем, что в память можно записать, считать ее и выполнить. Записываем строку внутрь процесса.

Так как мы будем использовать функцию LoadLibraryA для загрузки библиотеки, нам нужно получить ее адрес.

Все готово для запуска процесса инжекта. Осталось лишь создать поток в удаленном приложении:

Инжектор готов, но проверять его будем только после написания простой библиотеки.

Пишем основу для internal

Переходим на C++! Начнем с точки входа и простого сообщения через WinAPI. Точка входа DLL должна принимать три параметра: HINSTANCE, DWORD, LPVOID.

  • HINSTANCE — ссылается на библиотеку.
  • DWORD — это причина вызова точки входа (загрузка и выгрузка DLL).
  • LPVOID — зарезервированное значение.

Так выглядит пустая точка входа библиотеки:

Для начала проверим, почему вызывается точка входа.

Аргумент fdwReason будет равен DLL_PROCESS_ATTACH, если библиотека только что была подключена к процессу, или DLL_PROCESS_DETACH, если она в процессе выгрузки. Для теста выведем сообщение:

Теперь можем проверить инжектор и эту библиотеку. Запускаем инжектор, вводим имя библиотеки и процесса.

Библиотека загружена

Теперь напишем простой класс с синглтоном для красоты кода.

Теперь сам код. Конструктор по умолчанию и синглтон.

Далее простой код точки входа.

Должен сказать, что на следующую часть ушло больше всего времени. Одна маленькая ошибка привела к огромной трате времени. Но я сделал выводы и объясню вам, где можно допустить такую ошибку и как ее обнаружить.

Нам нужно найти паттерн внутри памяти игры. Для этого сначала мы переберем все регионы памяти приложения, затем просканируем каждый из них. Ниже представлена имплементация получения списка регионов памяти, но только для собственного процесса. Я объяснил принцип ее работы ранее.

Для каждого найденного региона этот код вызывает функцию find_pattern_in_range, которая ищет паттерн в этом регионе.

Сначала функция парсит паттерн.

Затем начинает и само сканирование.

Я использовал вектор из int, чтобы хранить данные о паттерне, -1 означает, что там может находиться любой байт. Сделал я это, чтобы упростить поиск паттерна, ускорить его и не переводить один и тот же код из внешнего чита.

Теперь несколько слов про ошибку, о которой я говорил ранее. Я постоянно переписывал функцию поиска паттерна, пока не решил взглянуть на функцию поиска регионов памяти. Проблема была в том, что я сравнивал защиту памяти совсем неправильно. Первоначальная версия:

Код принимал только страницы с читаемой/исполняемой памятью и читаемой/записываемой/исполняемой памятью. Остальные же он игнорировал. Код был изменен на такой:

Эта функция начала находить все нужные страницы памяти.

PAGE_READONLY может вызвать критическую ошибку во время записи данных, у нас всегда есть VirtualProtect.

Обнаружил же я эту ошибку, когда начал проверять страницы памяти в приложении при помощи Process Hacker и Cheat Engine. Мой паттерн оказался в одном из самых первых регионов памяти с защитой от исполнения, поэтому он никогда не находился.

Теперь же, найдя паттерн, мы можем сохранить его в поле нашего класса.

После этого будет вызвана функция internal_cheat::run(), которая и должна выполнять все функции чита.

Мы просто получаем адрес жизней игрока от нашего паттерна и устанавливаем их на максимальное значение (INT_MAX) каждые 100 мс.

Проверяем наш чит

Запускаем игру, инжектим библиотеку.

Чит заинжекчен

Попробуем нажать пару раз кнопку Enter.

Чит работает

Наши жизни не изменяются и все прекрасно работает!

Подведем итоги

Любой элемент игры, который обрабатывается на нашем компьютере, может быть модифицирован или вовсе удален. К сожалению или к счастью, игровые компании не всегда заботятся об античите, открывая дорогу нам, читерам и создателям читов для игр.

На самом деле, в вопросе, как создать чит на игру, нет ничего сложного, главным критерием является желание научиться. Если вам кажется, что для этого нужны умения в сфере программирования, то, конечно, вам предстоит работа с написанием скриптов, но эту задачу во многом облегчает появление различного программного оборудования. А уж разобраться в принципах работы той или иной программы и ее интерфейсом, согласитесь, проще, чем познавать компьютерные знания с нуля.

Подбираем ПО

Возникает в связи с этим вопрос: какое программное обеспечение нам понадобится в первую очередь? С чем будет легко работать новичку? Для этого можно использовать различные программы, возьмем для примера lernel.dll. В ней есть специальные функции для дебага, которыми мы и будем пользоваться. При помощи них можно не только чинить, но и изменять значения гамы, что нам будет на руку.

С чем работать будем?

Перечислим основные программные продукты, которые, как правило, используются для решения данной задачи. Для того чтобы создать чит на игру, вам потребуется три вещи:

  1. Delphi (желательно последней версии).
  2. GameHack или другая подобная программа. Рационально будет выбрать GameTrainer, так как она абсолютно бесплатная.
  3. Прямые руки.

Для начала разузнаем побольше информации о гаме.

  1. Название окна. Каждый сможет его найти, в этом нет ничего сложного.
  2. Адрес в памяти. Для внесения новой информации в памяти необходимо конкретно знать, где и что изменить. Поэтому для начала находим нужный адрес и только после этого хакаем. В этом может помочь специально разработанная программа – GameTrainer (или другая типичная). Об этом уже упомянуто выше.

Заходим в игру. Запоминаем текущее значение золота, жизней, фрагов или другой нужной единицы. После чего в вышеуказанной программе выбираем в первом поле процесс, а во втором значение ресурса, который вы запомнили. Теперь GameTrainer выдаст большое количество адресов, нам потребуется найти нужный. Для того чтобы отсеять все «левые» адреса, потребуется развернуть игру и немного потратить или набрать значение ресурса, который мы вводили выше (купить что-то, сделать пару килов и т. д.). После чего вводим в GameTrauner обновленное значение ресурса, только в этот раз будем нажимать не Find (для поиска всех адресов), а Seive (отсеивать из найденных неподходящие). Проделываем эту операцию, пока не останется минимальное количество адресов.

Тип данных – он играет немалую роль. Взяв его за основу, мы будем делать чит и определять максимальные размеры. К примеру: Byte 246; 1 байт; Word 64528; 2 байта.

Читы в игре Warface

Немалое количество игроков задумываются, как создать чит на варфейс. Такие знания не только облегчают игру, но и делают ее более интересной. Конечно, необычные свойства и качество героев могут в один присест, так сказать, сделать вас всемогущим без траты денег и времени на прокачивание персонажа. Однако администрация зачастую выпускает всяческие обновления, которые усиливают систему защиты и вместе с этим выводят из строя многие хаки. Именно поэтому игроки задаются вопросом, как создавать читы для Warface самостоятельно.

Необязательно быть программистом, чтобы разобраться в несложной системе при наличии специальных приложений. Наиболее важными являются: Delphi 7, различные необходимые SDK, Cheat Engine и многие другие.

В вопросе как создать чит на варфейс нам поможет программа Devel Studio, которая доступна для скачивания в интернете. Открываем, в появившееся окно добавляем изображение при помощи специальной кнопки на панели справа. После чего закрепляем за ним любую понравившуюся картинку.

Далее создаем несколько текстовых полей, в которые вписываем названия для новых функций. Рядом с ними оставляет ячейки для ввода и непосредственно кнопку для совершения самой операции. Названия для полей выбираем произвольно, главное, чтобы в последующем они не путали пользователя. За кнопкой потребуется закрепить скрипт, который будет совершать все манипуляции.

Создание читов для копателя

В последнее время игра «Копатель онлайн» получила большую популярность, в нее зарегистрировано более трех миллионов пользователей. Основами приложения являются строительство и разрушение. Вы сможете строить, ломать, добывать ресурсы и использовать их. Из-за большой популярности постоянно возникает вопрос, как создать чит на «Копатель онлайн»? Что ж, объясним геймерам и это!

Попробуем создать чит на игру при помощи программы Cheat Engine, которую можно свободно скачать. Запускаем ее и создаем новый проект при помощи нажатия кнопки File-Generate-generic-trainer-luascropt-fromtable. В открывшемся окне выбираем процесс, для этого в строку Process name пишем Plugin-container.exe. После подбираем название для нашего будущего чита и записываем его в специальное окно. При желании также можно указать себя как автора, чтобы все пользователи смогли перейти на вашу страничку «ВКонтакте» или на «Фейсбуке».

Как настроить чит?

Теперь приступаем непосредственно к настройке чита, для этого нажимаем Table-CETrainer-Edit. В открывшемся поле удаляем все ненужные окна, оставляем пустую ячейку для заполнения. Это и будет рабочее окно для нашей программы. Произвольно выбираем размер окна, после этого сделаем фоновую картинку. Для этого обводим все поле и в открывшейся настройке в левом углу выбираем Picture и загружаем обложку.

Проделав все подготовительные работы, можно создать кнопку при помощи функционального окна. После открываем настройки и в строке Caption задаем ей имя.

Как запустить созданный файл

Непосредственно для самого чита потребуется в обязательном порядке создать надстройку браузера. Это будет небольшая строка, в которой мы сможем выбирать желаемый ресурс, при помощи которого запускается игра. В опциях обязательно потребуется внести коррективы в строке Items, здесь нужно прописать все возможные браузеры, которыми вы пользуетесь (Mozilla, Opera, Chrome или другие).

Ниже создаем кнопку и задаем ей название «Подключиться». Слева в настройках выбираем Events и в этом подразделе ищем On Click и открываем настройки. В пустое место необходимо вставить скрипт:

Change=component_findComponentByName(CETrainer,’CEComboBox1′)

Vibor=getProperty(Change,’ItemIndex’)

ifVibor == ‘0’ then

browser = «plugin-container.exe»

end

ifVibor == ‘1’ then

browser = «opera.exe»

end

ifVibor == ‘2’ then

browser = «chrome.exe»

end

openProcess(browser)

showMessage(‘Подключился!’)

Не забываем в первой сроке сменить CEComboBox1 на CEComboBox1Click, так как изначально мы выбирали включение при помощи одного клика. После чего сохраняем и закрываем скрипт при помощи кнопки ExecuteScript.

Работаем над кнопкой закрытия

После этой операции потребуется создать кнопку, которая будет закрывать чит. Создаем еще одну клавишу и задаем ей соответствующее название. Далее по накатанной нажимаем Events-OnClick и открываем настройку. Опускаемся ниже прописанного скрипта на включение и приписываем:

showMessage(«»)

closeCE()

returncaFree

В поле showMessage(«») пишем фразу, которую мы хотим видеть при закрытии чита, допустим, «Спасибо за использование нашей программы!».

Теперь можно создать еще одну функцию для полета. Для этого создаем маркер, задаем ему соответствующее имя. В поле слева выбираем Events — OnClick и вписываем скрипт:

if (checkbox_getState(sender)==1) then

Timer3 = createTimer(f ,false)

Polet()

else

if (checkbox_getState(sender)==0) then

timer_setEnabled(Timer3 ,false)

end

Полет готов, теперь его можно использовать. Также можно создать множество других функций, которые будут перенаправлять на другое окно. Для этого потребуется создать кнопку и закрепить за ней скрипт:

form_show(UDF5) – к примеру. Не забываем подставлять свое название.

Отметим, что чит всегда должен себя оправдывать и выполнять нужные функции. Если у вас что-то не получилось, то не отчаивайтесь, проделайте действия еще раз — и все обязательно получится.

Немалой популярностью также пользуются кроссфаер-читы, которые можно создавать по такому же алгоритму. Главное, подобрать правильные скрипты и выбрать нужные функции, которые вы желаете добавить персонажу.

Заключение

Мы привели простейшие инструкции, как создать чит на игру и работать с ним в самых распространенных современных программах. Вы же, чувствуя потенциал и освоив программные заморочки, можете попробовать применить вышеуказанную инструкцию к другим приложениям. Это не потребует от вас больших временных затрат, ведь главные аспекты уже изложены в этом материале. Зато удовольствия от уникальности вашего персонажа будет гораздо больше, это позволит вам без труда проходить сложные уровни и становиться победителем. А ведь прокачивание своего игрового персонажа в большинстве игр требует вложения реальных денежных средств. Зная, как создается чит, вы будете избавлены от таких малоприятных ситуаций. Желаем успеха!

Используемые источники:

  • https://xakep.ru/2019/04/11/games-hacking/
  • https://tech-geek.ru/make-cheat-codes-for-games/
  • https://fb.ru/article/143573/kak-sozdat-chit-na-igru

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116