Гайд BunnyHop для CS:GO

Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Буду писать все по порядку. Если понадобятся объяснения чего-либо, то пишите в комменты. Отмечу, что это основа. Это не полноценно готовый bhop, его нужно доработать под сегодняшние реалии.

1. Все начинается с подключения необходимых библиотек:
Код:
#include <iostream>

#include <Windows.h>
#include <TlHelp32.h>
[B]
2. Добавляем "горячую клавишу":
Код:
#define BHOP_KEY 'C'
3. Создаем необходимые модули и класс Дебаггер:
Код:
struct module_t
{
    DWORD dwBase, dwSize;
};

// дебаггер

class CDebugger
{
private:
    DWORD dwPid;
    HANDLE hProcess;
public:
    bool attach(char* szProcess)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(entry);
        do {
            if (!strcmp(entry.szExeFile, szProcess))
            {
                dwPid = entry.th32ProcessID;
                CloseHandle(handle);
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPid);
                return true;
            }
        } while (Process32Next(handle, &entry));
        return false;
    }
    module_t GetModule(char* szModule)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, NULL);
        MODULEENTRY32 entry;
        entry.dwSize = sizeof(entry);
        do {
            if (!strcmp(entry.szModule, szModule))
            {
                dwPid = entry.th32ProcessID;
                CloseHandle(handle);
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPid);
                return { (DWORD)entry.hModule, entry.modBaseSize };
            }
        } while (Module32Next(handle, &entry));
        return{ (DWORD)false, false };
    }

    template<typename T>
    T ReadMemory(DWORD Address)
    {
        T read;
        ReadProcessMemory(hProcess, Address, &read, sizeof(T), 0);
    }
    template<typename T>
    void WriteMemory(DWORD Address, T value)
    {
        WriteProcessMemory(hProcess, Address, &val, sizeof(T), 0);
    }
};
4. Пишем оффсеты(можно найти дампер или где-то на форуме):
Код:
// оффсеты

DWORD dwLocalPlayer = 0xA9948C;
DWORD dwJump = 0x4AD0374;
DWORD dwFlags = 0x100;

CDebugger debugger;
module_t moduleClient;
5. Пишем модуль получения клиента(client.dll):
Код:
module_t* GetModuleClient()
{
    if (!moduleClient.dwBase && !moduleClient.dwSize) {
        moduleClient = debugger.GetModule("client.dll");
    }
    return &moduleClient;
}
6. Создаем класс самого bhop'а:
Код:
class CBunnyhop
{
public:
    static unsigned long_stdcall ThreadRoutine(void*)
     {
        while (true)
        {
            DWORD dwMe = debugger.Readmemory<DWORD>(GetModuleClient()->dwBase + dwLocalPlayer);
            int CanJump = debugger.ReadMemory<DWORD>(dwMe + dwFlags);
            if ((GetAsyncKeyState(BHOP_KEY) & 0x8000) && (CanJump & 0x1 == true)) {
                debugger.WriteMemory<int>(GetModuleClient()->dwBase + dwJump, 5); // прыгаем в игре
                Sleep(50);
                debugger.WriteMemory<int>(GetModuleClient()->dwBase + dwJump, 4);
            }
        }
    }
};
7. Пишем главную функцию int main:

Код:
int main()
{
    while (!debugger.attach("csgo.exe")) { // вливаемся в процесс csgo.exe
        Sleep(100);
    }
    CreateThread(0, 0, &CBunnyhop::ThreadRoutine, 0, 0, 0);
    while (1) {
        Sleep(100);
    }
}
Вся программа:
Код:
[/B]
// библиотеки
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

#define BHOP_KEY 'C' // нажать, чтобы начать прыгать

struct module_t
{
    DWORD dwBase, dwSize;
};

// дебаггер

class CDebugger
{
private:
    DWORD dwPid;
    HANDLE hProcess;
public:
    bool attach(char* szProcess)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(entry);
        do {
            if (!strcmp(entry.szExeFile, szProcess))
            {
                dwPid = entry.th32ProcessID;
                CloseHandle(handle);
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPid);
                return true;
            }
        } while (Process32Next(handle, &entry));
        return false;
    }
    module_t GetModule(char* szModule)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, NULL);
        MODULEENTRY32 entry;
        entry.dwSize = sizeof(entry);
        do {
            if (!strcmp(entry.szModule, szModule))
            {
                dwPid = entry.th32ProcessID;
                CloseHandle(handle);
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPid);
                return { (DWORD)entry.hModule, entry.modBaseSize };
            }
        } while (Module32Next(handle, &entry));
        return{ (DWORD)false, false };
    }

    template<typename T>
    T ReadMemory(DWORD Address)
    {
        T read;
        ReadProcessMemory(hProcess, Address, &read, sizeof(T), 0);
    }
    template<typename T>
    void WriteMemory(DWORD Address, T value)
    {
        WriteProcessMemory(hProcess, Address, &val, sizeof(T), 0);
    }
};

// оффсеты

DWORD dwLocalPlayer = 0xA9948C;
DWORD dwJump = 0x4AD0374;
DWORD dwFlags = 0x100;

CDebugger debugger;
module_t moduleClient;

// client.dll в памяти
module_t* GetModuleClient()
{
    if (!moduleClient.dwBase && !moduleClient.dwSize) {
        moduleClient = debugger.GetModule("client.dll");
    }
    return &moduleClient;
}

