Pushok icon

External Radar CS:S

Pushok | PRO | 02/20/12 07:41:21 PM UTC | 0 ⭐ | 809 👁️ | Never ⏰ | []
C++ |

9.74 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <string>
 
#include <gl/GL.h>
#include <gl\GLU.h>
#include <opengl\glut.h>
 
#define CLIENT_MODULE "client.dll"
#define ENGINE_MODULE "engine.dll"
 
#define LOCAL_NAME_OFFSET 0x003CE3AC
 
#define TRIGGERBOT_MAX_LENGTH 1700.0
 
#define STRUCT_OFFSET 0x007390A8
#define STRUCT_SIZE 0x140
#define MIN_ID 0
#define MAX_ID 64
 
#define ANGLES_OFFSET 0x6C
#define ORIGIN_OFFSET 0x60
#define TEAM_OFFSET 0x58
#define NAME_OFFSET 0x38
#define HEALTH_OFFSET 0x5C
#define INGAME_OFFSET 0x28
 
#define PI 3.14159265
 
#define WIN_W 800
#define WIN_H 600
 
#define UNACTIVE_TEST
#define TICKS_AFTER_DEATH 40
 
DWORD *dwModuleBaseAddr;
DWORD *dwRadarBaseAddr;
DWORD *dwLocalNameAddr;
 
HANDLE hProcess;
 
enum { CS_TEAM_T = 2, CS_TEAM_CT = 3 };
 
DWORD dwScreenWidth, dwScreenHeight;
 
struct Player
{
    int team;
    int health;
    float angles[3];
    float origin[3];
}; 
 
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;
}
 
inline float DegToRad( float fAng )
{
    return fAng * 3.14159265 / 180;
}
 
void DrawPlayer( float x, float y, GLfloat width, float* angles, int team, int health )
{
    glBegin( GL_TRIANGLE_FAN );
 
    if( team == CS_TEAM_T )
    {
        glColor3f( 1, 0, 0 );
    }
    else if( team == CS_TEAM_CT )
    {
        glColor3f( 0, 0, 1 );
    }
    else
    {
        glColor3f( 0, 1, 0 );
    }
 
    glVertex2f( x, y );
 
    for( GLfloat i = 0; i <= PI*2; i += PI*2/18 )
    {
        glVertex2f( x + cos( i ) * width , y + sin( i ) * width );
    }
 
    glEnd( );
    
    glBegin( GL_LINES );
 
    if( team == CS_TEAM_T )
    {
        glColor3f( 1, 0, 0 );
    }
    else if( team == CS_TEAM_CT )
    {
        glColor3f( 0, 0, 1 );
    }
    else
    {
        glColor3f( 0, 1, 0 );
    }
 
    glVertex2f( x, y );
    
    glVertex2f( x + cos( DegToRad( angles[1] ) ) * width * 2, y + sin( DegToRad( angles[1] ) ) * width * 2 );
 
    glEnd( );
 
    glLineWidth( 3 );
 
    glBegin( GL_LINES );
 
    glColor3f( 1 - (float)health / 100, (float)health / 100, 0 );
 
    GLfloat fCoef = 1.2;
    GLfloat fHealthCoef = (float)health / 100 * ( width * (fCoef * 2) );
    
    glVertex2f( x - fHealthCoef / 2, y - width * 2 );
    glVertex2f( x + fHealthCoef / 2, y - width * 2 );
 
    glEnd( );
 
    glLineWidth( 1 );
}
 
void DrawCross( float x, float y, float size )
{
    glBegin( GL_LINES );
 
    glColor3f( 1, 1, 1 );
 
    glVertex2f( x - size, y - size );
    glVertex2f( x + size, y + size );
 
    glVertex2f( x + size, y - size );
    glVertex2f( x - size, y + size );
 
    glEnd( );
}
 
