#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