Pushok

Spider patch (works)

Feb 6th, 2012
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.93 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, 0x48, 0x31, 0xC0, 0x41, 0x8B, 0x43, 0x14, 0x83, 0xE8, 0x10, 0x41, 0x89, 0x43, 0x14, 0x48, 0x8B, 0xCE, 0x58, 0x90, 0x90, 0x90, 0x90, 0x90 };
  7. UCHAR PointsSignature[] = { 0x41, 0xFF, 0x4B, 0x14, 0x48, 0x8B, 0xCE, 0xE8, 0xDA, 0x1B, 0x00, 0x00 };
  8.  
  9. VOID MakeJump( DWORD64 from, DWORD64 to, CHAR* jmpbytes ) //works only with 32bit code.
  10. {
  11.     jmpbytes[0] = 0xE9;
  12.  
  13.     *(DWORD64*)(jmpbytes + 1) = to - from - 5;
  14. }
  15.  
  16. VOID Make32Jump( DWORD64 from, DWORD64 to, CHAR* jmpbytes )
  17. {
  18.     jmpbytes[0] = 0xFF;
  19.     jmpbytes[1] = 0x24;
  20.     jmpbytes[2] = 0x25;
  21.  
  22.     *(DWORD*)(jmpbytes + 3) = to;
  23. }
  24.  
  25. CHAR* FindSignature( CHAR* dwStart, CHAR* dwEnd, UCHAR* szSignature, DWORD dwSize )
  26. {
  27.     do
  28.     {
  29.         if( memcmp( reinterpret_cast< void* >( dwStart ), szSignature, dwSize ) == NULL )
  30.         {
  31.             return dwStart;
  32.         }
  33.     } while( ++dwStart < dwEnd - dwSize );
  34.  
  35.     return ( CHAR* ) -1;
  36. }
  37.  
  38. BOOL FindProcessByName( TCHAR* ProcessName, PROCESSENTRY32* processEntry )
  39. {
  40.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );
  41.      
  42.     if( Process32First( hSnapshot, processEntry ) )
  43.     {
  44.         do
  45.         {
  46.             if( !_tcscmp( processEntry->szExeFile, ProcessName ) )
  47.             {
  48.                 CloseHandle( hSnapshot );
  49.                 return TRUE;
  50.             }
  51.         } while ( Process32Next( hSnapshot, processEntry ) );
  52.     }
  53.  
  54.     CloseHandle( hSnapshot );
  55.     return FALSE;
  56. }
  57.  
  58. BOOL FindModuleByName( TCHAR* ModuleName, MODULEENTRY32* moduleEntry, DWORD dwProcessId )
  59. {
  60.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
  61.  
  62.     if( hSnapshot == INVALID_HANDLE_VALUE )
  63.     {
  64.         std::wcout << L"Something went wrong with ToolHelp func. Code: " << GetLastError( ) << L"\n";
  65.         return FALSE;
  66.     }
  67.  
  68.     if( Module32First( hSnapshot, moduleEntry ) )
  69.     {
  70.         do
  71.         {
  72.             std::wcout << moduleEntry->szModule << L"\n";
  73.  
  74.             if( !_tcscmp( moduleEntry->szModule, ModuleName ) )
  75.             {
  76.                 return TRUE;
  77.             }
  78.         } while( Module32Next( hSnapshot, moduleEntry ) );
  79.     }
  80.     else
  81.     {
  82.         std::wcout << L"Could not find first module. " <<  GetLastError() << "\n";
  83.     }
  84.  
  85.     CloseHandle( hSnapshot );
  86.     return FALSE;
  87. }
  88.  
  89.  
  90. int _tmain(int argc, _TCHAR* argv[])
  91. {
  92.     DWORD dwFuncAddress;
  93.  
  94.     TCHAR* szProcessName = _T( "SpiderSolitaire.exe" );
  95.     PROCESSENTRY32 *pProcessEntry = new PROCESSENTRY32;
  96.  
  97.     pProcessEntry->dwSize = sizeof( PROCESSENTRY32 );
  98.  
  99.     if( FindProcessByName( szProcessName, pProcessEntry ) )
  100.     {
  101.         MODULEENTRY32* moduleEntry = new MODULEENTRY32;
  102.  
  103.         moduleEntry->dwSize = sizeof( MODULEENTRY32 );
  104.  
  105.         if( FindModuleByName( szProcessName, moduleEntry, pProcessEntry->th32ProcessID ) )
  106.         {
  107.             HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pProcessEntry->th32ProcessID );
  108.  
  109.             CHAR* ucModule = new CHAR[ moduleEntry->modBaseSize ];
  110.  
  111.             if( ReadProcessMemory( hProcess, moduleEntry->modBaseAddr, ucModule, moduleEntry->modBaseSize, NULL ) )
  112.             {
  113.                 CHAR* cOffset = (CHAR*)(moduleEntry->modBaseAddr + (DWORD)FindSignature( ucModule, ucModule + moduleEntry->modBaseSize, PointsSignature, sizeof( PointsSignature ) ) - (DWORD)ucModule );
  114.  
  115.                 if( ( DWORD )cOffset != -1 )
  116.                 {
  117.                     DWORD dwOlpProtect;
  118.                     CHAR cWriteMem[ sizeof( InjCode ) * 5 ] = { 0x0 };
  119.                    
  120.                     DWORD dwFuncAddress = (DWORD)( moduleEntry->modBaseAddr + (DWORD)FindSignature( ucModule, ucModule + moduleEntry->modBaseSize, (UCHAR*)cWriteMem, sizeof( cWriteMem ) ) - (DWORD)ucModule );
  121.  
  122.                     if( dwFuncAddress != -1 )
  123.                     {
  124.                         dwFuncAddress += sizeof( InjCode ) * 2;
  125.  
  126.                         std::cout << "Function will be written in " << (DWORD*)dwFuncAddress << ".\n";
  127.  
  128.                         if( VirtualProtectEx( hProcess, (VOID*)dwFuncAddress, sizeof( InjCode ), PAGE_EXECUTE_READWRITE, &dwOlpProtect ) )
  129.                         {
  130.                             CHAR cJmpCode[5];
  131.  
  132.                             MakeJump( (DWORD)dwFuncAddress + sizeof( InjCode ) - sizeof( cJmpCode ), (DWORD)(cOffset + sizeof( cJmpCode )), cJmpCode );
  133.  
  134.                             memcpy_s( InjCode + sizeof( InjCode ) - sizeof( cJmpCode ), sizeof( cJmpCode ), cJmpCode, sizeof( cJmpCode ) );
  135.  
  136.                             if( WriteProcessMemory( hProcess, (DWORD*)dwFuncAddress, InjCode, sizeof( InjCode ), NULL ) )
  137.                             {
  138.                                 CHAR cJmpToFunc[7];
  139.                            
  140.                                 MakeJump( (DWORD)cOffset, dwFuncAddress, cJmpToFunc );
  141.  
  142.                                 *(SHORT*)(&cJmpToFunc[5]) = 0x9090;
  143.  
  144.                                 if( WriteProcessMemory( hProcess, cOffset, cJmpToFunc, sizeof( cJmpToFunc ), NULL ) )
  145.                                 {
  146.                                     std::cout << "Memory patched!\n";
  147.                                 }
  148.                                 else
  149.                                 {
  150.                                     std::cout << "Could not patch jump.\n";
  151.                                 }
  152.                             }
  153.                             else
  154.                             {
  155.                                 std::cout << "Could not write function.\n";
  156.                             }
  157.                         }
  158.                         else
  159.                         {
  160.                             std::cout << "Could not get permission to patch the memory. Code: " << GetLastError() << "\n";
  161.                         }
  162.                     }
  163.                 }
  164.                 else
  165.                 {
  166.                     std::cout << "Could not find offset. Ask author to update this programm.\n";
  167.                 }
  168.             }
  169.  
  170.             delete [] ucModule;
  171.             CloseHandle( hProcess );
  172.         }
  173.  
  174.         getchar();
  175.     }
  176.  
  177.     return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment