-
Автор темы
- #1
Добрый день. В этом гайде я бы хотел показать Вам как создаются Internal читы, как они работают, немного показать их отличие от External, ну и вообщем прочее обилие информации. Разумеется научить делать Ваши собственные читы, рассказать один из самых простых способов. Приступим. В данном гайде я покажу вам как сделать простейший internal чит для игры Among Us, ее выбрал по причине отсутствия античита(как такового защищающего от инжекта и работы с памятью например, о серверсайд защите и других аспектах поговорим в самом гайде), низкой требовательности, быстрым запуском и удобным поиском нужных нам значений. Существует миллион и один способ заставить ваш чит работать и в большинстве своем для этого требуются адреса, смещения или же оффсеты, методы для работы с памятью. Наиболее простой вариант, как таковой искать все эти вещи для работы с памятью -
это СЕ, программа обладает громадным и без преувеличения гениальным функционалом. Почему именно CE?
Cheat Engine - позволяет вам независимо от ЯП на котором написана игра искать значения в реалтайме любым удобным вам способом. То есть шифрованые значения, протект и тому подобные вещи в реалтайме не особо страшны, в отличие от обфускации условных структур, классов и их полей, которые довести до нормального вида зачастую просто невозможно. Даже при условии, что тот же Among Us написан на С++ и конвертирован в Il2cpp, то даже использовав дампер мы увидим непонятные наборы символов в структурах и классах и опять же их полях.
Понять, что там написано и как оно нам в будущем поможет мы конечно не сможем, потому что восстановить это нам не под силу, а вот найти значение в реалтайме, как раз таки является самым простым путем. В простых играх не защищенных мощными античитами грех не воспользоваться столь простым способом, разумеется что для кулебяк, которые вновь будут писать гневные отзывы под этим гайдом поясню, что мы не берем в расчет игры с кернел античитами по типу EAC, BE и т.д. Знание языка программирования тоже обязательно, желательно тот на котором написана игра, либо универсальный - С++. Для создания чита нам разумеется понадобится меню. Самый простой способ - ImGui, максимально простая и понятная библиотека с открытым исходным кодом и бла-бла-бла. Для старта нам подойдет какой-нибудь условный DirectX Hook от Kiero, данная вещь позволит вам рисовать свое собственное меню. Например: https://github.com/rdbo/ImGui-DirectX-11-Kiero-Hook
Учтите версию DirectX на котором написана игра, посмотреть можно в интернете. Among Us например работает на версии 11. Настроив проект под себя, добавив паник кей, кнопку открытия и закрытия меню, пару переменных, немного работы с самим сурсом мы получим базу. Пожалуйста, учтите что все это нужно уметь делать самому, т.к это базовые навыки работы с IDE и исходным кодом. Финальный вид моей работы выглядит примерно вот так:
Имея свой опыт написания читов с нуля я прекрасно пониманию как это делать. Сделав неплохую базу под себя и немного поработав с меню я получил вот такой результат:
На функционал не смотрите, я набросал его для будущей работы. Создав пару переменных и наброски функций приступим к работе с памятью.
Если вы не можете организовать собственное рабочее пространство и воспользоваться информацией расписанной во многих гайдах на этом форуме, то пожалуйста не нужно писать, что гайд вам чем-то не помог. Приступим к написанию функциональной части. Так как гайд сделан не для совсем нубов и вы должны понимать хотя бы немного, что такое геймхакинг и программирование, то пожалуйста приступайте. Открываем CE и игру. Заходим в локалку.
Видим значение скорости, в конце находится плавающая точка, значит значение имеет тип float. Используя поиск ищем и отсеиваем нужный адрес.
После поисков я нашел данный адрес, перезайдя в игру можно понять, что он не статичен, а нам нужно как раз наоборот. Поменяв значение мы видим что оно изменилось на наше.
Создаем поинтер. ПКМ по адресу, затем:
Тут ставим 250, так как оффсеты зачастую короче 250 символов.
Жмем ОК, вбиваем рандомное название нашего скана и сохраняем, ждем пока все просканиться и мы не дойдем до этого этапа.
Мы видим здесь обилие адресов и смещений, которые нам не нужны. Выходим из игры, скан и сам Cheat Engine не закрываем. Перезаходим в игру, снова подключаемся к ней в СЕ и снова ищем адрес нашего значения.
Вот два наших адреса. Как видим первый больше не работает. Открываем окно поинтер скана и жмем сюда.
Выбираем Addres to find, и вбиваем наш второй адрес.
Сохраняем с другим названием и видим уже нормальные адреса.
Главное не забудьте выставить здесь корректный тип данных.
Нажимаем на Offset 0, Offset 1, Offset 2, Offset 3 по очереди пока не увидите адрес с меньшим количеством смещений. Вот например:
Статический адрес и три смещения. Выбираем любой и нажимаем на него два раза. Закрываем окно поинтер скана. Наш скан перенесется в адрес лист и мы увидим его там.
Нажимаем дважды на адрес и видим такую картину.
Базовый адрес, модуль + адрес. Затем адрес + смещение + смещение + смещение = стат. адрес нашей скорости. Перезайдя в игру и вновь подергав наш поинтер, если сделали все правильно, он будет давать и менять верное значение. Открываем сурс и начинаем шаманить функции. Создаем функцию:
Обратите внимание на порядок смещений, они должны идти в строго верном порядке, как показано тут:
Справа виден полный порядок получения адреса. Функция find_addr ищет статический адрес добавляя к нему смещения с помощью цикла, так что порядок в массиве тут непосредственно важен.
Создаем свои приколы для вызова функций, например:
И дальше вызываем в нашей инициализации, там где вам удобно наше меню, функции и т.д.
Проверяем, видим что наша скорость изменилась после включения функции в меню. Profit!
По аналогии с данным методом ищем другие значения и делаем свои функции. Если что-то не понятно спрашиваем. На этом у меня всё, многое пришлось упустить да бы гайд не стал еще более огромным по своему содержанию, в будущем если будет желание расскажу все нюансы. Удачи!
это СЕ, программа обладает громадным и без преувеличения гениальным функционалом. Почему именно CE?
Cheat Engine - позволяет вам независимо от ЯП на котором написана игра искать значения в реалтайме любым удобным вам способом. То есть шифрованые значения, протект и тому подобные вещи в реалтайме не особо страшны, в отличие от обфускации условных структур, классов и их полей, которые довести до нормального вида зачастую просто невозможно. Даже при условии, что тот же Among Us написан на С++ и конвертирован в Il2cpp, то даже использовав дампер мы увидим непонятные наборы символов в структурах и классах и опять же их полях.
Понять, что там написано и как оно нам в будущем поможет мы конечно не сможем, потому что восстановить это нам не под силу, а вот найти значение в реалтайме, как раз таки является самым простым путем. В простых играх не защищенных мощными античитами грех не воспользоваться столь простым способом, разумеется что для кулебяк, которые вновь будут писать гневные отзывы под этим гайдом поясню, что мы не берем в расчет игры с кернел античитами по типу EAC, BE и т.д. Знание языка программирования тоже обязательно, желательно тот на котором написана игра, либо универсальный - С++. Для создания чита нам разумеется понадобится меню. Самый простой способ - ImGui, максимально простая и понятная библиотека с открытым исходным кодом и бла-бла-бла. Для старта нам подойдет какой-нибудь условный DirectX Hook от Kiero, данная вещь позволит вам рисовать свое собственное меню. Например: https://github.com/rdbo/ImGui-DirectX-11-Kiero-Hook
Учтите версию DirectX на котором написана игра, посмотреть можно в интернете. Among Us например работает на версии 11. Настроив проект под себя, добавив паник кей, кнопку открытия и закрытия меню, пару переменных, немного работы с самим сурсом мы получим базу. Пожалуйста, учтите что все это нужно уметь делать самому, т.к это базовые навыки работы с IDE и исходным кодом. Финальный вид моей работы выглядит примерно вот так:
Имея свой опыт написания читов с нуля я прекрасно пониманию как это делать. Сделав неплохую базу под себя и немного поработав с меню я получил вот такой результат:
На функционал не смотрите, я набросал его для будущей работы. Создав пару переменных и наброски функций приступим к работе с памятью.
Если вы не можете организовать собственное рабочее пространство и воспользоваться информацией расписанной во многих гайдах на этом форуме, то пожалуйста не нужно писать, что гайд вам чем-то не помог. Приступим к написанию функциональной части. Так как гайд сделан не для совсем нубов и вы должны понимать хотя бы немного, что такое геймхакинг и программирование, то пожалуйста приступайте. Открываем CE и игру. Заходим в локалку.
Видим значение скорости, в конце находится плавающая точка, значит значение имеет тип float. Используя поиск ищем и отсеиваем нужный адрес.
После поисков я нашел данный адрес, перезайдя в игру можно понять, что он не статичен, а нам нужно как раз наоборот. Поменяв значение мы видим что оно изменилось на наше.
Создаем поинтер. ПКМ по адресу, затем:
Тут ставим 250, так как оффсеты зачастую короче 250 символов.
Жмем ОК, вбиваем рандомное название нашего скана и сохраняем, ждем пока все просканиться и мы не дойдем до этого этапа.
Мы видим здесь обилие адресов и смещений, которые нам не нужны. Выходим из игры, скан и сам Cheat Engine не закрываем. Перезаходим в игру, снова подключаемся к ней в СЕ и снова ищем адрес нашего значения.
Вот два наших адреса. Как видим первый больше не работает. Открываем окно поинтер скана и жмем сюда.
Выбираем Addres to find, и вбиваем наш второй адрес.
Сохраняем с другим названием и видим уже нормальные адреса.
Главное не забудьте выставить здесь корректный тип данных.
Нажимаем на Offset 0, Offset 1, Offset 2, Offset 3 по очереди пока не увидите адрес с меньшим количеством смещений. Вот например:
Статический адрес и три смещения. Выбираем любой и нажимаем на него два раза. Закрываем окно поинтер скана. Наш скан перенесется в адрес лист и мы увидим его там.
Нажимаем дважды на адрес и видим такую картину.
Базовый адрес, модуль + адрес. Затем адрес + смещение + смещение + смещение = стат. адрес нашей скорости. Перезайдя в игру и вновь подергав наш поинтер, если сделали все правильно, он будет давать и менять верное значение. Открываем сурс и начинаем шаманить функции. Создаем функцию:
C++:
#include "vars.h"
#include "../includes.h"
#include <vector>
#include <thread>
#include <chrono>
namespace funcs {
DWORD find_addr(uintptr_t ptr, std::vector<unsigned int> offsets) {
uintptr_t addr = ptr;
for (unsigned int i = 0; i < offsets.size(); ++i)
{
addr = *(uintptr_t*)addr;
addr += offsets[i];
}
return addr;
} // Функция для перебора смещений и получения стат. адреса
void speed_hack() {
DWORD module = (DWORD)GetModuleHandleA("GameAssembly.dll"); //получаем хендл модуля игры, работа с процессом не нужна, ведь мы и есть модуль игры
std::vector<unsigned int> speed_offsets = { 0x5C, 0x58, 0x14 }; //смещения
DWORD speed_addres = module + 0x1BB2D8C; //базовый адрес
DWORD speed_addr = find_addr(speed_addres, speed_offsets); //получаем стат. адрес
*(float*)speed_addr = player::speed; //записываем сразу напрямую, т.к мы в интернале и непосредственно являемся модулем игры.
}
}
Справа виден полный порядок получения адреса. Функция find_addr ищет статический адрес добавляя к нему смещения с помощью цикла, так что порядок в массиве тут непосредственно важен.
Создаем свои приколы для вызова функций, например:
C++:
namespace calls {
void call_function() {
if (player::impostor) {
funcs::impostor_hack();
}
if (player::crewmate) {
funcs::crewmate_hack();
}
if (player::ghost) {
funcs::ghost_hack();
}
if (player::cooldown) {
funcs::cooldown_hack();
}
if (player::speedhack) {
funcs::speed_hack();
}
}
}
Проверяем, видим что наша скорость изменилась после включения функции в меню. Profit!
По аналогии с данным методом ищем другие значения и делаем свои функции. Если что-то не понятно спрашиваем. На этом у меня всё, многое пришлось упустить да бы гайд не стал еще более огромным по своему содержанию, в будущем если будет желание расскажу все нюансы. Удачи!