#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <iomanip>
DWORD GetModuleBaseAddress(char* moduleName, DWORD ProcessID)
{
DWORD baseAddress = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 modEntry32 = { 0 };
modEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &modEntry32))
{
do
{
if (!strcmp(modEntry32.szModule, moduleName))
{
baseAddress = (DWORD)modEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &modEntry32));
}
CloseHandle(hSnapshot);
}
return baseAddress;
}
int main()
{
DWORD pID;
HWND hwnd = FindWindowA(NULL, "Cube 2: Sauerbraten");
GetWindowThreadProcessId(hwnd, &pID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
DWORD gameModule = GetModuleBaseAddress((char*)"sauerbraten.exe", pID);
// mov eax,[eax+esi*4]
int players;
ReadProcessMemory(handle, (LPVOID)(gameModule + 0x29CD3C), &players, sizeof(players), 0);
DWORD entitylist;
ReadProcessMemory(handle, (LPVOID)(gameModule + 0x29CD34), &entitylist, sizeof(entitylist), 0);
while (true)
{
for (int i = 0; i < players; i++)
{
DWORD ent;
ReadProcessMemory(handle, LPVOID(entitylist + (i * 4)), &ent, sizeof(ent), 0);
if (!ent)
continue;
int health;
char name[999];
ReadProcessMemory(handle, LPVOID(ent + 0x15C), &health, sizeof(health), 0);
ReadProcessMemory(handle, LPVOID(ent + 0x250), &name, sizeof(name), 0);
std::cout << "Players :" << name << std::setw(20) << "Health :" << health << std::endl;
}
system("cls");
}
}