Гайд Создаем свой первый CSGO чит

Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Привет, сегодня мы создадим наш первый External-чит для ксго. Создавать мы будем вх, так как вх - идеален, чтобы рассматривать его как основу. Я постараюсь расписать все максимально понятно и по шагам, чтобы вы поняли как что работает, а не просто спастили код и ничему не научились.
Итак, приступим.
1. Создаем простой C++ проект в Visual Studio.
2. Создаем файл main.cpp, здесь и будет весь наш код.
3. Пишем в начало файла следующий код:
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <thread>
здесь мы подключили нужные библиотеки для работы, если у вас какой-то нет, то скачайте или подключите через параметры проекта (можете посмотреть в интернете уроки, если не знаете, как это делать, их полно).
4. Теперь самое время сделать переменные с оффсетами. Почему именно переменные? Да потому что их легко обновлять, и не нужно лазить по всему коду и вспоминать, какой оффсет для чего и где.
C++:
const DWORD dwLocalPlayer = 0xCBD6A4;
const DWORD dwEntityList = 0x4CCDCBC;
const DWORD m_iTeamNum = 0xF4;
const DWORD m_iGlowIndex = 0xA3F8;
const DWORD dwGlowObjectManager = 0x520DAE0;
разберем каждое ключевое слово в коде:
const - мы делаем именно константы (не переменные), чтобы им нельзя было присвоить другие значения, кроме тех, которые мы уже задали.
DWORD - класс. Переменные имеют тип экземляра именно класса DWORD.
5. Сейчас мы определим переменные, с которыми мы будем работать на протяжении всего написания чита.
C++:
HANDLE process; // непосредственно сам процесс CSGO
DWORD clientBase; // это короче для работы с client_panorama.dll
DWORD engineBase; // это короче для работы с engine.dll
Мы объявили необходимые переменные, комментарии, обозначающие "что зачем и почему" я написал в самом коде.
6. Что же, теперь приступим к написанию нашего чита непосредственно.
Первое, что нам нужно - это возможность включать или выключать те или иные функции (в нашем случае - вх).
Если вы подумали о переменной типа boolean, определяющей статус функции - вы правы.
C++:
bool wh = false;
Мы объявили переменную, которая определяет статус функции, по умолчание вх выключено, значит значение переменной false.
7. Так как мы создаем External-чит, нам нужно читать память и изменять ее.
Добавим следующий код, необходимый нашему читу. Что и зачем расскажу по ходу дела.
C++:
DWORD getModuleBaseAddress(DWORD pid, const char* name)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(MODULEENTRY32);
    do
    {
        if (!strcmp(mEntry.szModule, name))
        {
            CloseHandle(snapshot);
            return (DWORD)mEntry.modBaseAddr;
        }
    } while (Module32Next(snapshot, &mEntry));
}
данный код находит в нашей оперативной памяти именно то приложение, которое нам нужно (по его id - pid, который передается функции).
C++:
template <typename T>
T readMem(DWORD address)
{
    T buffer;
    ReadProcessMemory(process, (LPVOID)address, &buffer, sizeof(buffer), 0);
    return buffer;
}

template <typename T>
void writeMem(DWORD address, T value)
{
    WriteProcessMemory(process, (LPVOID)address, &value, sizeof(value), 0);
}
эти стандартные функции читают и пишут память, именно с помощью них мы будем взаимодействовать с игрой.
8. Теперь создадим входную точку, без которой не будет работать ни одно приложение C++. Это int main().
C++:
int main() {

    SetConsoleTitle("Top non-pasted shit 1337"); // устанавливаем заголовок нашей консоли
 
    std::cout << "Open CS:GO\n"; // выводим в консоль сообщение о том, что надо открыть ксго
 
    HWND hwnd;
 
        do {
            hwnd = FindWindowA(0, "Counter-Strike: Global Offensive"); // ищем ксго, если находим - выходим из цикла
            Sleep(50); // таймаут (чтобы не грузить процессор)
        } while (!hwnd);

        DWORD pid;
        GetWindowThreadProcessId(hwnd, &pid); // получаем id приложения
        process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // заходим в кс го его id

        std::cout << "Csgo started, pid " << pid << ".\n"; // выводим сообщение о том, что ксго запущена

        do {
            clientBase = getModuleBaseAddress(pid, "client_panorama.dll"); // ищем клиент кс го
            Sleep(50);
        } while (!clientBase);

        do {
            engineBase = getModuleBaseAddress(pid, "engine.dll"); // ищем движок кс го
            Sleep(50);
        } while (!engineBase);

}
весь код с комментариями, его нам еще придется обновлять. Что мы в нем сделали? Мы нашли ксго, интегрировали чит с игрой, получили необходимые базы (клиент и движок).
9. Теперь пора создать сам вх. Создадим метод (пусть будет wallhack())
C++:
void wallhack()
{
    while (true) // создаем бесконечный цикл
    {
        Sleep(10); // таймаут 10 мс, чтобы не грузить процессор под 100
        if (!wallhack && !readMem<DWORD>(readMem<DWORD>(clientBase + dwLocalPlayer) + 0xED)) // если вх выключено или не удается прочитать память - выходим из цикла
            continue;

        DWORD glowObj = readMem<DWORD>(clientBase + dwGlowObjectManager); // создаем объект glowObj из модельки игрока
        DWORD myTeam = readMem<DWORD>(readMem<DWORD>(clientBase + dwLocalPlayer) + m_iTeamNum); // создаем объект тиммейтов

        for (int x = 0; x < 32; x++) // сам вх
        {
            DWORD player = readMem<DWORD>(clientBase + dwEntityList + x * 0x10); // обычный игрок
            if (player == 0)
                continue;

            bool dormant = readMem<bool>(player + 0xED); // спектатор
            if (dormant)
                continue;

            DWORD team = readMem<DWORD>(player + m_iTeamNum); // тиммейт
            if (team != 2 && team != 3)
                continue;

            DWORD currentGlowIndex = readMem<DWORD>(player + m_iGlowIndex); // текущий индекс игрока

            if (team != myTeam) // если игрок не тиммейт
            {
                // делаем его обводку красным
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x4, 255); // red
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x8, 0); // green
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0xC, 0); // blue
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x10, 255);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x24, true);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x25, false);
            }
            else // если игрок тиммейт
            {
                // делаем его обводку синим
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x4, 0); // red
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x8, 0); // green
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0xC, 255); // blue
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x10, 255);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x24, true);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x25, false);
            }
        }
    }
}
10. Теперь нам нужно где-то вызывать наш метод. Конечно же в main()!
Теперь вызовем наш метод:
std::thread whThread(wallhack)
И создадим в нашем главном методе бесконечный цикл.
Код:
while(true)
{

    if (GetAsyncKeyState(VK_F9)) // если нажали f9
    {
 
        wh = !wh; // заменяем значение переменной на противоположное
        if (wh)
            std::cout("wh: on\n"); // если wallhack - true, то пишем, что вх включен
        else
            std::cout("wh: off\n"); // иначе пишем, что вх выключен
         
        Sleep(100); // таймаут, чтобы сбросить нагрузку
 
    }

}
Вроде все, спасибо за внимание :roflanPominki::roflanEbalo:
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
эм рофлан, мб оффсеты не обновлены и есть лишние, я брал их "наобум"
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Что на счет детекта? Как VAC детектит читы и что делать если твой чит детект? И насколько трудно обойти VAC полностью и делал ли это кто-то?
 
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что на счет детекта? Как VAC детектит читы и что делать если твой чит детект? И насколько трудно обойти VAC полностью и делал ли это кто-то?
вак детектит по-разному. например, часто читы отлетают из-за того, что инжектор спалили, также бывает палят читы, которые внедряются в игру. external-чит в этом имеет небольшое преимущество - он не внедряется в игру, а работает как бы отдельно.
полностью обойти вак (если ты имеешь в виду снизить шанс бана до 0%) - невозможно, но можно максимально снизить этот шанс.
как вариант, можно постоянно обновлять чит (добавлять джанки, изменять названия переменных).
 
