Привет работягям еще раз, это мой второй гайд на тему "Создание читов CS:GO". В первой части я разбирал, как же все таки сделать простое wh(glow esp) на CS:GO, сегодня же мы будем делать RadarHack! Для начала, хочу дать вам ссылку на 1 часть, так как от туда нам понадобится заголовочный файл(Memory.h). https://yougame.biz/threads/72499/ Итак, что же нам нужно? 1) Visual Studio 2) Базовые знания с++ (Если их нет, то советую просто копипастить). Давайте начнем! 1. Создаем пустой проект в Visual Studio. 2. Создаем заголовочный файл Memory.h(Я просто скину код, а его разбор был в предыдущем уроке) 3. Пишем туда код: #pragma once #include <Windows.h> #include <TlHelp32.h> #include <comdef.h> struct PModule { DWORD dwBase; DWORD dwSize; }; class memory { public: inline bool Attach(const char* pName, DWORD dwAccess) { HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); PROCESSENTRY32 entry; entry.dwSize = sizeof(entry); do if (!strcmp(_bstr_t(entry.szExeFile), pName)) { _pId = entry.th32ProcessID; CloseHandle(handle); _process = OpenProcess(dwAccess, false, _pId); return true; } while (Process32Next(handle, &entry)); return false; } inline PModule GetModule(const char* pModule) { HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, _pId); MODULEENTRY32 entry; entry.dwSize = sizeof(entry); do if (!strcmp(_bstr_t(entry.szModule), pModule)) { CloseHandle(module); return PModule{ reinterpret_cast<DWORD>(entry.hModule), entry.modBaseSize }; } while (Module32Next(module, &entry)); return PModule{ 0,0 }; } template<class T> T Read(const DWORD dwAddress) { T _read; ReadProcessMemory(_process, LPVOID(dwAddress), &_read, sizeof(T), NULL); return _read; } template<class T> void Write(const DWORD dwAddress, const T value) { WriteProcessMemory(_process, LPVOID(dwAddress), &value, sizeof(T), NULL); } void Exit() { CloseHandle(_process); } private: HANDLE _process; DWORD _pId; }; 4. Создаем основной файл radarhack.cpp Мы подошли к основному, как же реализовать наш взлом радара? Начнем писать код в radarhack.cpp! : 1. Подключаем библиотеку, наш файл и пространство имен std. #include <iostream> #include "Memory.h" using namespace std; 2. Добавляем в нашу программу адреса: #define dwLocalPlayer 0xCD2764 #define dwEntityList 0x4CE34FC #define m_bSpotted 0x93D #define m_iHealth 0x100 #define m_iTeamNum 0xF4 memory mem; PModule bClient; ПРОШУ ЗАМЕТИТЬ, У нас есть выбор между тем, где брать адреса в память. 1 - CS:GO Dumper 2 - GitHub Я советую вам гитхаб, так как там ВСЕ нужные адреса для создания читов и + адреса очень часто обновляют. Нооо, CS:GO Dumper все же нужно будет скачать, так как в нем мы будем смотреть dll игры. 3. Основной метод: int main() { while (!mem.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {} bClient = mem.GetModule("client_panorama.dll"); cout << "RadarHack is Started ! :)" << endl; while (1) { DWORD pLocal = mem.Read<DWORD>(bClient.dwBase + dwLocalPlayer); DWORD localHp = mem.Read<DWORD>(pLocal + m_iHealth); if (!localHp) continue; DWORD localTeam = mem.Read<DWORD>(pLocal + m_iTeamNum); for (DWORD i = 0; i < 64; i++) { DWORD pEnt = mem.Read<DWORD>(bClient.dwBase + dwEntityList + (i - 1) * 0x10); DWORD entHp = mem.Read<DWORD>(pEnt + m_iHealth); if (!entHp) continue; DWORD entTeam = mem.Read<DWORD>(pEnt + m_iTeamNum); if (entTeam == localTeam) continue; BOOL entSpotted = mem.Read<DWORD>(pEnt + m_bSpotted); if (entSpotted) continue; mem.Write(pEnt + m_bSpotted, TRUE); } } return 0; } В строчках while (!mem.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {} bClient = mem.GetModule("client_panorama.dll"); Мы сначала передаем процесс, а потом dll игры Да и вот что, dll игры изменила название с "client.dll" на "client_panorama.dll" после выпуска панорамы. Далее в цикле мы проверяем и оптимизируем наш чит, в коде DWORD pLocal = mem.Read<DWORD>(bClient.dwBase + dwLocalPlayer); DWORD localHp = mem.Read<DWORD>(pLocal + m_iHealth); if (!localHp) continue; Мы даем положение игрока, а потом даем его hp. И если хп нет (!localHp) ((! - не)) то он не будет отображатся на радаре (continue), в каком-то роде оптимизация. Дальше в коде мы видим DWORD localTeam = mem.Read<DWORD>(pLocal + m_iTeamNum); for (DWORD i = 0; i < 64; i++) { DWORD pEnt = mem.Read<DWORD>(bClient.dwBase + dwEntityList + (i - 1) * 0x10); DWORD entHp = mem.Read<DWORD>(pEnt + m_iHealth); if (!entHp) continue; DWORD entTeam = mem.Read<DWORD>(pEnt + m_iTeamNum); if (entTeam == localTeam) continue; BOOL entSpotted = mem.Read<DWORD>(pEnt + m_bSpotted); if (entSpotted) continue; mem.Write(pEnt + m_bSpotted, TRUE); } Здесь у нас дается команда, а так же главный цикл, который проходится по игрокам которые уже замечены твоими тиммейтами(уже на радаре) и тех кого нет. Так же видим здесь, если игрок уже обнаружен, то радархак его не отображает, т к он уже на радаре, так же что-то типо оптимизации. И главное, мы видим i < 64. Что это? А это максимальное кол-во игроков на сервере. То есть программа проверяет всех 64х игроков. Итак, давайте же запустим наш чит. Ура! Все работает, всем спасибо за внимание!!! Для ленивых вот код полностью: Memory.h #pragma once #include <Windows.h> #include <TlHelp32.h> #include <comdef.h> struct PModule { DWORD dwBase; DWORD dwSize; }; class memory { public: inline bool Attach(const char* pName, DWORD dwAccess) { HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); PROCESSENTRY32 entry; entry.dwSize = sizeof(entry); do if (!strcmp(_bstr_t(entry.szExeFile), pName)) { _pId = entry.th32ProcessID; CloseHandle(handle); _process = OpenProcess(dwAccess, false, _pId); return true; } while (Process32Next(handle, &entry)); return false; } inline PModule GetModule(const char* pModule) { HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, _pId); MODULEENTRY32 entry; entry.dwSize = sizeof(entry); do if (!strcmp(_bstr_t(entry.szModule), pModule)) { CloseHandle(module); return PModule{ reinterpret_cast<DWORD>(entry.hModule), entry.modBaseSize }; } while (Module32Next(module, &entry)); return PModule{ 0,0 }; } template<class T> T Read(const DWORD dwAddress) { T _read; ReadProcessMemory(_process, LPVOID(dwAddress), &_read, sizeof(T), NULL); return _read; } template<class T> void Write(const DWORD dwAddress, const T value) { WriteProcessMemory(_process, LPVOID(dwAddress), &value, sizeof(T), NULL); } void Exit() { CloseHandle(_process); } private: HANDLE _process; DWORD _pId; }; radarhack.cpp #include <iostream> #include "Memory.h" using namespace std; #define dwLocalPlayer 0xCD2764 #define dwEntityList 0x4CE34FC #define m_bSpotted 0x93D #define m_iHealth 0x100 #define m_iTeamNum 0xF4 memory mem; PModule bClient; int main() { while (!mem.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {} bClient = mem.GetModule("client_panorama.dll"); cout << "RadarHack is Started ! :)" << endl; while (1) { DWORD pLocal = mem.Read<DWORD>(bClient.dwBase + dwLocalPlayer); DWORD localHp = mem.Read<DWORD>(pLocal + m_iHealth); if (!localHp) continue; DWORD localTeam = mem.Read<DWORD>(pLocal + m_iTeamNum); for (DWORD i = 0; i < 64; i++) { DWORD pEnt = mem.Read<DWORD>(bClient.dwBase + dwEntityList + (i - 1) * 0x10); DWORD entHp = mem.Read<DWORD>(pEnt + m_iHealth); if (!entHp) continue; DWORD entTeam = mem.Read<DWORD>(pEnt + m_iTeamNum); if (entTeam == localTeam) continue; BOOL entSpotted = mem.Read<DWORD>(pEnt + m_bSpotted); if (entSpotted) continue; mem.Write(pEnt + m_bSpotted, TRUE); } } return 0; } Для еще более ленивых, вот сурс на чит и вт Y.Disk - https://yadi.sk/d/5UnTb0BG3xzhrw VT - https://www.virustotal.com/gui/file/2db6ca34bd9da1cd66ff3053c87961925240219120c1d2d7e1a7cb714fa9373b/detection (2/69)