Гайд Написание External чита с нуля. Часть 1 - Glow ESP

Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
Всем привет, решил начать писать External софт на C++, буду учить вас и учиться вместе с вами, ибо раньше сидел только на интерналах.
Начнем с простенького Glow ESP.
Создаем консольное приложение и сразу создаем два файла - memory.cpp и memory.hpp.
В них будет храниться наш класс для работы с памятью игры.

в memory.hpp пихаем

Код:
#pragma once

class Memory
{
public:
    Memory();
    ~Memory();
    template <class value>
    value read(DWORD addr)
    {
        value x; // Создаем переменную, куда попадет полученное при чтении памяти значение
        ReadProcessMemory(handle, (LPBYTE*)addr, &x, sizeof(x), NULL); // Читаем из памяти процесса
        return x; // Возвращаем значение, полученное после чтения памяти
    }
    template <class value>
    void write(DWORD addr, value x)
    {
        WriteProcessMemory(handle, (LPBYTE*)addr, &x, sizeof(x), NULL); // Записываем в память процесса
    }

    uintptr_t GetProcess(const wchar_t*); // При помощи этой функции мы будем получать ID процесса
    uintptr_t GetModule(uintptr_t, const wchar_t*); // При помощи этой функции мы будем получать модуль процесса

private:
    HANDLE handle; // Ну и хэндл для чтения/записи памяти
};

extern Memory* Mem;
в memory.cpp добавляем
Код:
#include "memory.hpp"

Memory* mem = new Memory();

Memory::Memory()
{
    handle = NULL;
}

Memory::~Memory()
{
    CloseHandle(handle); // Закрываем наш хэндл
}

uintptr_t Memory::GetProcess(const wchar_t* procName)
{
    HANDLE hProcessId = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //Создаем snapshot всех запущенных в данный момент процессов
    uintptr_t process;
    PROCESSENTRY32 pEntry; // Переменная для хранения информации о процессе
    pEntry.dwSize = sizeof(pEntry);

    do
    {
        if (!_wcsicmp(pEntry.szExeFile, proc))
        {
            process = pEntry.th32ProcessID; // Получение ID процесса
            CloseHandle(hProcessId); // Закрываем хендл, который мы создавали в начале этой функции
            handle = OpenProcess(PROCESS_ALL_ACCESS, false, process); //Открываем наш хендл при помощи которого мы будем читать и писать память процесса
        }

    } while (Process32Next(hProcessId, &pEntry)); // Цикл для поиска процесса
    return process; //Возврат ID процесса
}

uintptr_t Memory::GetModule(uintptr_t procId, const wchar_t* modName) // Здесь все тоже самое, что и с процессами, повторно описывать не буду
{
    HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId);
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(mEntry);

    do
    {
        if (!_wcsicmp(mEntry.szModule, modName))
        {
            CloseHandle(hModule);
            return (uintptr_t)mEntry.hModule;
        }
    } while (Module32Next(hModule, &mEntry));
    return 0;
}
Итак, мы создали наш класс для управления памятью процесса, теперь добавим два файла globals.cpp и globals.hpp в которых будут храниться наши глобальные переменные. Фактически это будет просто namespace, можно обойтись без него, но мне так удобнее.

в globals.hpp:

Код:
#pragma once

namespace globals
{
    extern int            processID;      // Здесь будет храниться ID нашего процесса
    extern uintptr_t    clientModule;     // Здесь хранится адрес модуля client_panorama.dll
    extern uintptr_t    engineModule;     // Здесь будет храниться адрес модуля engine.dll (На будущее создал функцию!)

    extern uintptr_t    localplayer;    // Указатель на нашего персонажа
    extern uintptr_t    entitylist;        // Список entity
}
в globals.cpp:

Код:
namespace globals
{
    int            processID        = NULL;
    uintptr_t    clientModule    = NULL;
    uintptr_t    engineModule    = NULL;
    uintptr_t    localplayer        = NULL;
    uintptr_t    entitylist        = NULL;
}
Подключаем memory.hpp и globals.hpp к файлу main.cpp

Дальше чтобы, когда мы начали писать GlowESP не писать память много раз опишем структуру:
Код:
struct GlowStruct
{
    BYTE base[0x4]; //Пропускаем 4 байта
    float red; // Красный цвет
    float green; // Зеленый цвет
    float blue; // Синий цвет
    float alpha; // Прозрачность
    BYTE pad[0x10]; //Пропускаем 16 байтов
    bool renderWhenOccluded; // С этим пока не разобрался
    bool renderWhenUnoccluded; // С этим пока не разобрался
    bool fullBloom; // Заливка всей модельки
    BYTE pad1[0x5]; // Пропускаем 5 байтов
    int glowStyle; // Стиль Glow ESP
} Glow;
Описав структуру можем начать писать сам Glow ESP

Так как в чите будет не только Glow ESP, но и другие функции то вынесем GlowESP в отдельный поток, для этого нам нужно подключить к main.cpp инклуд <thread> и пропишем использование литералов из std::chrono_literals - using namespace std::chrono_literals;

Теперь действуем внутри функции main.cpp:
Первым делом давайте скроем саму консоль и для этого используем:
Код:
ShowWindow(GetConsoleWindow(), SW_HIDE); // с помощью GetConsoleWindow() получаем указатель на консольное окно и при помощи ShowWindow его скрываем
Теперь получаем всю нужную нам информацию:
Код:
globals::processID        = Mem->GetProcess(L"csgo.exe"); // ID процесса
    globals::clientModule    = Mem->GetModule(globals::processID, L"client_panorama.dll"); // Модуль client_panorama.dll

    while (!globals::localplayer)
        globals::localplayer = Mem->read<DWORD>(globals::clientModule + Offsets::dwLocalPlayer); // Указатель на нашего персонажа
Теперь объявим функцию для GlowESP:
Код:
void GlowThread()
{

}
И в эту функцию пока что ничего не добавляем, возвращаемся к main.cpp

Создаем и запускаем наш поток:
Код:
std::thread tGlow(GlowThread);
tGlow.detach();
С этим все просто
И создадим пока что пустой цикл(мы заполним его в будущем)
Код:
while (!GetAsyncKeyState(VK_DELETE)) // нужно, чтобы мы могли выключить наш чит по нажатии на клавишу DELETE
{
    std::this_thread::sleep_for(1ms);
}
ну и в конце функции добавляем
Код:
return 0;
Теперь перейдем к объявленной функции GlowESP и начнем писать саму начинку:
Так же создадим там цикл
Код:
while(!GetAsyncKeyState(VK_DELETE))
{

}
и начнем его заполнять:
сначала нам нужно получить GlowObjectManager для этого нам нужно прочитать память по определенному адресу, к счастью для вас есть hazedumper и все оффсеты(смещения) получить сможете вы там(надеюсь добавить отдельный файлик под них и просто переименовать неймспейсы каждый сможет), как мы будем получать GlowObjectManager? У нас для этого есть специальный класс, давайте им и воспользуемся:
Код:
uintptr_t glowObject = Mem->read<uintptr_t>(globals::clientModule + Offsets::dwGlowObjectManager);
и так же нам нужно получить нашу команду:
Код:
int localTeam = Mem->read<int>(globals::localplayer + Netvars::m_iTeamNum);
после этого создаем цикл на всех игроков:
Код:
for(BYTE i = 0; i < 64; i++)
{

}
В нем нам нужно получить сначала игрока для этого используем
Код:
uintptr_t entity = Mem->read<uintptr_t>(globals::clientModule + Offsets::dwEntityList + i * 0x10);
но игрока под номером i может и не быть, поэтому чтобы отсеять пустые слоты делаем простую проверку
Код:
if (!entity)
    continue;
так же нам не нужно, чтобы glow применялся и на нас, поэтому немного изменим нашу проверку и получим вот это:
Код:
if (!entity || globals::localplayer == entity)
    continue;
Дальше нам нужно получить GlowIndex игрока и его команду для этого снова читаем память
Код:
int glowIndex = Mem->read<int>(entity + Netvars::m_iGlowIndex);
int entityTeam = Mem->read<int>(entity + Netvars::m_iTeamNum);
Создаем переменную
Код:
GlowStruct Glow;
и читаем в нее память
Код:
Glow = Mem->read<GlowStruct>(glowObject + (glowIndex * 0x38));
дальше делаем простую проверку на команду и устанавливаем нужные цвета:
Код:
if (localTeam != entityTeam)
{
    Glow.red = 1.f;
    Glow.green = 0.f;
    Glow.blue = 0.f;
    Glow.alpha = 1.f;
}
else
{
    Glow.red = 0.f;
    Glow.green = 0.f;
    Glow.blue = 1.f;
    Glow.alpha = 1.f;
}
после этого нужно установить два bool значения и записать измененную структуру в память игры
Код:
Glow.renderWhenOccluded = true;
Glow.renderWhenUnoccluded = false;
Mem->write<GlowStruct>(glowObject + (glowIndex * 0x38), Glow);
и после цикла на всех игроков добавляем sleep на 1 мс, у нас же не компутеры для взлома пентагонов
Код:
std::this_thread::sleep_for(1ms);
На этом все, подведем итоги:
Мы сделали простенький класс для чтения/записи памяти, сделали GlowESP с всего лишь одной записью памяти(все благодаря структуре), а не шестью, если бы мы записывали по отдельности, сделали отключение нашего чита по горячей клавише, на этом все, не болейте, ждите следующий урок, он наверное будет(пока не уверен, но если это вам зайдет - то продолжение точно будет!)
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
вопрос: зачем для глоу есп для новичков 2 потока?
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
вопрос: зачем для глоу есп для новичков 2 потока?
Я написал, что позже подвезу BHop и другие фишки, можешь прочитать тему, перед тем как задавать вопросы?
UPD: хм чоета
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
Завтра сяду писать вторую часть, наверное подвезу класс dwClientState и класс для Entity
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2019
Сообщения
23
Реакции[?]
3
Поинты[?]
0
Привет. Можно файл готовый файл проекта? А то у меня куча ошибок всплывает, зх что делать.
 
Начинающий
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
49
Реакции[?]
2
Поинты[?]
0
Привет у меня почему то очень много ошибок . можешь помочь
 
Начинающий
Статус
Оффлайн
Регистрация
6 Янв 2019
Сообщения
30
Реакции[?]
1
Поинты[?]
0
Топ гайд, продолжай делать!
И сделай пж Trigger и Aimbot
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
24 Дек 2018
Сообщения
46
Реакции[?]
1
Поинты[?]
0
Пожалуйста скинте готовый файл, посмотрю куда чё надо было, а то я плохо шарю
 
Карликовая свинья
Пользователь
Статус
Оффлайн
Регистрация
5 Ноя 2018
Сообщения
125
Реакции[?]
34
Поинты[?]
0
Бля, чувак, спасай мою жопу от сотни похотливых негров-даунов. Надо, чтобы около 8 функций выполнялось постоянно. В них и вх, и аим и прочая хуета. Как бы похуй, пусть выполняются последовательно, но sleep в одной функции тормозит нахуй весь чит. Сделал им всем detach, чит завершается с ошибкой 0xC0000005. Если сделать хоть одной функции join, то всё ок, но те функции перестают работать. Если в функции добавить while(true), то нихуя не меняется. Если делать detach этих функциий в while(true) в main, то чит превращается в гугл хром и начинает жрать как не в себя, завершаясь из-за утечки памяти. Как побороть эту хуйню? Да, я знаю, что умственно отсталый даунёнок, но бля, уже который день ебусь, и в рот я ебал C++ если честно, но оно мне надо.

А гайд охуенный. Симпу поставить не могу, т.к. даун нищий. Ссорь за эту хуету, но мозги уже кипят.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
6 Янв 2019
Сообщения
30
Реакции[?]
1
Поинты[?]
0
Бля, чувак, спасай мою жопу от сотни похотливых негров-даунов. Надо, чтобы около 8 функций выполнялось постоянно. В них и вх, и аим и прочая хуета. Как бы похуй, пусть выполняются последовательно, но sleep в одной функции тормозит нахуй весь чит. Сделал им всем detach, чит завершается с ошибкой 0xC0000005. Если сделать хоть одной функции join, то всё ок, но те функции перестают работать. Если в функции добавить while(true), то нихуя не меняется. Если делать detach этих функциий в while(true) в main, то чит превращается в гугл хром и начинает жрать как не в себя, завершаясь из-за утечки памяти. Как побороть эту хуйню? Да, я знаю, что умственно отсталый даунёнок, но бля, уже который день ебусь, и в рот я ебал C++ если честно, но оно мне надо.

А гайд охуенный. Симпу поставить не могу, т.к. даун нищий. Ссорь за эту хуету, но мозги уже кипят.
Засунь все функции в while(true) в main и в цикл while где нибудь Sleep(5) поставь
Сори если хуету написал, я сам не оч шарю, но по твоему описанию такое решение вроде должно работать, мб я неправильно понял
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Бля, чувак, спасай мою жопу от сотни похотливых негров-даунов. Надо, чтобы около 8 функций выполнялось постоянно. В них и вх, и аим и прочая хуета. Как бы похуй, пусть выполняются последовательно, но sleep в одной функции тормозит нахуй весь чит. Сделал им всем detach, чит завершается с ошибкой 0xC0000005. Если сделать хоть одной функции join, то всё ок, но те функции перестают работать. Если в функции добавить while(true), то нихуя не меняется. Если делать detach этих функциий в while(true) в main, то чит превращается в гугл хром и начинает жрать как не в себя, завершаясь из-за утечки памяти. Как побороть эту хуйню? Да, я знаю, что умственно отсталый даунёнок, но бля, уже который день ебусь, и в рот я ебал C++ если честно, но оно мне надо.

А гайд охуенный. Симпу поставить не могу, т.к. даун нищий. Ссорь за эту хуету, но мозги уже кипят.
судя по описанию читать документацию не обучены)
 
Начинающий
Статус
Оффлайн
Регистрация
1 Мар 2019
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Хороший гайд, надежный как швейцарские часы. Вначале хотя бы указывай библиотеки которые используешь. Еще вот например ошибки, которые показаны на пикчах из файла memory.cpp, и т.к. я относительно начинающий программер то разобраться с этим не могу
хуй.png
хуй2.png
(с pEntry.szExeFile тоже самое)

Еще желательно было бы если бы ты скидывал исходный код
 
Начинающий
Статус
Оффлайн
Регистрация
1 Мар 2019
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2017
Сообщения
52
Реакции[?]
6
Поинты[?]
0
ТС забыл докинуть файл с оффсетами и нетварами. Но я сам справился)))))
ТС, можешь мне объяснить, в связи с чем пропадает прицел?
 
Сверху Снизу