Главная страница
    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.47 MB
Время: 0.044 c
1-1163315458
Axis_of_Evil
2006-11-12 10:10
2006.12.31
TListBox с ручной отрисовкой


1-1163359257
AlexeyT
2006-11-12 22:20
2006.12.31
Готовый диалог настройки Toolbar?


15-1165495853
sergey888
2006-12-07 15:50
2006.12.31
Сегодня побит температурный рекорд


15-1165856358
Kolan
2006-12-11 19:59
2006.12.31
Вот, теперь руковожу 3 студентами :)


11-1142941853
glesik
2006-03-21 14:50
2006.12.31
Звук при нажатии Enter или Esc





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский