-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет! Сегодня я вам расскажу и покажу, как сделать GlowESP для CS: GO с автообновлением оффсетов и с встроенным инжектором. Приступим!
Шаг 1. Создаём проект в Visual Studio. (я использую professional 2017)
Сверху слева нажимаем Файл > Создать > Проект. В открытом окне слева выбираем Visual C++. Далее нажимаем "Консольное приложение Windows". Снизу пишем название нашего проекта (в моём случае это esp).
Шаг 2. Настраиваем проект.
Сначала сверху в "конфигурации решения" выбираем "Realese". А где написано "платформы решения" выбираем "x86". Далее сверху нажимаем "Отладка" и снизу выбираем "(название вашего проекта): свойства". Далее где написано "Набор символов" меняем на "Использовать многобайтовую кодировку". Далее где написано "Версия пакета SDK для Windows" ставим на 10.0.17134.0 (это у вас будет только если вы установите DirectSDK June 10. Ссылка на него:
Шаг 3. Пишем исходный код (предпоследний шаг).
После того как мы всё сделали справа заходим в (название вашего проекта).cpp. Далее стираем там всё. Я оставлю исходный код, который вы должны будете скопировать и вставить в (название вашего проекта).cpp.
Шаг 4. Компиляция Вашего чита. (последний шаг)
Вот мы и подошли к последнему шагу! После того как вы всё сделали нажимаете F5, или "Отладка > Начать отладку". Вот и всё! Поздравляю вас вы сделали свой чит! А теперь немного информации об этом.
Помните, что оффсеты обновлять не нужно, чит сам ищет их и обновляет. Чит обновлён под Panorama UI. Если вы не хотите этого, то просто замените везде "client_panorama.dll" на "client.dll" Если вы копировали код в точности и ничего не изменяли, то в 340 строке можно написать например свой ник. Тоесть автора, создателя этого чита. Чит можно включать и выключать на кнопку F1. Чит желательно запускайте от имени администратора, чтобы он хорошо работал. Если когда вы играете с ним у вас мигает GlowESP, то в настройках видео в игре выключите вертикальную синхронизацию и многоядерную обработку. Ну, а так всё! В следующий раз я вам покажу как обновлять чит, и делать так, чтобы он был UnDetected, без всяких протекторов.
P. S. Вот сто пудов уверен после того, как я ещё выпущу гайд как обновлять чит, и делать его UnDetected, то появится OVE9000 групп ВК, и сайтов на бесплатных хостингах, с корявым дизайном, "ПРИВАТНЫЙ GlowESP С ОБНОВЛЕНИЕМ ОФФСЕТОВ, И СТАБИЛЬНЫМ UNDETECTED!1!!" от отбросов общества гейминга. Это всё, что я вам хотел сказать! До всречи в следующих гайдах!
© 2018 Valve Corporation. Все права защищены. Все торговые марки являются собственностью соответствующих владельцев в США и других странах.
Шаг 1. Создаём проект в Visual Studio. (я использую professional 2017)
Сверху слева нажимаем Файл > Создать > Проект. В открытом окне слева выбираем Visual C++. Далее нажимаем "Консольное приложение Windows". Снизу пишем название нашего проекта (в моём случае это esp).
Шаг 2. Настраиваем проект.
Сначала сверху в "конфигурации решения" выбираем "Realese". А где написано "платформы решения" выбираем "x86". Далее сверху нажимаем "Отладка" и снизу выбираем "(название вашего проекта): свойства". Далее где написано "Набор символов" меняем на "Использовать многобайтовую кодировку". Далее где написано "Версия пакета SDK для Windows" ставим на 10.0.17134.0 (это у вас будет только если вы установите DirectSDK June 10. Ссылка на него:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). И последнее, что мы должны сделать в этом шагу, так это в "Набор инструментов платформы" выставить Visual Studio 2017 (v141) (это у вас будет показываться, как я не ошибаюсь только тогда, если вы будете делать проект в Visual Studio 2017) и обязательно не забудьте нажать кнопку "Применить". Поздравляю вас! Половина пути пройдена. Приступим к следующему шагу!Шаг 3. Пишем исходный код (предпоследний шаг).
После того как мы всё сделали справа заходим в (название вашего проекта).cpp. Далее стираем там всё. Я оставлю исходный код, который вы должны будете скопировать и вставить в (название вашего проекта).cpp.
Код:
#include "stdafx.h"
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
typedef unsigned char uint8_t;
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 = 0xF0;
DWORD dwDormant = 0xE9;
struct PModule
{
DWORD dwBase;
DWORD dwSize;
};
/* Debugger/Process API implementation class */
class process
{
public:
bool Attach(char* pName, DWORD rights)
{
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
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(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 NULL;
}
for (DWORD i = 0; i < size; i++) {
if (DataCompare((const BYTE*)(data + i), (const BYTE*)sig, mask)) {
return start + i;
}
}
return NULL;
}
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, char);
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 == NULL);
}
};
/* Glow Object structure in csgo */
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
{
DWORD 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_panorama.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 = mem->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_panorama.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 == NULL)
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 + 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(NULL, NULL, &offset::scan_offsets, NULL, NULL, NULL);
}
static unsigned long __stdcall esp_thread(void*)
{
int objectCount;
DWORD pointerToGlow;
Entity* Player = NULL;
float Friend = SanitizeColor(100);
float Enemy = SanitizeColor(140);
while (true)
{
Sleep(1);
pointerToGlow = memory.Read<DWORD>(GetClientModule()->dwBase + dwGlow);
objectCount = memory.Read<DWORD>(GetClientModule()->dwBase + dwGlow + 0x4);
if (pointerToGlow != NULL && objectCount > 0)
{
for (int i = 0; i < objectCount; i++)
{
DWORD mObj = pointerToGlow + i * sizeof(glow_t);
glow_t glowObject = memory.Read<glow_t>(mObj);
Player = GetEntityByBase(glowObject.dwBase);
if (glowObject.dwBase == NULL || Player == nullptr || Player->is_dormant) {
continue;
}
if (me.team == Player->team) {
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(NULL, NULL, &virtualesp::esp_thread, NULL, NULL, NULL);
}
else {
std::cout << "Glow: Disabled" << std::endl;
TerminateThread(ESP, 0);
CloseHandle(ESP);
}
}
}
}
Шаг 4. Компиляция Вашего чита. (последний шаг)
Вот мы и подошли к последнему шагу! После того как вы всё сделали нажимаете F5, или "Отладка > Начать отладку". Вот и всё! Поздравляю вас вы сделали свой чит! А теперь немного информации об этом.
Помните, что оффсеты обновлять не нужно, чит сам ищет их и обновляет. Чит обновлён под Panorama UI. Если вы не хотите этого, то просто замените везде "client_panorama.dll" на "client.dll" Если вы копировали код в точности и ничего не изменяли, то в 340 строке можно написать например свой ник. Тоесть автора, создателя этого чита. Чит можно включать и выключать на кнопку F1. Чит желательно запускайте от имени администратора, чтобы он хорошо работал. Если когда вы играете с ним у вас мигает GlowESP, то в настройках видео в игре выключите вертикальную синхронизацию и многоядерную обработку. Ну, а так всё! В следующий раз я вам покажу как обновлять чит, и делать так, чтобы он был UnDetected, без всяких протекторов.
P. S. Вот сто пудов уверен после того, как я ещё выпущу гайд как обновлять чит, и делать его UnDetected, то появится OVE9000 групп ВК, и сайтов на бесплатных хостингах, с корявым дизайном, "ПРИВАТНЫЙ GlowESP С ОБНОВЛЕНИЕМ ОФФСЕТОВ, И СТАБИЛЬНЫМ UNDETECTED!1!!" от отбросов общества гейминга. Это всё, что я вам хотел сказать! До всречи в следующих гайдах!
© 2018 Valve Corporation. Все права защищены. Все торговые марки являются собственностью соответствующих владельцев в США и других странах.