class CBunnyhop
{
public:
    static unsigned long_stdcall ThreadRoutine(void*)
     {
        while (true)
        {
            DWORD dwMe = debugger.Readmemory<DWORD>(GetModuleClient()->dwBase + dwLocalPlayer);
            int CanJump = debugger.ReadMemory<DWORD>(dwMe + dwFlags);
            if ((GetAsyncKeyState(BHOP_KEY) & 0x8000) && (CanJump & 0x1 == true)) {
                debugger.WriteMemory<int>(GetModuleClient()->dwBase + dwJump, 5); // прыгаем в игре
                Sleep(50);
                debugger.WriteMemory<int>(GetModuleClient()->dwBase + dwJump, 4);
            }
        }
    }
};

int main()
{
    while (!debugger.attach("csgo.exe")) { // вливаемся в процесс csgo.exe
        Sleep(100);
    }
    CreateThread(0, 0, &CBunnyhop::ThreadRoutine, 0, 0, 0);
    while (1) {
        Sleep(100);
    }
}
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
Мммм щас бы пастить внешние сурсы 2к13 года на впм и рпм.
Это не актуальный гайд. Зачем он? адреса то хоть обновленные?
 
Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Мммм щас бы пастить внешние сурсы 2к13 года на впм и рпм.
Это не актуальный гайд. Зачем он? адреса то хоть обновленные?
лол а может тебе еще ммап инжектор написать? это не 2к13 сурсы, а оффсеты, как сказано выше, идешь и дампишь.
 
Пользователь
Статус
Оффлайн
Регистрация
4 Ноя 2016
Сообщения
670
Реакции[?]
135
Поинты[?]
0
а зачем так заморачиваться, не легче как спинер тупо обрезать функции в индиго ,оставив вкладку миск??
 
Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
лол а может тебе еще ммап инжектор написать? это не 2к13 сурсы, а оффсеты, как сказано выше, идешь и дампишь.
Соре конечно за столь грубое высказывание. Но ты понял что ты щас высрал? По сути ты себя сам запалил что src не твой, а код на столько примитивный что явно кажется что делал его не ты, тем более что адреса не пашут если.
Зачем искать адреса в ручную если есть юц, а там специальный раздел с офсетами. Мы же находимся на форуме пастеров, тут мало кто делает что то сам.
И такой вопрос зачем мап инжектор для "твоего" сурса, если это внешнее приложение exe.....
 
Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Соре конечно за столь грубое высказывание. Но ты понял что ты щас высрал? По сути ты себя сам запалил что src не твой, а код на столько примитивный что явно кажется что делал его не ты, тем более что адреса не пашут если.
Зачем искать адреса в ручную если есть юц, а там специальный раздел с офсетами. Мы же находимся на форуме пастеров, тут мало кто делает что то сам.
И такой вопрос зачем мап инжектор для "твоего" сурса, если это внешнее приложение exe.....
я просто сказал насчет ммапа, а у нас и на югейме есть оффсеты.
 
Участник
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
613
Реакции[?]
507
Поинты[?]
0
Module32First, Process32First - уже не актуальны что ли? В функции с бхопом желательно установить задержку после итерации цикла (достаточно в 5 или меньше мс.).
Зачем каждый раз вызывать функцию GetModuleClient()?
module_t* client = GetModuleClient(); //религия не позволяет?)
Просто вызов функции жрет время, да мало, но когда вызываешь много (например, в бесконечном цикле), то и суммарное время вызова функции стремится к бесконечности. Модуль ни куда не денется.
 
Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Module32First, Process32First - уже не актуальны что ли? В функции с бхопом желательно установить задержку после итерации цикла (достаточно в 5 или меньше мс.).
Зачем каждый раз вызывать функцию GetModuleClient()?
module_t* client = GetModuleClient(); //религия не позволяет?)
Просто вызов функции жрет время, да мало, но когда вызываешь много (например, в бесконечном цикле), то и суммарное время вызова функции стремится к бесконечности. Модуль ни куда не денется.
можно, но переписывать лень)
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
Module32First, Process32First - уже не актуальны что ли? В функции с бхопом желательно установить задержку после итерации цикла (достаточно в 5 или меньше мс.).
Зачем каждый раз вызывать функцию GetModuleClient()?
module_t* client = GetModuleClient(); //религия не позволяет?)
Просто вызов функции жрет время, да мало, но когда вызываешь много (например, в бесконечном цикле), то и суммарное время вызова функции стремится к бесконечности. Модуль ни куда не денется.
можно, но переписывать лень)
Вообще не понятно зачем для обычного бх делать отдельный поток можно было прям в мэйне while сделать да и сё
Еще лучше исключить из бхопа запись и заменить на эмуляцию нажатия клавиши ибо приложения которые только читают более легитны
 
Участник
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
613
Реакции[?]
507
Поинты[?]
0
Лучшие приватные читы
Участник
Статус
Оффлайн
Регистрация
23 Фев 2018
Сообщения
620
Реакции[?]
187
Поинты[?]
0
Участник
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
613
Реакции[?]
507
Поинты[?]
0
Кстати, код не сработает без одной строки в функции Readmemory, догадаетесь какой?)
 
              ru p2cs > all                      
Разработчик
Статус
Оффлайн
Регистрация
19 Авг 2016
Сообщения
1,578
Реакции[?]
1,961
Поинты[?]
131K
Кстати, код не сработает без одной строки в функции Readmemory, догадаетесь какой?)
Return?

Не проще сделать более нормальную систему чтения памяти?

Я сижу на интерналах мне то пихуй, но когда я сидел на экстерналах то у меня был совершенно другой код, типа чтение памяти я пастанул с другого экстернала ибо сделано оно было с умом.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
typedef struct _OFFSETS{
DWORD dLocal;
DWORD flags;
DWORD flags;
DWORD Client;
} OFFSETS, *POFFSETS;
OFFSETS g_Offset;
void Setup(POFFSETS o){
o->dLocal = ;
o->flags = ;
o->jump = ;
o->Client = (DWORD)GetModuleHandleA("client.dll");
}

Setup(&g_Offset);
 
Сверху Снизу