void RenderScene() 
{
    glClear(GL_COLOR_BUFFER_BIT);
 
    glMatrixMode( GL_MODELVIEW );
 
    char szLocalPlayerName[128];
 
    ReadProcessMemory( hProcess, dwLocalNameAddr, szLocalPlayerName, sizeof( szLocalPlayerName ), NULL );
 
    static Player playersCache[65];
    static int unaliveIteration[65];
    static int ticksOnPlayerDeath[65];
 
    Player localPlayer;
 
    DWORD* dwHealthAddr;
    DWORD* dwTeamAddr;
    DWORD* dwNameAddr;
    DWORD* dwOriginAddr;
    DWORD* dwAnglesAddr;
 
    DWORD dwLocalId = -1;
 
    char szPlayerName[128] = {0};
 
    for( int i = 0; i < 64; i++ )
    {
        dwHealthAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + HEALTH_OFFSET );
        dwTeamAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + TEAM_OFFSET );
        dwNameAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + NAME_OFFSET );
        dwOriginAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ORIGIN_OFFSET );
        dwAnglesAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ANGLES_OFFSET );
 
        ReadProcessMemory( hProcess, dwNameAddr, szPlayerName, sizeof( szPlayerName ), NULL );
 
        if( szPlayerName[0] == NULL )
        {
            continue;
        }
 
        if( !strcmp( szPlayerName, szLocalPlayerName ) )
        {
            dwLocalId = i;
 
            ReadProcessMemory( hProcess, dwTeamAddr, &localPlayer.team, sizeof( DWORD ), NULL );
            ReadProcessMemory( hProcess, dwHealthAddr, &localPlayer.health, sizeof( DWORD ), NULL );
            ReadProcessMemory( hProcess, dwOriginAddr, localPlayer.origin, sizeof( float[3] ), NULL );
            ReadProcessMemory( hProcess, dwAnglesAddr, localPlayer.angles, sizeof( float[3] ), NULL );
 
            break;
        }
    }
 
    if( dwLocalId == -1 )
    {
        std::cout << "Could not find local player\n";
        return;
    }
 
    for( int i = 1; i < 64; i++ )
    {
        if( i == dwLocalId )
        {
            continue;
        }
 
        Player curPlayer = { 0 };
 
        dwHealthAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + HEALTH_OFFSET );
        dwTeamAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + TEAM_OFFSET );
        dwOriginAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ORIGIN_OFFSET );
        dwAnglesAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ANGLES_OFFSET );
 
        ReadProcessMemory( hProcess, dwHealthAddr, &curPlayer.health, sizeof( int ), NULL );
        ReadProcessMemory( hProcess, dwTeamAddr, &curPlayer.team, sizeof( int ), NULL );
        ReadProcessMemory( hProcess, dwOriginAddr, curPlayer.origin, sizeof( float[3] ), NULL );
        ReadProcessMemory( hProcess, dwAnglesAddr, curPlayer.angles, sizeof( float[3] ), NULL );
 
#ifdef UNACTIVE_TEST
        if( memcmp( playersCache[i].angles, curPlayer.angles, sizeof( float[3] ) ) == 0 )
        {
            unaliveIteration[i]++;
        }
        else
        {
            unaliveIteration[i] = 0;
        }
 
        if( unaliveIteration[i] > 200 )
        {
            continue;
        }
#endif
 
        GLfloat x, y;
 
        x = ( curPlayer.origin[0] - localPlayer.origin[0] ) / 20;
        y = ( curPlayer.origin[1] - localPlayer.origin[1] ) / 20;
 
        if( x > dwScreenWidth || y > dwScreenHeight )
        {
            continue;
        }
 
        glPushMatrix( );
 
        float fLocalPitch = -localPlayer.angles[1] + 90;
 
        glRotatef( fLocalPitch, 0, 0, 1 );
        
        if( curPlayer.health != NULL )
        {
            DrawPlayer( x, y, 2, curPlayer.angles, curPlayer.team, curPlayer.health );
        }
        else if( playersCache[i].health > NULL && curPlayer.health <= NULL )
        {
            ticksOnPlayerDeath[i] = TICKS_AFTER_DEATH;
        }
 
        if( ticksOnPlayerDeath[i] > 0 )
        {
            ticksOnPlayerDeath[i]--;
 
            DrawCross( x, y, 4 );
        }
 
        memcpy( &playersCache[i], &curPlayer, sizeof( Player ) );
 
        glPopMatrix( );
    }
 
    float ang[3] = {0, 90, 0};
 
    DrawPlayer( 0, 0, 2, ang, -1, localPlayer.health );
 
    glutSwapBuffers( );
}
 