Участник
Статус
Оффлайн
Регистрация
4 Авг 2017
Сообщения
463
Реакции[?]
212
Поинты[?]
0
Код - говно. Вроде гайд для новичков, а вложенностей дохуя, циклы некоторые безграмотно составлены, в общем это не гайд, а вредные советы:roflanEbalo:
 
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код - говно. Вроде гайд для новичков, а вложенностей дохуя, циклы некоторые безграмотно составлены, в общем это не гайд, а вредные советы:roflanEbalo:
например про какие циклы ты говоришь? вложенности потому что не хочется чит с одним вх делить на кучу файлов. те, кому надо разделят сами
 
error
Начинающий
Статус
Оффлайн
Регистрация
28 Июн 2017
Сообщения
97
Реакции[?]
25
Поинты[?]
0
Коментарии по коду:
Про офсеты сам писал что просто натыкал, ну я всё же лишнее тебе убрал, и обновил.

Код:
const DWORD    dwLocalPlayer = 0xCBD6A4;
const DWORD dwEntityList = 0x4CCDCBC;
const DWORD m_iTeamNum = 0xF4;
const DWORD m_iGlowIndex = 0xA3F8;
const DWORD dwGlowObjectManager = 0x520DAE0;
Потом название индикатора включения: bool wallhack; и самой функции одинаковое void wallhack();

Адрес на engine.dll тебе не нужен сноси тоже

Потом по main();

первая инструкция SetLocal лучше заменить на
Код:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
После второй инструкции забыл точку с запятой
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
вак детектит по-разному. например, часто читы отлетают из-за того, что инжектор спалили, также бывает палят читы, которые внедряются в игру. external-чит в этом имеет небольшое преимущество - он не внедряется в игру, а работает как бы отдельно.
полностью обойти вак (если ты имеешь в виду снизить шанс бана до 0%) - невозможно, но можно максимально снизить этот шанс.
как вариант, можно постоянно обновлять чит (добавлять джанки, изменять названия переменных).
Почему обойти полностью невозможно?
Если сам VAC в файлах игры, а он в файлах игры - то возможно.
Пропатчить и вырезать античит, я слышал, что такое уже кто то делал. Или я ошибся на счет всего этого?
А так же, на счет инжектора. Можно поподробней как детектят инжектор, ведь он то сам в игру не внедряется, понятия не имею как можно спалить инжектор.
Если ты знаешь сам принцип детекта - то расскажи).
А так же, на счет того как палят готовые читы. Что такое джанки? И как названия переменных влияют на скомпилированный файл, ведь, на сколько мне известно, в скомпилированном файле нет названий переменных(если, конечно, в настройках проекта не включена отладочная информация) и названия переменных, классов и т.п не должны влиять на выходной файл.
 
error
Начинающий
Статус
Оффлайн
Регистрация
28 Июн 2017
Сообщения
97
Реакции[?]
25
Поинты[?]
0
Почему обойти полностью невозможно?
Если сам VAC в файлах игры, а он в файлах игры - то возможно.
Пропатчить и вырезать античит, я слышал, что такое уже кто то делал. Или я ошибся на счет всего этого?
А так же, на счет инжектора. Можно поподробней как детектят инжектор, ведь он то сам в игру не внедряется, понятия не имею как можно спалить инжектор.
Если ты знаешь сам принцип детекта - то расскажи).
А так же, на счет того как палят готовые читы. Что такое джанки? И как названия переменных влияют на скомпилированный файл, ведь, на сколько мне известно, в скомпилированном файле нет названий переменных(если, конечно, в настройках проекта не включена отладочная информация) и названия переменных, классов и т.п не должны влиять на выходной файл.

Создание потока = нарушение памяти игры


Полный обход вака, что насчёт механического чтения памяти. Без записи в память.
 
Сладкий, как каракум, весельчак, балагур
Забаненный
Статус
Оффлайн
Регистрация
8 Фев 2018
Сообщения
259
Реакции[?]
39
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
когда хотел научить, но учат тебя
Коментарии по коду:
Про офсеты сам писал что просто натыкал, ну я всё же лишнее тебе убрал, и обновил.

Код:
const DWORD    dwLocalPlayer = 0xCBD6A4;
const DWORD dwEntityList = 0x4CCDCBC;
const DWORD m_iTeamNum = 0xF4;
const DWORD m_iGlowIndex = 0xA3F8;
const DWORD dwGlowObjectManager = 0x520DAE0;
Потом название индикатора включения: bool wallhack; и самой функции одинаковое void wallhack();

Адрес на engine.dll тебе не нужен сноси тоже

Потом по main();

первая инструкция SetLocal лучше заменить на
Код:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
После второй инструкции забыл точку с запятой
 
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
когда хотел научить, но учат тебя
к чему твой спич? я сейчас не дома, нет idle под рукой => я не могу проверить код. к исправлениям и обоснованной критике отношусь крайне положительно
 
error
Начинающий
Статус
Оффлайн
Регистрация
28 Июн 2017
Сообщения
97
Реакции[?]
25
Поинты[?]
0
Полный код:
Убрал поток, лишние куски кода которые не использовались
Добавил VK_DELETE = return;
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

const DWORD    dwLocalPlayer = 0xCBD6A4;
const DWORD dwEntityList = 0x4CCDCBC;
const DWORD m_iTeamNum = 0xF4;
const DWORD m_iGlowIndex = 0xA3F8;
const DWORD dwGlowObjectManager = 0x520DAE0;

HANDLE        process = NULL; // непосредственно сам процесс CSGO
DWORD        clientBase = NULL; // клиентская часть

DWORD getModuleBaseAddress(DWORD pid, const char* name)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(MODULEENTRY32);
    do
    {
        if (!strcmp(mEntry.szModule, name))
        {
            CloseHandle(snapshot);
            return (DWORD)mEntry.modBaseAddr;
        }
    } while (Module32Next(snapshot, &mEntry));
}
template <typename T>
T readMem(DWORD address)
{
    T buffer;
    ReadProcessMemory(process, (LPVOID)address, &buffer, sizeof(buffer), 0);
    return buffer;
}

template <typename T>
void writeMem(DWORD address, T value)
{
    WriteProcessMemory(process, (LPVOID)address, &value, sizeof(value), 0);
}
void main()
{
    SetConsoleTitle("Top non-pasted shit 1337"); // устанавливаем заголовок нашей консоли


    bool wallhack = false;
    std::cout << "Open CS:GO\n"; // выводим в консоль сообщение о том, что надо открыть ксго

    HWND hwnd;

    do {
        hwnd = FindWindowA(0, "Counter-Strike: Global Offensive"); // ищем ксго, если находим - выходим из цикла
        Sleep(50); // таймаут (чтобы не грузить процессор)
    } while (!hwnd);

    DWORD pid;
    GetWindowThreadProcessId(hwnd, &pid); // получаем id приложения
    process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // заходим в кс го его id

    std::cout << "Csgo started, pid " << pid << ".\n"; // выводим сообщение о том, что ксго запущена

    do {
        clientBase = getModuleBaseAddress(pid, "client_panorama.dll"); // ищем клиент кс го
        Sleep(50);
    } while (!clientBase);

    while (true)
    {
        Sleep(10); // таймаут, чтобы сбросить нагрузку
        if (GetAsyncKeyState(VK_F9)) // если нажали f9
        {
            wallhack = !wallhack; // заменяем значение переменной на противоположное
            system("cls");
            std::cout << "wh\t=\t" << wallhack;
        }
        if (GetAsyncKeyState(VK_DELETE))
        {
            system("cls");
            break;
        }
        if (!wallhack && !readMem<DWORD>(readMem<DWORD>(clientBase + dwLocalPlayer) + 0xED)) // если вх выключено или не удается прочитать память - выходим из цикла
            continue;
        DWORD glowObj = readMem<DWORD>(clientBase + dwGlowObjectManager); // создаем объект glowObj из модельки игрока
        DWORD myTeam = readMem<DWORD>(readMem<DWORD>(clientBase + dwLocalPlayer) + m_iTeamNum); // создаем объект тиммейтов
        for (int x = 0; x < 32; x++) // сам вх
        {
            DWORD player = readMem<DWORD>(clientBase + dwEntityList + x * 0x10); // обычный игрок
            if (player == 0)
                continue;
            bool dormant = readMem<bool>(player + 0xED); // спектатор
            if (dormant)
                continue;
            DWORD team = readMem<DWORD>(player + m_iTeamNum); // тиммейт
            if (team != 2 && team != 3)
                continue;

            DWORD currentGlowIndex = readMem<DWORD>(player + m_iGlowIndex); // текущий индекс игрока

            if (team != myTeam) // если игрок не тиммейт
            {
                // делаем его обводку красным
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x4, 255); // red
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x8, 0); // green
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0xC, 0); // blue
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x10, 255);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x24, true);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x25, false);
            }
            else // если игрок тиммейт
            {
                // делаем его обводку синим
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x4, 0); // red
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x8, 0); // green
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0xC, 255); // blue
                writeMem<float>(glowObj + currentGlowIndex * 0x38 + 0x10, 255);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x24, true);
                writeMem<bool>(glowObj + currentGlowIndex * 0x38 + 0x25, false);
            }
        }
    }
    return;
}
 
Участник
Статус
Оффлайн
Регистрация
4 Авг 2017
Сообщения
463
Реакции[?]
212
Поинты[?]
0
например про какие циклы ты говоришь? вложенности потому что не хочется чит с одним вх делить на кучу файлов. те, кому надо разделят сами
О какой куче файлов ты говоришь, ты в своём уме? Пожалуйста, если ты не знаешь даже простых приёмов избавления от вложенности, не пиши такие говногайды. Это бессмысленно, новичку нужен простой и понятный код.
к чему твой спич? я сейчас не дома, нет idle под рукой => я не могу проверить код. к исправлениям и обоснованной критике отношусь крайне положительно
Какого, извините меня, хуя, ты пишешь код, который не проверял? Я просто в ахуе. Это ещё раз доказывает, что твой гайд - на коленке написанное нечто.
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
вак детектит по-разному. например, часто читы отлетают из-за того, что инжектор спалили, также бывает палят читы, которые внедряются в игру. external-чит в этом имеет небольшое преимущество - он не внедряется в игру, а работает как бы отдельно.
полностью обойти вак (если ты имеешь в виду снизить шанс бана до 0%) - невозможно, но можно максимально снизить этот шанс.
как вариант, можно постоянно обновлять чит (добавлять джанки, изменять названия переменных).
двк, ваку плевать что на джанки, что на названия переменных(как бэ при компиле переменные становятся адресами окда?)
 
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
их спасает только удаление некоторых фич и протект хд
многие пастеры даже этого не умеют, а джанки тупо файл делают больше => отличают от других, это дает результат, хоть и не очень значимый (если задетектили vmt, например, чит отлетит независимо от джанков)
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
многие пастеры даже этого не умеют, а джанки тупо файл делают больше => отличают от других, это дает результат, хоть и не очень значимый (если задетектили vmt, например, чит отлетит независимо от джанков)
держи в курсе, джанки максимум угробить твой софт могут(ммм аптемезация)
 
Сверху Снизу