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

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

в memory.hpp пихаем

Код:
Expand Collapse Copy
#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 добавляем
Код:
Expand Collapse Copy
#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:

Код:
Expand Collapse Copy
#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:

Код:
Expand Collapse Copy
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 не писать память много раз опишем структуру:
Код:
Expand Collapse Copy
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:
Первым делом давайте скроем саму консоль и для этого используем:
Код:
Expand Collapse Copy
ShowWindow(GetConsoleWindow(), SW_HIDE); // с помощью GetConsoleWindow() получаем указатель на консольное окно и при помощи ShowWindow его скрываем

Теперь получаем всю нужную нам информацию:
Код:
Expand Collapse Copy
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:
Код:
Expand Collapse Copy
void GlowThread()
{

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

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

ну и в конце функции добавляем
Код:
Expand Collapse Copy
return 0;

Теперь перейдем к объявленной функции GlowESP и начнем писать саму начинку:
Так же создадим там цикл
Код:
Expand Collapse Copy
while(!GetAsyncKeyState(VK_DELETE))
{

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

}
В нем нам нужно получить сначала игрока для этого используем
Код:
Expand Collapse Copy
uintptr_t entity = Mem->read<uintptr_t>(globals::clientModule + Offsets::dwEntityList + i * 0x10);
но игрока под номером i может и не быть, поэтому чтобы отсеять пустые слоты делаем простую проверку
Код:
Expand Collapse Copy
if (!entity)
    continue;
так же нам не нужно, чтобы glow применялся и на нас, поэтому немного изменим нашу проверку и получим вот это:
Код:
Expand Collapse Copy
if (!entity || globals::localplayer == entity)
    continue;
Дальше нам нужно получить GlowIndex игрока и его команду для этого снова читаем память
Код:
Expand Collapse Copy
int glowIndex = Mem->read<int>(entity + Netvars::m_iGlowIndex);
int entityTeam = Mem->read<int>(entity + Netvars::m_iTeamNum);

Создаем переменную
Код:
Expand Collapse Copy
GlowStruct Glow;
и читаем в нее память
Код:
Expand Collapse Copy
Glow = Mem->read<GlowStruct>(glowObject + (glowIndex * 0x38));
дальше делаем простую проверку на команду и устанавливаем нужные цвета:
Код:
Expand Collapse Copy
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 значения и записать измененную структуру в память игры
Код:
Expand Collapse Copy
Glow.renderWhenOccluded = true;
Glow.renderWhenUnoccluded = false;
Mem->write<GlowStruct>(glowObject + (glowIndex * 0x38), Glow);
и после цикла на всех игроков добавляем sleep на 1 мс, у нас же не компутеры для взлома пентагонов
Код:
Expand Collapse Copy
std::this_thread::sleep_for(1ms);
На этом все, подведем итоги:
Мы сделали простенький класс для чтения/записи памяти, сделали GlowESP с всего лишь одной записью памяти(все благодаря структуре), а не шестью, если бы мы записывали по отдельности, сделали отключение нашего чита по горячей клавише, на этом все, не болейте, ждите следующий урок, он наверное будет(пока не уверен, но если это вам зайдет - то продолжение точно будет!)
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
вопрос: зачем для глоу есп для новичков 2 потока?
 
вопрос: зачем для глоу есп для новичков 2 потока?
Я написал, что позже подвезу BHop и другие фишки, можешь прочитать тему, перед тем как задавать вопросы?
UPD: хм чоета
yS6XZ9mtRMyoQXs3jsm5Gw.png
 
Завтра сяду писать вторую часть, наверное подвезу класс dwClientState и класс для Entity
 
Привет. Можно файл готовый файл проекта? А то у меня куча ошибок всплывает, зх что делать.
 
Привет у меня почему то очень много ошибок . можешь помочь
 
Топ гайд, продолжай делать!
И сделай пж Trigger и Aimbot
 
Последнее редактирование:
Пожалуйста скинте готовый файл, посмотрю куда чё надо было, а то я плохо шарю
 
Сделай external aim, думаю интересно будет многим.
 
Бля, чувак, спасай мою жопу от сотни похотливых негров-даунов. Надо, чтобы около 8 функций выполнялось постоянно. В них и вх, и аим и прочая хуета. Как бы похуй, пусть выполняются последовательно, но sleep в одной функции тормозит нахуй весь чит. Сделал им всем detach, чит завершается с ошибкой 0xC0000005. Если сделать хоть одной функции join, то всё ок, но те функции перестают работать. Если в функции добавить while(true), то нихуя не меняется. Если делать detach этих функциий в while(true) в main, то чит превращается в гугл хром и начинает жрать как не в себя, завершаясь из-за утечки памяти. Как побороть эту хуйню? Да, я знаю, что умственно отсталый даунёнок, но бля, уже который день ебусь, и в рот я ебал C++ если честно, но оно мне надо.

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

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

А гайд охуенный. Симпу поставить не могу, т.к. даун нищий. Ссорь за эту хуету, но мозги уже кипят.
судя по описанию читать документацию не обучены)
 
Хороший гайд, надежный как швейцарские часы. Вначале хотя бы указывай библиотеки которые используешь. Еще вот например ошибки, которые показаны на пикчах из файла memory.cpp, и т.к. я относительно начинающий программер то разобраться с этим не могу
хуй.png

хуй2.png

(с pEntry.szExeFile тоже самое)

Еще желательно было бы если бы ты скидывал исходный код
 
как подключить cpp к
hpp
 
Последнее редактирование:
ТС забыл докинуть файл с оффсетами и нетварами. Но я сам справился)))))
ТС, можешь мне объяснить, в связи с чем пропадает прицел?
 
Сяб большое
 
Назад
Сверху Снизу