Главная страница
    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.48 MB
Время: 0.042 c
2-1165786800
Евгений Р.
2006-12-11 00:40
2006.12.31
Присвоить значение свойству Set


1-1163360090
RASkov
2006-11-12 22:34
2006.12.31
"Всплывающее окно"


15-1165579907
Павел Калугин
2006-12-08 15:11
2006.12.31
Спасите, лаба горит...


15-1165871895
IMHO
2006-12-12 00:18
2006.12.31
Слово о eDonkey


15-1165440373
Arturrr
2006-12-07 00:26
2006.12.31
задача по физике





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