Всем ку,сегодня научу вас делать свой первый екстернал чит для кс го.Делать мы будем именно WallHack.Я постараюсь расписать все максимально понятно и по шагам, чтобы вы поняли как что работает. 1. Создаем простой C++ проект в Visual Studio. 2. Создаем файл main.cpp, здесь и будет весь наш код. 3. Пишем в начало файла следующий код: #include <iostream> #include <Windows.h> #include <TlHelp32.h> #include <thread> Код #include <iostream> #include <Windows.h> #include <TlHelp32.h> #include <thread> Здесь мы настроили нужные нам библиотеки для работы кода. 4.Теперь нам нужно сделать переменные с оффсетами: const DWORD dwLocalPlayer = 0xCBD6A4; const DWORD dwEntityList = 0x4CCDCBC; const DWORD m_iTeamNum = 0xF4; const DWORD m_iGlowIndex = 0xA3F8; const DWORD dwGlowObjectManager = 0x520DAE0; Код const DWORD dwLocalPlayer = 0xCBD6A4; const DWORD dwEntityList = 0x4CCDCBC; const DWORD m_iTeamNum = 0xF4; const DWORD m_iGlowIndex = 0xA3F8; const DWORD dwGlowObjectManager = 0x520DAE0; 5. Сейчас мы определим переменные, с которыми мы будем работать на протяжении всего написания чита. HANDLE process; // непосредственно сам процесс CSGO DWORD clientBase; // это короче для работы с client_panorama.dll DWORD engineBase; // это короче для работы с engine.dll Код HANDLE process; // непосредственно сам процесс CSGO DWORD clientBase; // это короче для работы с client_panorama.dll DWORD engineBase; // это короче для работы с engine.dll 6.Начинаем писать собственно наш чит: bool wh = false; Код bool wh = false; (bool) нам нужен для того что бы определить статус функций 7. Ну теперь нам нужно сделать так что бы наш чит читал память 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); } Код 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); } 8. Теперь создадим входную точку,а то есть int main 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); } Код 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 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); } } } } Код 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.Для того что бы вызывать наш метод нам нужно это: std::thread whThread(wallhack) Код 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); // таймаут, чтобы сбросить нагрузку } } Код 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); // таймаут, чтобы сбросить нагрузку } } Поздравляю вы написали свой первый чит! Если будут вопросы пишите в лс! Хотите научу делать ваcBunnyHop?
нищийпосути, да потратил кучу времени на это --- Сообщение объединено с предыдущим 23 янв 2020 Спасибо --- Сообщение объединено с предыдущим 23 янв 2020 нищийпосути, обещаю что про бани хоп такого не будет
Лися_неактив209035, по крайне мере не должен --- Сообщение объединено с предыдущим 23 янв 2020 Лися_неактив209035, детект будет только в том случае если он будет в базе Valve если я не ошибаюсь то это так работает.
Знаешь почему твоя тема ничему не учит? Потому что ты учишь людей пасткодингу. Мол вот это крч оффсет, его сюда ставишь и всё, ты написал чит. Говори людям теорию, как найти оффсет, что делать если он обфусифицирован, как работает аим, как найти разницу в углах, что такое паттерны, динамичесий поиск оффсетов. --- Сообщение объединено с предыдущим 23 янв 2020 В базе валв?:peka: External то? Он тупо читает и пишет память игры. Ничего более
понимаю, а по факту, хуй что объяснил, учит пасте, и просто спиздил код из других мануалов, и это мне еще лень оффсеты чекать, не удивлюсь если они старые, тупо блять дебилы ради репы хуйню творят. --- Сообщение объединено с предыдущим 23 янв 2020 2.4. Выпрашивание симпатий запрещено. Аналогично запрещены намёки на то, чтобы пользователь поставил симпатию (симпатия увеличивает шанс, ставите симпы - даю аккаунты и т.д.). даун блять
Есть парочка вопросов: 1. Статья спизженная? 2. Смысл статьи если ты ничего не объяснил, а просто загрузил код с минимальным количеством информации(надпись «теперь мы сделаем wallhack не помогает, ты не потрудился объяснить как это все работает) Статья на 6/10 максимум
ketch_inactive2790559, посмотрел твой оффтопик реально годно!И по поводу копипаста,смотри на этом форуме этого не было,а всё что за пределами этого форума это не копипаст:) Конечно извиняюсь за это но в следующий раз сделаю всё понятно и расскажу о каждой команде,что и зачем она нужна. --- Сообщение объединено с предыдущим 23 янв 2020 KaByH_Alive, понимаю следущий гайд сделаю более понятный и расскажу о до всём.
То, что находится за пределами на форуме не копипаст? Желаю закончить тебе 1 класс без колов... Копипаст = скопированная тема откуда-либо, не имеет значения, была она на этом форуме или нет.
--- Сообщение объединено с предыдущим 5 мар 2020 И прекольно было бы ролик на Youtube без исходного кода. В слух преятний и проще осазновать --- Сообщение объединено с предыдущим 5 мар 2020 Ругается на mEntry