Pushok

External Radar CS:S

Feb 20th, 2012
708
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <TlHelp32.h>
  4. #include <tchar.h>
  5. #include <string>
  6.  
  7. #include <gl/GL.h>
  8. #include <gl\GLU.h>
  9. #include <opengl\glut.h>
  10.  
  11. #define CLIENT_MODULE "client.dll"
  12. #define ENGINE_MODULE "engine.dll"
  13.  
  14. #define LOCAL_NAME_OFFSET 0x003CE3AC
  15.  
  16. #define TRIGGERBOT_MAX_LENGTH 1700.0
  17.  
  18. #define STRUCT_OFFSET 0x007390A8
  19. #define STRUCT_SIZE 0x140
  20. #define MIN_ID 0
  21. #define MAX_ID 64
  22.  
  23. #define ANGLES_OFFSET 0x6C
  24. #define ORIGIN_OFFSET 0x60
  25. #define TEAM_OFFSET 0x58
  26. #define NAME_OFFSET 0x38
  27. #define HEALTH_OFFSET 0x5C
  28. #define INGAME_OFFSET 0x28
  29.  
  30. #define PI 3.14159265
  31.  
  32. #define WIN_W 800
  33. #define WIN_H 600
  34.  
  35. #define UNACTIVE_TEST
  36. #define TICKS_AFTER_DEATH 40
  37.  
  38. DWORD *dwModuleBaseAddr;
  39. DWORD *dwRadarBaseAddr;
  40. DWORD *dwLocalNameAddr;
  41.  
  42. HANDLE hProcess;
  43.  
  44. enum { CS_TEAM_T = 2, CS_TEAM_CT = 3 };
  45.  
  46. DWORD dwScreenWidth, dwScreenHeight;
  47.  
  48. struct Player
  49. {
  50.     int team;
  51.     int health;
  52.     float angles[3];
  53.     float origin[3];
  54. };
  55.  
  56. BOOL FindProcessByName( TCHAR* ProcessName, PROCESSENTRY32* processEntry )
  57. {
  58.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );
  59.      
  60.     if( Process32First( hSnapshot, processEntry ) )
  61.     {
  62.         do
  63.         {
  64.             if( !_tcscmp( processEntry->szExeFile, ProcessName ) )
  65.             {
  66.                 CloseHandle( hSnapshot );
  67.                 return TRUE;
  68.             }
  69.         } while ( Process32Next( hSnapshot, processEntry ) );
  70.     }
  71.  
  72.     CloseHandle( hSnapshot );
  73.     return FALSE;
  74. }
  75.  
  76. BOOL FindModuleByName( TCHAR* ModuleName, MODULEENTRY32* moduleEntry, DWORD dwProcessId )
  77. {
  78.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
  79.  
  80.     if( hSnapshot == INVALID_HANDLE_VALUE )
  81.     {
  82.         std::wcout << L"Something went wrong with ToolHelp func. Code: " << GetLastError( ) << L"\n";
  83.         return FALSE;
  84.     }
  85.  
  86.     if( Module32First( hSnapshot, moduleEntry ) )
  87.     {
  88.         do
  89.         {
  90.             if( !_tcscmp( moduleEntry->szModule, ModuleName ) )
  91.             {
  92.                 return TRUE;
  93.             }
  94.         } while( Module32Next( hSnapshot, moduleEntry ) );
  95.     }
  96.     else
  97.     {
  98.         std::wcout << L"Could not find first module. " <<  GetLastError() << "\n";
  99.     }
  100.  
  101.     CloseHandle( hSnapshot );
  102.     return FALSE;
  103. }
  104.  
  105. inline float DegToRad( float fAng )
  106. {
  107.     return fAng * 3.14159265 / 180;
  108. }
  109.  
  110. void DrawPlayer( float x, float y, GLfloat width, float* angles, int team, int health )
  111. {
  112.     glBegin( GL_TRIANGLE_FAN );
  113.  
  114.     if( team == CS_TEAM_T )
  115.     {
  116.         glColor3f( 1, 0, 0 );
  117.     }
  118.     else if( team == CS_TEAM_CT )
  119.     {
  120.         glColor3f( 0, 0, 1 );
  121.     }
  122.     else
  123.     {
  124.         glColor3f( 0, 1, 0 );
  125.     }
  126.  
  127.     glVertex2f( x, y );
  128.  
  129.     for( GLfloat i = 0; i <= PI*2; i += PI*2/18 )
  130.     {
  131.         glVertex2f( x + cos( i ) * width , y + sin( i ) * width );
  132.     }
  133.  
  134.     glEnd( );
  135.    
  136.     glBegin( GL_LINES );
  137.  
  138.     if( team == CS_TEAM_T )
  139.     {
  140.         glColor3f( 1, 0, 0 );
  141.     }
  142.     else if( team == CS_TEAM_CT )
  143.     {
  144.         glColor3f( 0, 0, 1 );
  145.     }
  146.     else
  147.     {
  148.         glColor3f( 0, 1, 0 );
  149.     }
  150.  
  151.     glVertex2f( x, y );
  152.    
  153.     glVertex2f( x + cos( DegToRad( angles[1] ) ) * width * 2, y + sin( DegToRad( angles[1] ) ) * width * 2 );
  154.  
  155.     glEnd( );
  156.  
  157.     glLineWidth( 3 );
  158.  
  159.     glBegin( GL_LINES );
  160.  
  161.     glColor3f( 1 - (float)health / 100, (float)health / 100, 0 );
  162.  
  163.     GLfloat fCoef = 1.2;
  164.     GLfloat fHealthCoef = (float)health / 100 * ( width * (fCoef * 2) );
  165.    
  166.     glVertex2f( x - fHealthCoef / 2, y - width * 2 );
  167.     glVertex2f( x + fHealthCoef / 2, y - width * 2 );
  168.  
  169.     glEnd( );
  170.  
  171.     glLineWidth( 1 );
  172. }
  173.  
  174. void DrawCross( float x, float y, float size )
  175. {
  176.     glBegin( GL_LINES );
  177.  
  178.     glColor3f( 1, 1, 1 );
  179.  
  180.     glVertex2f( x - size, y - size );
  181.     glVertex2f( x + size, y + size );
  182.  
  183.     glVertex2f( x + size, y - size );
  184.     glVertex2f( x - size, y + size );
  185.  
  186.     glEnd( );
  187. }
  188.  
  189. void RenderScene()
  190. {
  191.     glClear(GL_COLOR_BUFFER_BIT);
  192.  
  193.     glMatrixMode( GL_MODELVIEW );
  194.  
  195.     char szLocalPlayerName[128];
  196.  
  197.     ReadProcessMemory( hProcess, dwLocalNameAddr, szLocalPlayerName, sizeof( szLocalPlayerName ), NULL );
  198.  
  199.     static Player playersCache[65];
  200.     static int unaliveIteration[65];
  201.     static int ticksOnPlayerDeath[65];
  202.  
  203.     Player localPlayer;
  204.  
  205.     DWORD* dwHealthAddr;
  206.     DWORD* dwTeamAddr;
  207.     DWORD* dwNameAddr;
  208.     DWORD* dwOriginAddr;
  209.     DWORD* dwAnglesAddr;
  210.  
  211.     DWORD dwLocalId = -1;
  212.  
  213.     char szPlayerName[128] = {0};
  214.  
  215.     for( int i = 0; i < 64; i++ )
  216.     {
  217.         dwHealthAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + HEALTH_OFFSET );
  218.         dwTeamAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + TEAM_OFFSET );
  219.         dwNameAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + NAME_OFFSET );
  220.         dwOriginAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ORIGIN_OFFSET );
  221.         dwAnglesAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ANGLES_OFFSET );
  222.  
  223.         ReadProcessMemory( hProcess, dwNameAddr, szPlayerName, sizeof( szPlayerName ), NULL );
  224.  
  225.         if( szPlayerName[0] == NULL )
  226.         {
  227.             continue;
  228.         }
  229.  
  230.         if( !strcmp( szPlayerName, szLocalPlayerName ) )
  231.         {
  232.             dwLocalId = i;
  233.  
  234.             ReadProcessMemory( hProcess, dwTeamAddr, &localPlayer.team, sizeof( DWORD ), NULL );
  235.             ReadProcessMemory( hProcess, dwHealthAddr, &localPlayer.health, sizeof( DWORD ), NULL );
  236.             ReadProcessMemory( hProcess, dwOriginAddr, localPlayer.origin, sizeof( float[3] ), NULL );
  237.             ReadProcessMemory( hProcess, dwAnglesAddr, localPlayer.angles, sizeof( float[3] ), NULL );
  238.  
  239.             break;
  240.         }
  241.     }
  242.  
  243.     if( dwLocalId == -1 )
  244.     {
  245.         std::cout << "Could not find local player\n";
  246.         return;
  247.     }
  248.  
  249.     for( int i = 1; i < 64; i++ )
  250.     {
  251.         if( i == dwLocalId )
  252.         {
  253.             continue;
  254.         }
  255.  
  256.         Player curPlayer = { 0 };
  257.  
  258.         dwHealthAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + HEALTH_OFFSET );
  259.         dwTeamAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + TEAM_OFFSET );
  260.         dwOriginAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ORIGIN_OFFSET );
  261.         dwAnglesAddr = (DWORD*)( (DWORD)dwRadarBaseAddr + i * STRUCT_SIZE + ANGLES_OFFSET );
  262.  
  263.         ReadProcessMemory( hProcess, dwHealthAddr, &curPlayer.health, sizeof( int ), NULL );
  264.         ReadProcessMemory( hProcess, dwTeamAddr, &curPlayer.team, sizeof( int ), NULL );
  265.         ReadProcessMemory( hProcess, dwOriginAddr, curPlayer.origin, sizeof( float[3] ), NULL );
  266.         ReadProcessMemory( hProcess, dwAnglesAddr, curPlayer.angles, sizeof( float[3] ), NULL );
  267.  
  268. #ifdef UNACTIVE_TEST
  269.         if( memcmp( playersCache[i].angles, curPlayer.angles, sizeof( float[3] ) ) == 0 )
  270.         {
  271.             unaliveIteration[i]++;
  272.         }
  273.         else
  274.         {
  275.             unaliveIteration[i] = 0;
  276.         }
  277.  
  278.         if( unaliveIteration[i] > 200 )
  279.         {
  280.             continue;
  281.         }
  282. #endif
  283.  
  284.         GLfloat x, y;
  285.  
  286.         x = ( curPlayer.origin[0] - localPlayer.origin[0] ) / 20;
  287.         y = ( curPlayer.origin[1] - localPlayer.origin[1] ) / 20;
  288.  
  289.         if( x > dwScreenWidth || y > dwScreenHeight )
  290.         {
  291.             continue;
  292.         }
  293.  
  294.         glPushMatrix( );
  295.  
  296.         float fLocalPitch = -localPlayer.angles[1] + 90;
  297.  
  298.         glRotatef( fLocalPitch, 0, 0, 1 );
  299.        
  300.         if( curPlayer.health != NULL )
  301.         {
  302.             DrawPlayer( x, y, 2, curPlayer.angles, curPlayer.team, curPlayer.health );
  303.         }
  304.         else if( playersCache[i].health > NULL && curPlayer.health <= NULL )
  305.         {
  306.             ticksOnPlayerDeath[i] = TICKS_AFTER_DEATH;
  307.         }
  308.  
  309.         if( ticksOnPlayerDeath[i] > 0 )
  310.         {
  311.             ticksOnPlayerDeath[i]--;
  312.  
  313.             DrawCross( x, y, 4 );
  314.         }
  315.  
  316.         memcpy( &playersCache[i], &curPlayer, sizeof( Player ) );
  317.  
  318.         glPopMatrix( );
  319.     }
  320.  
  321.     float ang[3] = {0, 90, 0};
  322.  
  323.     DrawPlayer( 0, 0, 2, ang, -1, localPlayer.health );
  324.  
  325.     glutSwapBuffers( );
  326. }
  327.  
  328. void TimerFunc( int )
  329. {
  330.     glutPostRedisplay( );
  331.     glutTimerFunc( 50, TimerFunc, 1 );
  332. }
  333.  
  334. void ChangeSize( int width, int height )
  335. {
  336.     dwScreenWidth = width, dwScreenHeight = height;
  337.  
  338.     float fRatio;
  339.  
  340.     if( !height )
  341.     {
  342.         height = 1;
  343.     }
  344.  
  345.     glViewport( 0, 0, width, height );
  346.     glMatrixMode( GL_PROJECTION );
  347.  
  348.     glLoadIdentity( );
  349.  
  350.     fRatio = (float)width / (float)height;
  351.  
  352.     if( width <= height )
  353.     {
  354.         glOrtho( -100, 100, -100.0 / fRatio, 100.0 / fRatio, 1, -1 );
  355.     }
  356.     else
  357.     {
  358.         glOrtho( -100 * fRatio, 100 * fRatio, -100, 100, 1, -1 );
  359.     }
  360.  
  361.     glMatrixMode( GL_MODELVIEW );
  362.     glLoadIdentity( );
  363. }
  364.  
  365. int main( int argc, char** argv )
  366. {
  367.     PROCESSENTRY32 processEntry;
  368.     MODULEENTRY32 clientModule;
  369.     MODULEENTRY32 engineModule;
  370.  
  371.     processEntry.dwSize = sizeof( PROCESSENTRY32 );
  372.     clientModule.dwSize = sizeof( MODULEENTRY32 );
  373.     engineModule.dwSize = sizeof( MODULEENTRY32 );
  374.  
  375.     dwLocalNameAddr = dwRadarBaseAddr = NULL;
  376.  
  377.     if( FindProcessByName( _T( "hl2.exe" ), &processEntry ) )
  378.     {
  379.         hProcess = OpenProcess( PROCESS_VM_READ, FALSE, processEntry.th32ProcessID );
  380.  
  381.         if( hProcess != INVALID_HANDLE_VALUE )
  382.         {
  383.             if( FindModuleByName( _T( CLIENT_MODULE ), &clientModule, processEntry.th32ProcessID ) &&
  384.                 FindModuleByName( _T( ENGINE_MODULE ), &engineModule, processEntry.th32ProcessID ) )
  385.             {
  386.                 DWORD* dwRadarAddr = reinterpret_cast< DWORD* >( clientModule.modBaseAddr + STRUCT_OFFSET );
  387.                 DWORD* dwLocalNameAddrPtr = reinterpret_cast< DWORD* >( engineModule.modBaseAddr + LOCAL_NAME_OFFSET );
  388.                
  389.                 if(
  390.                     ReadProcessMemory( hProcess, dwRadarAddr, &dwRadarBaseAddr, sizeof( DWORD* ), NULL ) &&
  391.                     ReadProcessMemory( hProcess, dwLocalNameAddrPtr, &dwLocalNameAddr, sizeof( DWORD* ), NULL )
  392.                     )
  393.                 {
  394.                     std::cout << "Addresses found! " << "Radar base: " << dwRadarBaseAddr << std::endl;
  395.                 }
  396.                 else
  397.                 {
  398.                     std::cout << "Could not find addresses.\n";
  399.                     getchar();
  400.  
  401.                     return 1;
  402.                 }
  403.             }
  404.             else
  405.             {
  406.                 std::cout << "Could not find modules.\n";
  407.                 getchar();
  408.  
  409.                 return 1;
  410.             }
  411.         }
  412.         else
  413.         {
  414.             std::cout << "Could not open process.\n";
  415.             getchar();
  416.  
  417.             return 1;
  418.         }
  419.     }
  420.     else
  421.     {
  422.         std::cout << "Could not find process.\n";
  423.         getchar();
  424.  
  425.         return 1;
  426.     }
  427.  
  428.  
  429.     glutInit( &argc, argv );
  430.     glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
  431.     glutInitWindowSize( WIN_W, WIN_H );
  432.     glutCreateWindow( "External Radar Hack by Push(http://steamcommunity.com/id/pushad/)" );
  433.     glutDisplayFunc(RenderScene);
  434.     glutReshapeFunc(ChangeSize);
  435.     glutTimerFunc( 25, TimerFunc, 1 );
  436.    
  437.     glClearColor( 0, 0, 0, 1 );
  438.  
  439.     glutMainLoop();
  440.  
  441.     return 1;
Advertisement
Add Comment
Please, Sign In to add comment