Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Как загрузить программу из resource в память и запустить её отту   Найти похожие ветки 

 
Алексей222   (2006-08-20 01:58) [0]

Как загрузить программу из resource  в память и запустить её оттуда.

Есть exe, в нем вшит модуль обновления, его необходимо вытащить из файла, загрузить в память и запустить его оттуда.

hExe := LoadLibrary(pansichar(application.exename));
hRes := FindResource(hExe, "update.exe", "update");
hResLoad := LoadResource(hExe, hRes);
lpResLock := LockResource(hResLoad);

?


 
atruhin ©   (2006-08-20 08:21) [1]

Уже обсуждалось, документированно никак, есть хакерские методы, но работоспособность не гарантированна.


 
Алексей222   (2006-08-20 09:53) [2]

Да какие уж там хакерские, все проще простого, на уровне первого года изучения delphi, если с испоьзованием rxtypes или программирования .net. А без этого как сделать.


 
Алексей222   (2006-08-20 10:19) [3]

Почему вот это дело не пашет? rxtypes в каталоге resxplorer в делфи который встроен.

program Project1;

uses
 Windows,
 sysutils,
 rxtypes in "Rxtypes.pas";

{$R ResX.res}

Var
nb, i: Cardinal;

function ZwUnmapViewOfSection(SectionHandle: THandle;
 p: Pointer): DWord; stdcall; external "ntdll.dll";

function protect(characteristics: ULONG): ULONG;
const  mapping: array [0..7] of ULONG =
 ( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
   PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE,
PAGE_EXECUTE_READWRITE);
begin
 Result := mapping[characteristics shr 29];
end;

var
 pi: TProcessInformation;
 si: TStartupInfo;
 x, p, q: Pointer;
 nt: PIMAGE_NT_HEADERS;
 context: TContext;
 sect: PIMAGE_SECTION_HEADER;
begin
 si.cb := SizeOf(si);
 CreateProcess(nil, "update_m.exe", nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, si, pi);

 context.ContextFlags := CONTEXT_INTEGER;
 GetThreadContext(pi.hThread,  context);

ReadProcessMemory(pi.hProcess,
 PCHAR(context.ebx) + 8,
  @x, sizeof (x),
  nb
  );

 ZwUnmapViewOfSection(pi.hProcess, x);

 p := LockResource(LoadResource(Hinstance, FindResource(Hinstance, "update.exe", "update")));

if p = nil then exit;

 nt := PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p).e_lfanew);

 q := VirtualAllocEx( pi.hProcess,
                      Pointer(nt.OptionalHeader.ImageBase),
                      nt.OptionalHeader.SizeOfImage,
                      MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);

 WriteProcessMemory(pi.hProcess, q, p, nt.OptionalHeader.SizeOfHeaders, nb);

 sect := PIMAGE_SECTION_HEADER(nt);
 Inc(PIMAGE_NT_HEADERS(sect));

 for I := 0 to nt.FileHeader.NumberOfSections - 1 do
   begin
       WriteProcessMemory(pi.hProcess,
                          PCHAR(q) + sect.VirtualAddress,
                          PCHAR(p) + sect.PointerToRawData,
                          sect.SizeOfRawData, nb);

       VirtualProtectEx( pi.hProcess,
                         PCHAR(q) + sect.VirtualAddress,
                         sect.SizeOfRawData,
                         protect(sect.Characteristics),
                         @x);
       Inc(sect);
   end;

 WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, @q, sizeof(q), nb);

 context.Eax := ULONG(q) + nt.OptionalHeader.AddressOfEntryPoint;

 SetThreadContext(pi.hThread, context);

 ResumeThread(pi.hThread);
end.


 
atruhin ©   (2006-08-20 10:29) [4]

> Да какие уж там хакерские

Не вникал в код. Но это методы не документированные Microsoft. Т.е. например могут не работать в Viste. А чем тебя не устраивает простой вариант, сохранить файл на диск и запустить?


 
Ketmar ©   (2006-08-20 13:03) [5]

> [3] Алексей222   (20.08.06 10:19)
аднака. вот и видно, что на уровне первого года. ну зачем пытаться загрузить PE руками? а если уж пытаешься, так хоть бы relocs обрабатывал...


 
Leonid Troyanovsky ©   (2006-08-20 14:19) [6]


> Алексей222   (20.08.06 10:19) [3]

> Почему вот это дело не пашет?


Найди 10 отличий.

http://groups.google.com/group/fido7.ru.delphi/msg/dbf6083b8b7fbee4

--
Regards, LVT.


 
Сергей М. ©   (2006-08-21 11:31) [7]


> Алексей222   (20.08.06 10:19) [3]
>
> Почему вот это дело не пашет?


В общем случае это и не обязано "пахать".
Да и к оригинальному вопросу это не имеет отношения.


 
Leonid Troyanovsky ©   (2006-08-21 18:48) [8]


> Сергей М. ©   (21.08.06 11:31) [7]

> Да и к оригинальному вопросу это не имеет отношения.


Некоторое, все же, имеет.
Скажем, навеяно by Gary Nebbett.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
9-1140905412
KreeS
2006-02-26 01:10
2006.12.31
Z-Order


2-1165818559
Сергей Ю
2006-12-11 09:29
2006.12.31
Работа с socket-ами и sql в одном приложении=многопоточность?


15-1165569209
AntiUser
2006-12-08 12:13
2006.12.31
Какие есть типы лицензий компьютерного обеспечения?


10-1127113531
TER
2005-09-19 11:05
2006.12.31
сервер с библиотекой типов


11-1141892974
Andr-04
2006-03-09 11:29
2006.12.31
Цвет текста RichEdit через Font