Загрузка...

GUIDE: HOW TO MAKE A WALLHACK (ESP) FOR CS:GO IN C++

Thread in C/C++ created by a1987zz May 21, 2020. (bumped May 19, 2020) 6890 views

  1. a1987zz
    a1987zz Topic starter May 21, 2020 11 Apr 7, 2020
    Всем привет! Решил написать свой собственный ГАЙД для Glow ESP. Сегодня вас научу (покажу), как создать свой собственный ESP, он же WallHack.
    Если что не понятно - спрашивайте.

    1. Открываем Visual Studio Community 2019 и создаем консольное приложение, называем как угодно.

    Рис. 1.
    [IMG]

    Рис. 2.
    [IMG]

    2. Далее открываем настройки проекта и устанавливаем так, как показано на рисунках Рис. 3, Рис. 4.
    Важно: проект должен быть установлен как Release x86.

    Рис. 3.
    [IMG]

    Рис. 4.
    [IMG]

    Рис. 5.
    [IMG]

    3. Собственно, сам код.

    C

    #include <windows.h>
    #include <TlHelp32.h>
    #include <iostream>

    typedef unsigned char uint8_t; // тут определенно uint8_t как unsigned char

    template <typename T, size_t N>

    size_t countof(T(&array)[N])
    {
    return N;
    }

    DWORD dwLocalPlayer; //will be scanned
    DWORD dwEntityList; //will be scanned
    DWORD dwGlow; //will be scanned

    DWORD dwTeam = 0xF4;
    DWORD dwDormant = 0xED;

    struct PModule
    {
    DWORD dwBase;
    DWORD dwSize;
    };

    /* Debugger/Process API implementation class */
    class process
    {

    public:
    bool Attach(const char* pName, DWORD rights)
    {
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, '\0');
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(entry);

    do
    if (!strcmp(entry.szExeFile, pName)) {
    pID = entry.th32ProcessID;
    CloseHandle(handle);
    _process = OpenProcess(rights, false, pID);
    return true;
    }
    while (Process32Next(handle, &entry));
    return false;
    }

    PModule GetModule(const char* moduleName) {
    HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID);
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(mEntry);

    do {
    if (!strcmp(mEntry.szModule, (LPSTR)moduleName)) {
    CloseHandle(module);

    PModule mod = { (DWORD)mEntry.hModule, mEntry.modBaseSize };
    return mod;
    }
    } while (Module32Next(module, &mEntry));

    PModule mod = { (DWORD)false, (DWORD)false };
    return mod;
    }

    template <class T>
    T Read(DWORD addr) {
    T _read;
    ReadProcessMemory(_process, (LPVOID)addr, &_read, sizeof(T), NULL);
    return _read;
    }
    template <class T>
    void Write(DWORD addr, T val) {
    WriteProcessMemory(_process, (LPVOID)addr, &val, sizeof(T), NULL);
    }

    DWORD FindPattern(DWORD start, DWORD size, const char* sig, const char* mask) {
    BYTE* data = new BYTE[size];

    unsigned long bytesRead;
    if (!ReadProcessMemory(_process, (LPVOID)start, data, size, &bytesRead)) {
    return '\0';
    }

    for (DWORD i = 0; i < size; i++) {
    if (DataCompare((const BYTE*)(data + i), (const BYTE*)sig, mask)) {
    return start + i;
    }
    }
    return '\0';
    }

    DWORD FindPatternArray(DWORD start, DWORD size, const char* mask, int count, ...) {
    char* sig = new char[count + 1];
    va_list ap;
    va_start(ap, count);
    for (int i = 0; i < count; i++) {
    char read = va_arg(ap, int);
    sig[i] = read;
    }
    va_end(ap);
    sig[count] = '\0';
    return FindPattern(start, size, sig, mask);
    }


    private:
    HANDLE _process;
    DWORD pID;
    bool DataCompare(const BYTE* pData, const BYTE* pMask, const char* pszMask) {
    for (; *pszMask; ++pszMask, ++pData, ++pMask) {
    if (*pszMask == 'x' && *pData != *pMask) {
    return false;
    }
    }
    return (*pszMask == 0); // == 0 - это NULL бывшее. 0 работает в dev-cpp только
    }
    };

    /* New Glow Object structure in csgo */
    struct glow_t
    {
    char pad_0000[8]; //0x0000
    float r;
    float g;
    float b;
    float a;
    char pad_0018[16]; //0x0018
    bool renderOccluded; //0x0028
    bool renderUnoccluded; //0x0029
    };

    //struct glow_t
    //{
    // DWORD dwBase;
    // float r;
    // float g;
    // float b;
    // float a;
    // uint8_t unk1[16];
    // bool m_bRenderWhenOccluded;
    // bool m_bRenderWhenUnoccluded;
    // bool m_bFullBloom;
    // uint8_t unk2[14];
    //};


    /* Entity structure in csgo */
    struct Entity
    {
    DWORD dwBase;
    int team;
    bool is_dormant;
    };

    /* Player structure in csgo */
    struct Player
    {
    int dwBase;
    bool isDormant;
    };

    process memory;
    process _modClient;
    process* mem;
    PModule modClient;

    int iFriendlies;
    int iEnemies;

    Entity entEnemies[32];
    Entity entFriendlies[32];
    Entity me;

    void update_entity_data(Entity* e, DWORD dwBase)
    {
    int dormant = memory.Read<int>(dwBase + dwDormant);
    e->dwBase = dwBase;
    e->team = memory.Read<int>(dwBase + dwTeam);
    e->is_dormant = dormant == 1;
    }

    /* Get Pointer To Client.dll*/

    PModule* GetClientModule() {
    if (modClient.dwBase == 0 && modClient.dwSize == 0) {
    modClient = memory.GetModule("client.dll");
    }
    return &modClient;
    }

    Entity* GetEntityByBase(DWORD dwBase) {

    for (int i = 0; i < iFriendlies; i++) {
    if (dwBase == entFriendlies[i].dwBase) {
    return &entFriendlies[i];
    }
    }
    for (int i = 0; i < iEnemies; i++) {
    if (dwBase == entEnemies[i].dwBase) {
    return &entEnemies[i];
    }
    }
    return nullptr;
    }

    /* offset updating class, that uses patterns to find memory addresses */
    class offset
    {
    private:
    static void update_local_player() {
    DWORD lpStart = mem->FindPatternArray(modClient.dwBase, modClient.dwSize, "xxx????xx????xxxxx?", 19, 0x8D, 0x34, 0x85, 0x0, 0x0, 0x0, 0x0, 0x89, 0x15, 0x0, 0x0, 0x0, 0x0, 0x8B, 0x41, 0x8, 0x8B, 0x48, 0x0);
    DWORD lpP1 = memory.Read<DWORD>(lpStart + 3);
    BYTE lpP2 = mem->Read<BYTE>(lpStart + 18);
    dwLocalPlayer = (lpP1 + lpP2) - modClient.dwBase;
    }

    static void update_entity_list() {
    DWORD elStart = mem->FindPatternArray(modClient.dwBase, modClient.dwSize, "x????xx?xxx", 11, 0x5, 0x0, 0x0, 0x0, 0x0, 0xC1, 0xE9, 0x0, 0x39, 0x48, 0x4);
    DWORD elP1 = mem->Read<DWORD>(elStart + 1);
    BYTE elP2 = mem->Read<BYTE>(elStart + 7);
    dwEntityList = (elP1 + elP2) - modClient.dwBase;
    }

    static void update_glow() {
    DWORD gpStart = mem->FindPatternArray(modClient.dwBase, modClient.dwSize, "xxx????xxxxx????????", 20, 0x0F, 0x11, 0x05, 0x0, 0x0, 0x0, 0x0, 0x83, 0xC8, 0x01, 0xC7, 0x05, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
    dwGlow = mem->Read<DWORD>(gpStart + 3) - modClient.dwBase;
    }

    public:
    static void get_offset(process* m) {
    mem = m;
    modClient = mem->GetModule("client.dll");
    update_local_player();
    update_entity_list();
    update_glow();
    }

    //constantly scanning & updating our offsets
    static DWORD WINAPI scan_offsets(LPVOID PARAM)
    {
    Entity players[64];
    while (true) {
    Sleep(1);
    DWORD playerBase = memory.Read<DWORD>(GetClientModule()->dwBase + dwLocalPlayer);
    int cp = 0;

    update_entity_data(&me, playerBase);
    for (int i = 1; i < 64; i++) {
    DWORD entBase = memory.Read<DWORD>((GetClientModule()->dwBase + dwEntityList) + i * 0x10);

    if (entBase == 0)
    continue;

    update_entity_data(&players[cp], entBase);

    cp++;
    }

    int cf = 0, ce = 0;

    for (int i = 0; i < cp; i++) {
    if (players[i].team == me.team) {
    entFriendlies[cf] = players[i];
    cf++;
    }
    else {
    entEnemies[ce] = players[i];
    ce++;
    }
    }

    iEnemies = ce;
    iFriendlies = cf;
    }
    }
    };

    class virtualesp
    {
    private:
    static void glow_player(DWORD mObj, float r, float g, float b)
    {
    memory.Write<float>(mObj + 0x8, r);
    memory.Write<float>(mObj + 0xC, g);
    memory.Write<float>(mObj + 0x10, b);
    memory.Write<float>(mObj + 0x14, 1.0f);
    memory.Write<int>(mObj + 0x28, 1);
    }
    /* memory.Write<float>(mObj + 0x4, r);
    memory.Write<float>(mObj + 0x8, g);
    memory.Write<float>(mObj + 0xC, b);
    memory.Write<float>(mObj + 0x10, 1.0f);
    memory.Write<BOOL>(mObj + 0x24, true);
    memory.Write<BOOL>(mObj + 0x25, false);*/

    static float SanitizeColor(int value)
    {
    if (value > 255) value = 255;
    if (value < 0) value = 0;
    return (float)value / 255;
    }
    public:
    static void start_engine() {
    while (!memory.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {
    Sleep(100);
    }
    do {
    Sleep(1000);
    offset::get_offset(&memory);
    } while (dwLocalPlayer < 65535);
    CreateThread('\0', '\0', &offset::scan_offsets, '\0', '\0', '\0'); // '\0' - это NULL
    }

    static unsigned long __stdcall esp_thread(void*)
    {
    int objectCount;
    DWORD pointerToGlow;
    Entity* Player = NULL;
    float Friend = SanitizeColor(600);
    float Enemy = SanitizeColor(614);

    while (true)
    {
    Sleep(1);
    pointerToGlow = memory.Read<DWORD>(GetClientModule()->dwBase + dwGlow);
    objectCount = memory.Read<DWORD>(GetClientModule()->dwBase + dwGlow + 0x4);
    /* std::cout << objectCount << std::endl;*/
    /* std::cout << sizeof(glow_t) << std::endl;*/
    if (pointerToGlow != 0 && objectCount > 0)
    {
    for (int i = 0; i < objectCount; i++)
    {
    DWORD mObj = pointerToGlow + i * 0x38; //читает из памяти размер sizeof(glow_t)

    glow_t glowObject = memory.Read<glow_t>(mObj);
    // int glowObject = memory.Read<int>(GetClientModule()->dwBase + 0x5320758);
    Player = GetEntityByBase(glowObject.dwBase);
    // dtd::cout << Player->dwBase << std::endl;

    //if (glowObject.dwBase == 0 || Player == nullptr || Player->is_dormant) {
    // continue;
    //}
    if (me.team == 2) { // тут должна быть проверка Player->dwBase я ее не добавлял, нихочу разбираться.
    glow_player(mObj, 0, 0, Friend);
    }
    else {
    glow_player(mObj, Enemy, 0, 0);
    }
    }
    }
    }

    return EXIT_SUCCESS;
    }
    };

    int main()
    {
    SetConsoleTitle("GlowESP by (Your credentionals)");
    bool enabled = false;
    HANDLE ESP = NULL;

    virtualesp::start_engine();

    std::cout << "Game found, starting GlowESP!" << std::endl;
    Sleep(400);
    std::cout << "Press F1 to toggle GlowESP." << std::endl;
    while (TRUE)
    {
    Sleep(100);
    if (GetAsyncKeyState(VK_F1) & 1) {
    enabled = !enabled;
    if (enabled) {
    std::cout << "Glow: Enabled" << std::endl;
    ESP = CreateThread('\0', '\0', &virtualesp::esp_thread, '\0', '\0', '\0');
    }
    else {
    std::cout << "Glow: Disabled" << std::endl;
    TerminateThread(ESP, 0);
    CloseHandle(ESP);
    }
    }
    }
    }
    4. Далее собираем проект. Жмем сочетание клавиш «CTRL+SHIFT+B».
    5. Идем в расположение проекта, указанного на Рис. 2. (у вас будет свой путь). Находим там папку "Release" (их в проекте будет две, нужно открыть самую первую), там, собственно, и находится наш exe файл.
    6. Запускаем игру.
    7. Запускаем наш экзешник от имени администратора или обычного пользователя.
    8. F2 Вкл/Выкл программы.
    9. Радуемся, что все работает!

    Поздравляю! Вы написали свой собственный ESP!

    Если что не понятно, то вот готовый экзешник: https://cloud.mail.ru/public/4kHm/Ko1HY8zSJ
    Ссылка на virustotal: https://www.virustotal.com/gui/file...fd8f2936cd7539ac1d5af4f5e93491c3fe3/detection
     
  2. NUR_Design
    NUR_Design May 21, 2020 Всех люблю) 311 Apr 28, 2018
    Нихуя не понял, но очень интересно:despair:
     
    1. a1987zz Topic starter
      NeonCyKa, написано же, если не понятно, качаем готовый экзешник. :finger_up:
  3. Nordia
    Объяснять ничего не буду, т.к. тема не для этого.:orehus:
     
  4. ФСО
    ФСО May 31, 2020 Продам статус хых 245 Nov 22, 2019
    Ток седня начал изучать C++ и понял что тут интересно, но сложна :D
     
  5. kardan35
    kardan35 Jun 3, 2020 1 Dec 7, 2019
    Можно и комментировать строки !
     
  6. Davinci
    Нихуя не понял но очень интересно
     
  7. Quadro_inactive3261035
    Quadro_inactive3261035 Jun 3, 2020 Banned 44 May 15, 2020
    а потом бан , класс
     
  8. CLOWNSQUAD
    CLOWNSQUAD Jun 3, 2020 Banned 104 May 12, 2020
    Зачем это публиковать в 2021
     
    1. kardan35
      CLOWNSQUAD, мало инфы по c++ на хак форумах!
      когда учишь c++ и выходишь на какой то уровень и в этот момент понимаешь что плюсы сильно недооценивают !
      хотя для хак сферы плюсы самые лучшие .
      но по теме создания софта по хак очень мало тем более расписанных .
      автору респект
  9. timoxa20102010_inactive12054
    да автору респект тоже начел учить с++
     
  10. 0deleted0
    0deleted0 Jul 8, 2020 1000-7? 817 Jan 8, 2017
    Так ты же просто сурсы выложил получается
     
    1. a1987zz Topic starter
      Могу объяснить все строчки этого кода если нужно:finger_up:
  11. id327576231
    Дай свой вк
    The post was merged to previous Jul 9, 2020
    У меня вопросов много
    The post was merged to previous Jul 9, 2020
    пж
     
    1. a1987zz Topic starter
      id327576231, смысл в том, что я написал гайд, зачем мне видео еще записывать? Планирую еще писать гайды, но не видео. Если есть вопросы, пиши сюда.
    2. id327576231
      a1987zz, Хорошо мне с тобой приятно общаться!
  12. artmfdg
    artmfdg Feb 20, 2021 113 Jan 17, 2019
    полная хуйня.
    гайд -- скинул готовый код, ничего не объяснив.
    желаю научится автору отличать float от double
     
    1. a1987zz Topic starter
      artmfdg, я объяснил для народа, который "врубается" в Си. И мне делать н..уй объяснять каждую строчку, когда все гуглится.
    2. a1987zz Topic starter
      float 32 битное число, double 64 битное и что? Может сам объяснишь тогда. Все компилируется в 32 бит.
  13. savagegod0
    savagegod0 May 19, 2022 0 Jan 28, 2021
    не работает чета
     
  14. Bunnyscript
    Как-то криво пофиксил. Там все сбилось, нужно разбираться.

    [IMG]
     
  15. Menatalitet
    Интересно спасибо
     
  16. hayk4500
    hayk4500 Jun 1, 2022 1 Mar 16, 2018
    А смысл просто кода без объяснений и вообще понимания этого кода? Это просто копипаста, это не программирование, это не кодерство и даже не написание своего чита, это просто копипаста
     
  17. unnamed001
    unnamed001 Jun 5, 2022 5996 Sep 2, 2020
    за такие приколы с прямым измение памяти ты будешь попадатся тоже с читерами)
     
    1. densetsukun
      unnamed001, Это человек научился пользоваться гитхабом, копировать код и компилировать=) за последнее конечно респект
  18. a1987zz
    a1987zz Topic starter Jun 10, 2022 11 Apr 7, 2020
    Добавил исходник под dev-cpp компилировал экзешник там же, проще было фиксить ошибки, под vs не проверял. Я не стал заморачиваться с esp. Код сырой, работает. Что непонятно спрашивайте, постараюсь ответить. Для работы чита нужно отключить антивирус и защитник виндовс.
     
  19. Vlevent
    Vlevent Aug 26, 2022 0 Jan 20, 2022
    сработает на игры кроме CS:GO? Например, игра Stalcraft, слышал игра сделана на Java, этот чит сработает с ней?
     
  20. Yukki01
    Yukki01 Aug 28, 2022 0 Aug 22, 2022
    Vlevent, на java нет. Java совсем другой движок.
     
Loading...
Top