#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <iostream>
#define TRIGGER_KEY 0x05
#define var template<typename T> T
DWORD EntityList = 0x4A99224;
DWORD LocalPlayer = 0xA7E4CC;
DWORD LifeState = 0x25B;
DWORD Team = 0xF0;
DWORD CrossHairId = 0xA958;
DWORD EntitySize = 0x10;
//new "datatype"
struct Module
{
DWORD dwBase;
DWORD dwSize;
};
//debugger class
class Debugger
{
private:
HANDLE __process;
DWORD __pId;
public:
bool Attach(char* ProcessName)
{
HANDLE PHANDLE = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 CSENTRY;
CSENTRY.dwFlags = sizeof(CSENTRY);
do {
if (!strcmp(CSENTRY.szExeFile, ProcessName)) {
__pId = CSENTRY.th32ProcessID; //sets process' id
CloseHandle(PHANDLE); //closes the opent handle
__process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, __pId); //opens process for read/write
return true; // operation was successful
}
} while (Process32Next(PHANDLE, &CSENTRY));
return false; // operation failed (process was not found)
}
Module GetModule(char* ModuleName)
{
//same as in attach function, except for a dll in memory...
HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, __pId);
MODULEENTRY32 ModEntry;
ModEntry.dwSize = sizeof(ModEntry);
do {
if (!strcmp(ModEntry.szModule, (char*)ModuleName)) {
CloseHandle(module);
return { (DWORD)ModEntry.hModule, ModEntry.modBaseSize };
}
} while (Module32Next(module, &ModEntry));
return{ (DWORD)NULL, (DWORD)NULL };
}
template <typename T> T read(DWORD Addr)
{
T __read;
ReadProcessMemory(__process, (void*)Addr, &__read, sizeof(T), NULL);
return __read;
}
};
Debugger debugger;
DWORD dwClient, dwEngine;
class Entity
{
public:
static DWORD GetBaseEntity(int PlayerNumber)
{
return debugger.read<DWORD>(dwClient + EntityList + (EntitySize * PlayerNumber));
}
static bool PlayerIsDead(int PlayerNumber)
{
DWORD BaseEntity = GetBaseEntity(PlayerNumber);
if (BaseEntity) {
return debugger.read<bool>(BaseEntity + LifeState);
}
}
static int GetTeam(int PlayerNumber)
{
DWORD BaseEntity = GetBaseEntity(PlayerNumber);
if (BaseEntity) {
return debugger.read<int>(BaseEntity + Team);
}
}
};
class Game
{
public:
static void GetPlayerBase(DWORD* retAddr)
{
(DWORD)*retAddr = debugger.read<DWORD>(dwClient + LocalPlayer);
}
static int GetTeam() //retrieves current team (ct/t)
{
DWORD PlayerBase;
GetPlayerBase(&PlayerBase);
if (PlayerBase)
return debugger.read<int>(PlayerBase + Team);
}
static void GetCrosshairId(int* retAddr)
{
DWORD PlayerBase;
GetPlayerBase(&PlayerBase);
if (PlayerBase)
(int)*retAddr = debugger.read<int>(PlayerBase + CrossHairId) - 1;
}
};
void Click()
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(10);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
std::cout << "Pam";
}
DWORD WINAPI TriggerThread(LPVOID PARAMS)
{
while (1)
{
Sleep(1);
if (GetAsyncKeyState(TRIGGER_KEY) < 0 && TRIGGER_KEY != 1) //if the V key is down....
{
int PlayerNumber = NULL;
Game::GetCrosshairId(&PlayerNumber); //get the current player number
if (PlayerNumber < 64 && PlayerNumber >= 0 && Entity::GetTeam(PlayerNumber) != Game::GetTeam() && Entity::PlayerIsDead(PlayerNumber) == false)
{
Click(); //click
}
}
}
return 0;
}
int main()
{
Module Client, Engine;
//try to attach to csgo
while (!debugger.Attach("csgo.exe")) {
std::cout << ".";
Sleep(500);
}
//client.dll & engine.dll are the 2 modules where our data about players exist.
Client = debugger.GetModule("client.dll"); //get executable module client.dll
dwClient = Client.dwBase;
Engine = debugger.GetModule("engine.dll"); //get executable module engine.dll
dwEngine = Engine.dwBase;
CreateThread(0, 0, &TriggerThread, 0, 0, 0); //create a thread for the trigger loop
std::cout << "Trigger thread is running...";
while (1)
{
if (GetAsyncKeyState(VK_F4)) {
exit(0);
}
}
}
static DWORD GetBaseEntity(int PlayerNumber)
{
return debugger.read<DWORD>(dwClient + EntityList + (EntitySize * PlayerNumber));
}
static DWORD GetBaseEntity(int PlayerNumber)
{
return debugger.read<DWORD>(dwClient + EntityList + (PlayerNumber - 1) * EntitySize); //EntitySize = 16
}

and wasted like 2 hours trying to fix it