Pushok

Spider Patch

Feb 5th, 2012
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. // SpiderPatch.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. UCHAR InjCode[] = { 0x50, 0x41, 0x8B, 0x43, 0x14, 0x83, 0xE8, 0x05, 0x41, 0x89, 0x43, 0x14, 0x48, 0x8B, 0xCE, 0x58, 0x41, 0xFF, 0x4B, 0x14, 0x48, 0x8B, 0xCE, 0x90, 0x90, 0x90, 0x90, 0x90 };
  7. UCHAR PointsSignature[] = { 0x41, 0xFF, 0x4B, 0x14, 0x48, 0x8B, 0xCE, 0xE8, 0xDA, 0x1B, 0x00, 0x00 };
  8.  
  9. VOID MakeJump( int from, int to, CHAR* jmpbytes )
  10. {
  11.     jmpbytes[0] = 0xE9;
  12.  
  13.     *(int*)(jmpbytes + 1) = to - from - 5;
  14. }
  15.  
  16. CHAR* FindSignature( CHAR* dwStart, CHAR* dwEnd, UCHAR* szSignature, DWORD dwSize )
  17. {
  18.     do
  19.     {
  20.         if( memcmp( reinterpret_cast< void* >( dwStart ), szSignature, dwSize ) == NULL )
  21.         {
  22.             return dwStart;
  23.         }
  24.     } while( ++dwStart < dwEnd - dwSize );
  25.  
  26.     return ( CHAR* ) -1;
  27. }
  28.  
  29. BOOL FindProcessByName( TCHAR* ProcessName, PROCESSENTRY32* processEntry )
  30. {
  31.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );
  32.      
  33.     if( Process32First( hSnapshot, processEntry ) )
  34.     {
  35.         do
  36.         {
  37.             if( !_tcscmp( processEntry->szExeFile, ProcessName ) )
  38.             {
  39.                 CloseHandle( hSnapshot );
  40.                 return TRUE;
  41.             }
  42.         } while ( Process32Next( hSnapshot, processEntry ) );
  43.     }
  44.  
  45.     CloseHandle( hSnapshot );
  46.     return FALSE;
  47. }
  48.  
  49. BOOL FindModuleByName( TCHAR* ModuleName, MODULEENTRY32* moduleEntry, DWORD dwProcessId )
  50. {
  51.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
  52.  
  53.     if( hSnapshot == INVALID_HANDLE_VALUE )
  54.     {
  55.         std::wcout << L"Something went wrong with ToolHelp func. Code: " << GetLastError( ) << L"\n";
  56.         return FALSE;
  57.     }
  58.  
  59.     if( Module32First( hSnapshot, moduleEntry ) )
  60.     {
  61.         do
  62.         {
  63.             std::wcout << moduleEntry->szModule << L"\n";
  64.  
  65.             if( !_tcscmp( moduleEntry->szModule, ModuleName ) )
  66.             {
  67.                 return TRUE;
  68.             }
  69.         } while( Module32Next( hSnapshot, moduleEntry ) );
  70.     }
  71.     else
  72.     {
  73.         std::wcout << L"Could not find first module. " <<  GetLastError() << "\n";
  74.     }
  75.  
  76.     CloseHandle( hSnapshot );
  77.     return FALSE;
  78. }
  79.  
  80.  
  81. int _tmain(int argc, _TCHAR* argv[])
  82. {
  83.     TCHAR* szProcessName = _T( "SpiderSolitaire.exe" );
  84.     PROCESSENTRY32 *pProcessEntry = new PROCESSENTRY32;
  85.  
  86.     pProcessEntry->dwSize = sizeof( PROCESSENTRY32 );
  87.  
  88.  
  89.     if( FindProcessByName( szProcessName, pProcessEntry ) )
  90.     {
  91.         MODULEENTRY32* moduleEntry = new MODULEENTRY32;
  92.  
  93.         moduleEntry->dwSize = sizeof( MODULEENTRY32 );
  94.  
  95.         if( FindModuleByName( szProcessName, moduleEntry, pProcessEntry->th32ProcessID ) )
  96.         {
  97.             HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pProcessEntry->th32ProcessID );
  98.  
  99.             CHAR* ucModule = new CHAR[ moduleEntry->modBaseSize ];
  100.  
  101.             if( ReadProcessMemory( hProcess, moduleEntry->modBaseAddr, ucModule, moduleEntry->modBaseSize, NULL ) )
  102.             {
  103.                 CHAR* cOffset = (CHAR*)(moduleEntry->modBaseAddr + (DWORD)FindSignature( ucModule, ucModule + moduleEntry->modBaseSize, PointsSignature, sizeof( PointsSignature ) ) - (DWORD)ucModule );
  104.  
  105.                 if( ( DWORD )cOffset != -1 )
  106.                 {
  107.                     CHAR* cFuncAddress = (CHAR*)VirtualAllocEx( hProcess, NULL, sizeof( InjCode ) + 5, MEM_COMMIT, PAGE_READWRITE );
  108.                     CHAR cJmpCode[5];
  109.  
  110.                     MakeJump( (DWORD) cFuncAddress + sizeof( InjCode ) - sizeof( cJmpCode ), (DWORD) cOffset, cJmpCode );
  111.  
  112.                     memcpy_s( InjCode + sizeof( InjCode ) - 5, 5, cJmpCode, 5 );
  113.                    
  114.                     if( WriteProcessMemory( hProcess, cFuncAddress, InjCode, sizeof( InjCode ), NULL ) )
  115.                     {
  116.                         CHAR cJmpToFunc[5];
  117.                        
  118.                         MakeJump( (DWORD) cOffset, (DWORD) cFuncAddress, cJmpToFunc );
  119.  
  120.                         if( WriteProcessMemory( hProcess, cOffset, cJmpToFunc, sizeof( cJmpToFunc ), NULL ) )
  121.                         {
  122.                             std::cout << "Memory patched!\n";
  123.                         }
  124.                     }
  125.                     else
  126.                     {
  127.                         std::cout << "Could not write function to a process!\n";
  128.                     }
  129.                 }
  130.                 else
  131.                 {
  132.                     std::cout << "Could not find offset. Ask author to update this programm.\n";
  133.                 }
  134.             }
  135.  
  136.             delete [] ucModule;
  137.             CloseHandle( hProcess );
  138.         }
  139.  
  140.         getchar();
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment