Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.03.2010, 04:52
Аватар для Crack502
Crack502 Crack502 вне форума
Начинающий
 
Регистрация: 05.01.2010
Сообщения: 125
Репутация: 10
Вопрос Открыть из архива

Помогите, как открыть .ехе файл из (res) архива?
__________________
Вот раньше, года этак в 60-е, было всё классно - sex, drugs & rock'n'roll. А сейчас? Suxx, bugs & plug'n'play...
Ответить с цитированием
  #2  
Старый 10.03.2010, 21:08
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

Код слепил с кусков, проверял вроде - работает:
Код:
{$R EXE.res}

Function ZwUnmapViewOfSection(SectionHandle: THandle; p: Pointer): DWord; stdcall;
         external 'ntdll.dll' name 'ZwUnmapViewOfSection';

Procedure RunExeFromMemory(Image:Pointer);
Var
 PI: TProcessInformation;
 SI: TStartupInfo;
 HView,Mem: Pointer;
 Headers: PIMAGENTHEADERS;
 Section: PIMAGESECTIONHEADER;
 Context: TContext;
 A,Size,Dummy: DWORD;
Const
 Mapping: Array[0..7] of DWORD=(PAGE_NOACCESS,PAGE_EXECUTE,PAGE_READONLY,PAGE_EXECUTE_READ,PAGE_READWRITE,
                                PAGE_EXECUTE_READWRITE,PAGE_READWRITE,PAGE_EXECUTE_READWRITE);
begin
 FillChar(SI,SizeOf(SI),0);
 SI.cb:= SizeOf(SI);
 Win32Check(CreateProcess(nil,'cmd.exe',nil,nil,False,CREATE_SUSPENDED,nil,nil,SI,PI));
 try
   try
     Context.ContextFlags:=CONTEXT_INTEGER;
     Win32Check(GetThreadContext(PI.hThread,Context));
     Win32Check(ReadProcessMemory(PI.hProcess,Pointer(Context.Ebx+8),@HView,SizeOf(HView),Size)and(Size=SizeOf(HView)));
     Win32Check(ZwUnmapViewOfSection(PI.hProcess,HView)=0);
     Headers:= PIMAGENTHEADERS(DWORD(Image)+PIMAGEDOSHEADER(Image)._lfanew);
     Mem:= VirtualAllocEx(PI.hProcess,Pointer(Headers.OptionalHeader.ImageBase),Headers.OptionalHeader.SizeOfImage,
                          MEM_RESERVE or MEM_COMMIT,PAGE_EXECUTE_READWRITE);
     Win32Check(Mem<>nil);
     Win32Check(WriteProcessMemory(PI.hProcess,Mem,Image,Headers.OptionalHeader.SizeOfHeaders,Size)and(Headers.OptionalHeader.SizeOfHeaders=Size));
     Section:= PIMAGESECTIONHEADER(Headers);
     Inc(PIMAGENTHEADERS(Section));
     For A:= 0 to Headers.FileHeader.NumberOfSections-1 do begin
      if Section.SizeOfRawData>0 then
        begin
         Win32Check(WriteProcessMemory(PI.hProcess,PChar(Mem)+Section.VirtualAddress,
                    PChar(Image)+Section.PointerToRawData,Section.SizeOfRawData,Size)and(Section.SizeOfRawData=Size));
         Win32Check(VirtualProtectEx(PI.hProcess,PChar(Mem)+Section.VirtualAddress,Section.SizeOfRawData,Mapping[Section.Characteristics shr 29],@Dummy));
        end;
        Inc(Section);
      end;
      Win32Check(WriteProcessMemory(PI.hProcess,Pointer(Context.Ebx+8),@Mem,SizeOf(Mem),Size)and(SizeOf(Mem)=Size));
      Context.Eax:=DWORD(Mem)+Headers.OptionalHeader.AddressOfEntryPoint;
      Win32Check(SetThreadContext(PI.hThread,Context));
      Win32Check(ResumeThread(PI.hThread)<>$FFFFFFFF);
    Except
      TerminateProcess(PI.hProcess,0);
      Raise;
    end;
  Finally
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;
end;

Procedure ResExe;
Var
 EHandle: THandle;
 EPointer: Pointer;
begin
 EHandle:= FindResource(hInstance, 'EXE', RT_RCDATA);
 if EHandle <> 0 then
  begin
   EHandle:= LoadResource(hInstance, EHandle);
    if EHandle <> 0 then
     begin
      EPointer:= LockResource(EHandle);
      RunExeFromMemory(EPointer);
      UnlockResource(EHandle);
      FreeResource(EHandle);
     end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ResExe;
end;

Параметр при создании Res файла.
Цитата:
EXE RCDATA LOADONCALL 1.exe
Ответить с цитированием
  #3  
Старый 11.03.2010, 06:58
Аватар для Crack502
Crack502 Crack502 вне форума
Начинающий
 
Регистрация: 05.01.2010
Сообщения: 125
Репутация: 10
По умолчанию

Спасибо. Попробую.
__________________
Вот раньше, года этак в 60-е, было всё классно - sex, drugs & rock'n'roll. А сейчас? Suxx, bugs & plug'n'play...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter