#include #include #include #include #include #define MODULE_NAME "client.dll" #define ENGINE_MODULE "engine.dll" #define STRUCT_OFFSET 0x00738098 #define CLIENT_COUNT_OFFSET 0x0039B514 #define CLIENT_COUNT_OFFSET2 0x1A0 #define STRUCT_SIZE 0x140 #define START_ID 0 #define MAX_ID 32 #define NAME_OFFSET 0x38 #define HEALTH_OFFSET 0x5C #define INGAME_OFFSET 0x28 BOOL FindProcessByName( TCHAR* ProcessName, PROCESSENTRY32* processEntry ) { HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL ); if( Process32First( hSnapshot, processEntry ) ) { do { if( !_tcscmp( processEntry->szExeFile, ProcessName ) ) { CloseHandle( hSnapshot ); return TRUE; } } while ( Process32Next( hSnapshot, processEntry ) ); } CloseHandle( hSnapshot ); return FALSE; } BOOL FindModuleByName( TCHAR* ModuleName, MODULEENTRY32* moduleEntry, DWORD dwProcessId ) { HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId ); if( hSnapshot == INVALID_HANDLE_VALUE ) { std::wcout << L"Something went wrong with ToolHelp func. Code: " << GetLastError( ) << L"\n"; return FALSE; } if( Module32First( hSnapshot, moduleEntry ) ) { do { if( !_tcscmp( moduleEntry->szModule, ModuleName ) ) { return TRUE; } } while( Module32Next( hSnapshot, moduleEntry ) ); } else { std::wcout << L"Could not find first module. " << GetLastError() << "\n"; } CloseHandle( hSnapshot ); return FALSE; } int main( ) { PROCESSENTRY32 processEntry; MODULEENTRY32 clientModule; MODULEENTRY32 engineModule; processEntry.dwSize = sizeof( PROCESSENTRY32 ); clientModule.dwSize = sizeof( MODULEENTRY32 ); engineModule.dwSize = sizeof( MODULEENTRY32 ); if( FindProcessByName( _T( "hl2.exe" ), &processEntry ) ) { HANDLE hProcess = OpenProcess( PROCESS_VM_READ, FALSE, processEntry.th32ProcessID ); if( hProcess != INVALID_HANDLE_VALUE ) { if( FindModuleByName( _T(MODULE_NAME), &clientModule, processEntry.th32ProcessID ) && FindModuleByName( _T(ENGINE_MODULE), &engineModule, processEntry.th32ProcessID ) ) { DWORD dwAddress = reinterpret_cast< DWORD >( clientModule.modBaseAddr ) + STRUCT_OFFSET; DWORD dw2ndAddress; DWORD dwEngAddress = reinterpret_cast< DWORD >( engineModule.modBaseAddr ) + CLIENT_COUNT_OFFSET; DWORD dw2ndEngAddress; if( ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dwAddress ), &dw2ndAddress, sizeof( dw2ndAddress ), NULL ) && ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dwEngAddress ), &dw2ndEngAddress, sizeof( dw2ndEngAddress ), NULL ) ) { char szRadBase[] = "Radar base: "; CharToOemA( szRadBase, szRadBase ); std::cout << szRadBase << (DWORD*)dw2ndAddress << "\n"; DWORD dwTotalPlayers = 0; if( !ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dw2ndEngAddress + CLIENT_COUNT_OFFSET2 ), &dwTotalPlayers, sizeof( dwTotalPlayers ), NULL ) ) { std::cout << "Could not get players count. Set it to 64\n"; dwTotalPlayers = 64; } else { if( dwTotalPlayers <= 64 ) { std::cout << "Client count: " << dwTotalPlayers << "\n\n"; } else { dwTotalPlayers = 64; std::cout << "Total players > 64. Update offsets.\n"; } } for( DWORD i = 0; i < dwTotalPlayers; i++ ) { DWORD dwNameOffset = dw2ndAddress + STRUCT_SIZE * i + NAME_OFFSET; DWORD dwHealthOffset = dw2ndAddress + STRUCT_SIZE * i + HEALTH_OFFSET; DWORD dwIngameOffset = dw2ndAddress + STRUCT_SIZE * i + INGAME_OFFSET; CHAR szNameBuffer[128]; DWORD dwHealthBuff; DWORD dwIngame = 0; if( ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dwIngameOffset ), &dwIngame, sizeof( dwIngame ), NULL ) ) { if( !dwIngame ) { continue; } } else { std::cout << "Could not read ingame offset. Code: " << GetLastError( ) << "\n"; } if( ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dwNameOffset ), szNameBuffer, sizeof( szNameBuffer ), NULL ) ) { CharToOemA( szNameBuffer, szNameBuffer ); } else { std::cout << "Could not read name buffer! Code:" << GetLastError( ) << "\n"; } if( ReadProcessMemory( hProcess, reinterpret_cast< PVOID >( dwHealthOffset ), &dwHealthBuff, sizeof( dwHealthBuff ), NULL ) ) { std::cout << i << ": " << szNameBuffer << "[" << dwHealthBuff << "]\n"; } else { std::cout << "Could not read health state! Code:" << GetLastError( ) << "\n"; } } } else { std::cout << "Could not find address! Code: " << GetLastError( ) << "\n"; } } else { std::cout << "Could not find module! Code:" << GetLastError( ) << "\n"; } } } else { std::cout << "Could not find process! Code:" << GetLastError( ) << "\n"; } getchar(); }