Pushok icon

CS:S Players dump

Pushok | PRO | 02/09/12 03:27:41 PM UTC | 0 ⭐ | 420 👁️ | Never ⏰ | []
C++ |

5.07 KB

|

None

|

0 👍

/

0 👎

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <tchar.h>
#include <mbstring.h>
 
#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();
}

Comments