Cheat-Engineering или пособие по созданию читов

Cheat-Engineering или пособие по созданию читов

@webware

t.me/webware

Привет! В этой статье, мы поговорим о создании читов.


ВНИМАНИЕ: Данная статья не призывает к нарушению закона, а предоставляет информацию для общего развития. Автор не несёт ответственности за ваши действия.


Любого рода значения хранятся в оперативной памяти. Читы внедряются в память другого процесса и изменяют определёные значения по определёному адресу. Если чит создан для online-игры, то он внедряется в сетевой протокол и особым образом изменяет его. В этой статье мы поговорим исключительно о читах для offline игр. Есть 2 основных метода взаимодействия чита с оперативной памятью, это из вне процесса и из самого процесса. Мы рассмотрим только метод из вне. Другой пожалуй, рассмотрим в следующей части.


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

C:

/*Библиотеки*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tlhelp32.h>

/*Прототипы функций*/
int initialization(void); //Функция инициализации.
void modificate(HANDLE, bool); //Функция, которая заменяет значения.
int errExit(int); //Функция выхода с ошибкой.
DWORD GetModuleBase(LPSTR, DWORD); //Вспомогататльная функция получения реального адреса ячейки.

int main(void){
  HANDLE process = initialization(void); //Инициализация
  modificate(process, /*TRUE если адрес значения статичен, т.е. при каждом запуске один и тот же, а FALSE, если адрес динамичен. Предположим, что адрес статичен. */ TRUE);
  return(0);
}

HANDLE initialization(void){
  HWND headW;
  HANDLE process;
  DWORD pid;

  headW = FindWindowA(NULL, "Заголовок окна игры"); //Получаем окно игры.
  GetWindowThreadProcessId(headW, &pid); //Получаем pid игры.
 
  if(pid == NULL) //Если ошибка, то выход с ошибкой.
    errExit(1);
  process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); //Получаем доступ записи в процесс.

  if(process == NULL) //Если ошибка, то выход с ошибкой.
    errExit(2);
 
  return(process); //Возвращаем ссылку на процесс.
}

void modificate(HANDLE process, bool is_static){
 int PatchMoney = 999999; //Количество необходимых нам денег.

   if(is_static == TRUE){ //Если включён статический режим, то именяем значение.
    WriteProcessMemory(process, (LPCVOID)(/*Адрес до ячейки. Предположим, что он 0x12345678.*/0x12345678), &PatchMoney, 4, NULL);
  }
  else if(is_static == FALSE){ //Если включён динамический способ, то изменяем значение другим способом.
    WriteProcessMemory(process, (LPCVOID)(GetModuleBase("/*Точка отсчёта смещения. Предположим, что это MoneyModule.dll.*/MoneyModule.dll", pid ) + /*Смещение. Предположим, что оно 0x12345678.*/ 0x12345678), &PatchMoney, 4, NULL);
  }
}

int errExit(int code){
  if(code == 1){//Если код ошибки 1,  то выводим ошибку.
    printf( "[-] Error! Cannot to get pid of the game.\n");
    exit(1);
  }
  else if(code == 2){
    printf("[-] Error! Cannot to get access to the process.\n");
    exit(2);
  }
}

А как получить эти самые адреса и смещения? Запускаем Cheat Engine и ищем адрес значения, которое мы и будет менять. Если адрес зелёный, то он статичен. Если адрес динамичен, то нажимаем двойным кликом по нему и получаем что-то похожее на это "*.dll" + 0x11223344. Вот эту "*.dll" в коде выше нужно вствить вместо MoneyModule.dll, а 0x11223344 нужно вставить вместо 0x12345678. 


Ну, на этом всё. Спасибо за внимание.

Источник codeby.net

Report Page