void TimerFunc( int )
{
    glutPostRedisplay( );
    glutTimerFunc( 50, TimerFunc, 1 );
}
 
void ChangeSize( int width, int height )
{
    dwScreenWidth = width, dwScreenHeight = height;
 
    float fRatio;
 
    if( !height )
    {
        height = 1;
    }
 
    glViewport( 0, 0, width, height );
    glMatrixMode( GL_PROJECTION );
 
    glLoadIdentity( );
 
    fRatio = (float)width / (float)height;
 
    if( width <= height )
    {
        glOrtho( -100, 100, -100.0 / fRatio, 100.0 / fRatio, 1, -1 );
    }
    else
    {
        glOrtho( -100 * fRatio, 100 * fRatio, -100, 100, 1, -1 );
    }
 
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );
}
 
int main( int argc, char** argv )
{
    PROCESSENTRY32 processEntry;
    MODULEENTRY32 clientModule;
    MODULEENTRY32 engineModule;
 
    processEntry.dwSize = sizeof( PROCESSENTRY32 );
    clientModule.dwSize = sizeof( MODULEENTRY32 );
    engineModule.dwSize = sizeof( MODULEENTRY32 );
 
    dwLocalNameAddr = dwRadarBaseAddr = NULL;
 
    if( FindProcessByName( _T( "hl2.exe" ), &processEntry ) )
    {
        hProcess = OpenProcess( PROCESS_VM_READ, FALSE, processEntry.th32ProcessID );
 
        if( hProcess != INVALID_HANDLE_VALUE )
        {
            if( FindModuleByName( _T( CLIENT_MODULE ), &clientModule, processEntry.th32ProcessID ) &&
                FindModuleByName( _T( ENGINE_MODULE ), &engineModule, processEntry.th32ProcessID ) )
            {
                DWORD* dwRadarAddr = reinterpret_cast< DWORD* >( clientModule.modBaseAddr + STRUCT_OFFSET );
                DWORD* dwLocalNameAddrPtr = reinterpret_cast< DWORD* >( engineModule.modBaseAddr + LOCAL_NAME_OFFSET );
                
                if( 
                    ReadProcessMemory( hProcess, dwRadarAddr, &dwRadarBaseAddr, sizeof( DWORD* ), NULL ) &&
                    ReadProcessMemory( hProcess, dwLocalNameAddrPtr, &dwLocalNameAddr, sizeof( DWORD* ), NULL )
                    )
                {
                    std::cout << "Addresses found! " << "Radar base: " << dwRadarBaseAddr << std::endl;
                }
                else
                {
                    std::cout << "Could not find addresses.\n";
                    getchar();
 
                    return 1;
                }
            }
            else
            {
                std::cout << "Could not find modules.\n";
                getchar();
 
                return 1;
            }
        }
        else
        {
            std::cout << "Could not open process.\n";
            getchar();
 
            return 1;
        }
    }
    else
    {
        std::cout << "Could not find process.\n";
        getchar();
 
        return 1;
    }
 
 
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
    glutInitWindowSize( WIN_W, WIN_H );
    glutCreateWindow( "External Radar Hack by Push(http://steamcommunity.com/id/pushad/)" );
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    glutTimerFunc( 25, TimerFunc, 1 );
    
    glClearColor( 0, 0, 0, 1 );
 
    glutMainLoop();
 
    return 1;

Comments