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

Вниз

EXE внутри EXE   Найти похожие ветки 

 
ev   (2005-08-03 11:02) [0]

возникла необходимость поместить в мою программу EXE файл
поместил в ресурс

далее можно сохранить на диск и выполнить
но хотелось бы выполнить этот EXE не сохраняя на диск
такое возможно?


 
Digitman ©   (2005-08-03 12:07) [1]


> хотелось бы выполнить


в контексте того же (текущего) процесса - да, но с рядом ограничений

в контексте отдельно стартуемого процесса - только теоретически, ибо документированных способов для этого нет.


 
ev   (2005-08-03 13:00) [2]

> в контексте того же (текущего) процесса - да, но
> с рядом ограничений
как?


 
Digitman ©   (2005-08-03 13:14) [3]

уж точно  - не парой строк кода


 
Defunct ©   (2005-08-03 13:17) [4]

> ev  

Вирусы писать нехорошо


 
Dust ©   (2005-08-03 14:01) [5]

а если это не вирус, а самописный инсталятор например...


 
Gydvin ©   (2005-08-03 14:17) [6]

Dust ©   (03.08.05 14:01) [5]

а если это не вирус, а самописный инсталятор например...

тогда это причем

ev   (03.08.05 11:02) [0];

помещай в ресурс


 
Digitman ©   (2005-08-03 14:23) [7]


> Dust ©   (03.08.05 14:01) [5]
> а если это не вирус, а самописный инсталятор например


а зачем "самописному инсталлятору" заниматься этим сомнительным по необходимости делом ?


 
pasha_golub ©   (2005-08-03 19:46) [8]

Вообщем-то, я такое реализовывал. Задача: фронтэнд к консольной утилитке.

Однако, под 9х у меня так и не вышло, кроме как сохранить на диск и потом запустить. А вот в семействе НТ вышло... Однако, хотелось бы увидеть, существуют ли еще методы?

У меня это выглядело так:


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;

Function GetConsoleOutput( CommandLine, Pass, ResName: String; var ResultCode: Cardinal ): String;
var
   //process launch and in/out stuff
   StdOutPipeRead,
   StdOutPipeWrite,
   StdInPipeRead,
   StdInPipeWrite: THandle;
   SA            : TSecurityAttributes;
   SI            : TStartupInfo;
   PI            : TProcessInformation;
   WasOK         : Boolean;
   Buffer        : array[0..1023] of Char;
   BytesRead     : Cardinal;
   Line          : String;
   Written       : DWORD;
   Passed        : boolean;
   //exe headers and resources stuff
   x, p, q: Pointer;
   NT: PIMAGE_NT_HEADERS;
   context: TContext;
   Sect: PIMAGE_SECTION_HEADER;
   nb, i: Cardinal;
   RS: TResourceStream;

Begin
  With SA do
  Begin
     nLength := SizeOf( SA );
     bInheritHandle := True;
     lpSecurityDescriptor := nil;
  end;
  CreatePipe( StdOutPipeRead,
              StdOutPipeWrite,
              @SA,
              0           );
  CreatePipe( StdInPipeRead,
              StdInPipeWrite,
              @SA,
              0           );
  try
   with SI do
   Begin
      FillChar( SI, SizeOf( SI ), 0 );
      cb := SizeOf( SI );
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE or SW_SHOWMINNOACTIVE;
      hStdInput := StdInPipeRead;
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
   end;
   Passed := false;
   //make sure that proper console starts: cmd.exe for NT,
   //<name>.exe extracted in another case
  IF (Win32platform <> VER_PLATFORM_WIN32_NT)
      then
    begin
     RS := TResourceStream.Create(HInstance,ResName,Pchar("EXEFILE"));
      try
     RS.SaveToFile(ResName+".exe");
     CommandLine := Format(CommandLine,[ResName+".exe"]);
     WasOK := CreateProcess( nil,
                       PChar(Commandline),
                       nil,
                       nil,
                       True,
                       0,
                       nil,
                       nil,
                       SI,
                       PI );
      finally
     RS.Free;
      end;
    end
   else //if win_nt
    begin
     CommandLine := Format(CommandLine,["cmd.exe"]);
     WasOK := CreateProcess( nil,
                         PChar(Commandline),
                         nil,
                         nil,
                         True,
                         CREATE_SUSPENDED,
                         nil,
                         nil,
                         SI,
                         PI );
     // start extracting resource
     Context.ContextFlags := CONTEXT_INTEGER;
     GetThreadContext(PI.hThread, Context);

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

     P := LockResource(LoadResource(Hinstance, FindResource(
                           Hinstance, Pchar(ResName), Pchar("EXEFILE"))));

     if P = nil then
       raise Exception.Create("Can""t extract resources!");
     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
          WasOK := 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; //end of exporting resource to cmd.exe

   CloseHandle( StdOutPipeWrite );
   CloseHandle( StdInPipeRead );
   if not WasOK then
    raise Exception.Create( "Can""t start process: "#10#13 +
            CommandLine )
   else
     try
       Line := "";
       Repeat
          // read block of data
          WasOK := ReadFile( StdOutPipeRead, Buffer, 1023, BytesRead, nil );
          // is there anything to read
          if BytesRead > 0 then
          Begin
             Buffer[BytesRead] := #0;
             // add buffer
             Line := Line + Buffer;
          end;
         If not Passed AND
            (Pos("PASSWORD:",AnsiUpperCase(Line)) > 0) then
           begin
             Line := StringReplace(Line,"password:","",[rfIgnoreCase]);
             Pass := Pass + #13#10; //add carriage return
             WasOk := WriteFile(StdinPipeWrite,Pass[1],length(Pass),Written,nil);
             Passed := true; //passed authorization
           end;
       Until not WasOK or ( BytesRead = 0 );
       // wait console
       WaitForSingleObject( pi.hProcess, INFINITE );
       ResultCode := 0;
       GetExitCodeProcess( pi.hProcess, ResultCode );
     finally
       // close descriptors
       CloseHandle( PI.hThread );
       CloseHandle( pi.hProcess );
     end;
  finally
    Result := Line;
    CloseHandle( StdOutPipeRead );
    CloseHandle( StdInPipeWrite );
    SysUtils.DeleteFile(ResName+".exe");
end;
end;



Если честно, то танцы с записью в память процесса для меня так и остались тайной. Что именно пишется и зачем, я могу только предполагать.


 
Leonid Troyanovsky ©   (2005-08-03 20:11) [9]


> pasha_golub ©   (03.08.05 19:46) [8]
> Вообщем-то, я такое реализовывал. Задача: фронтэнд к
..
> У меня это выглядело так:


"Такое", "так" - реализовывал Gary Nebbett.

> Если честно, то танцы с записью в память процесса для меня
> так и остались тайной. Что именно пишется и зачем, я могу
> только предполагать.


Именно поэтому и тайна.

--
Regards, LVT.


 
ev   (2005-08-03 22:42) [10]

> Вирусы писать нехорошо
при чем тут вирусы?
когда человек спросит как в файл байт записать - тоже вирус пишет? :)

можно ли как-либо еще прицепить к своему EXE второй и выполнить его без сохранения на диск?


 
pasha_golub ©   (2005-08-03 23:51) [11]

Leonid Troyanovsky ©   (03.08.05 20:11) [9]
Не, ну дорогой товарищ. Я и не присваиваю себе лавры. Уж, поверьте меньше всего я надеялся, что код, обошедший полнета, будет воспринят как мой. ;-)

Именно поэтому и тайна.
Ну, так раскройте ее мне сирому, о загадочный покровитель. :0)


 
Германн ©   (2005-08-04 02:00) [12]

Автор сабжа - анонимный. Это - раз.

"возникла необходимость поместить в мою программу EXE файл" - никак необъяснена сия необходимость. Это - два.

"когда человек спросит как в файл байт записать - тоже вирус пишет? :)" - А это смотря в какой файл! Может и вирус. Это - три.


 
3DxFantastika ©   (2005-08-04 07:45) [13]

"вирус/не вирус" , про презумпцию невиновности забыли?

между прочим есть статья за клевету ...


 
ev   (2005-08-04 22:20) [14]

> Автор сабжа - анонимный
наверное ник не заметил... бывает :)
и если надо написать вирус я сразу через 100 проксей сидеть буду и ник скрывать? детсад блин :)

есть еще варианты?
работают ведь упаковщики (например, asprotect)


 
Германн ©   (2005-08-05 01:01) [15]

2 ev   (04.08.05 22:20) [14]
>> Автор сабжа - анонимный
>наверное ник не заметил... бывает :)

Ник заметил, но он "анонимный"! Я, ты, он, они  и т.д. могут постить под сим ник"ом!

>и если надо написать вирус я сразу через 100 проксей сидеть >буду и ник скрывать? детсад блин :)
А чё его скрывать? Или у тебя есть "документированные" права на ник "ev"?

>есть еще варианты?
>работают ведь упаковщики (например, asprotect)
Кто тут назвал AsProtect упаковщиком?


 
ev   (2005-08-05 01:12) [16]

> Или у тебя есть "документированные" права на ник "ev"?
мне они не нужны :)

> Кто тут назвал AsProtect упаковщиком?
сорри, не совсем верно выразился... бывает...
но я думаю все поняли что я имел ввиду :)
предлагаю не отходить от темы...


 
pasha_golub ©   (2005-08-05 01:19) [17]

ребята, если кто знает, поделитесь плиз инфой как работает код, приведенный мой. Интересует часть с записью данных в память процесса только лишь...


 
Германн ©   (2005-08-05 01:25) [18]

2 ev   (05.08.05 01:12) [16]

>сорри, не совсем верно выразился... бывает...
>но я думаю все поняли что я имел ввиду :)
Я - не понял.

>предлагаю не отходить от темы..
>>есть еще варианты?
>>работают ведь упаковщики (например, asprotect)
Чем "упаковщики" или AS... соответствуют теме?


 
ev   (2005-08-05 01:37) [19]

> Чем "упаковщики" или AS... соответствуют теме?
упаковщик в себе содержит распаковщик и сам EXE
AS аналогично + проверки всякие (кстати, он тоже упаковывает, поэтому его можно назвать упаковщиком)

задача схожая - сначала должен отработать мой код, а потом запустить (или нет) "чужой" EXE


 
Leonid Troyanovsky ©   (2005-08-05 09:03) [20]


> pasha_golub ©   (05.08.05 01:19) [17]
> ребята, если кто знает, поделитесь плиз инфой как работает
> код, приведенный мой. Интересует часть с записью данных
> в память процесса только лишь...


WriteProcessMemory.

Еще раз: "не мой, а by Gary Nebbett".

http://groups.google.com/group/microsoft.public.win32.programmer.kernel/msg/fb58c55a2edd8e88

И хватит фрейдистких оговорок.

--
Regards, LVT.


 
pasha_golub ©   (2005-08-05 12:13) [21]

Leonid Troyanovsky ©   (05.08.05 09:03) [20]
Тьфу ты, не мой, ессно, а приведенный мНой. Это да.

Это уже не Гарри Неббет, а по мотивам Гарри Неббета. Может быть ибо глянул я ссылку. И где же, дорогой мой коллега, вы увидели эквивалентность?

И хватит фрейдистких оговорок.
Идиотская фраза.

---
Regards, PMG


 
Leonid Troyanovsky ©   (2005-08-05 13:07) [22]


> pasha_golub ©   (05.08.05 12:13) [21]

> Это уже не Гарри Неббет, а по мотивам Гарри Неббета. Может
> быть ибо глянул я ссылку. И где же, дорогой мой коллега,
> вы увидели эквивалентность?


Это мой перевод кода Gary на дельфи:

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

--
Regards, LVT.

ЗЫ В моем ignore list ты можешь стать первым.


 
pasha_golub ©   (2005-08-07 04:56) [23]

Leonid Troyanovsky ©   (05.08.05 13:07) [22]
Леонид, у вас проблемы? Вы хотите об этом поговорить? Не стоит гнуть пальцы.

Конкретно, в чем проблема, дорогой мой друг? Вы читать умеете?

Написано "у меня это было реализовано так", то так оно и было!  В другой раз было написанно "код, приведенный мной". Он таки приведен мной.

И конечно же верх гениальности пугать кого-то игнорлистом. Может еще заплачете?


 
pasha_golub ©   (2005-08-07 04:59) [24]

Или может Гарри ваш близкий друг? Или родственник?

Вы уж подскажите мне как себя вести. А то так и умру невеждой, да еще и в игнорлисте у такого уважаемого человека.


 
Джо ©   (2005-08-07 05:54) [25]

Уважаемый LVT, заодно с Пашей и меня сразу в игнорлист заносите, ибо, по моему мнению, суть ваших претензий - исключительно бредовая. Уж не обессудьте, просто мнение постороннего человека.


 
Джо ©   (2005-08-07 05:58) [26]

Кстати, код, приведенный Пашей, я, помнится встречал в инете несколько раз - и все с разными вариациями. Или вы считаете, что только вы удосужились "перевести" код весьма уважаемого Гарри? Или, скорее, "пересказать"?


 
Юрий Зотов ©   (2005-08-07 07:54) [27]

Так.

По сабжу уже давно ничего не говорится и вряд ли что новое будет сказано. Зато набирает обороты непонятный конфликт. Так вот - пока он их не набрал, ветку закрываю. При желании отношения можно выяснить по мылу (но хочется надеяться, что такого желания ни у кого не возникнет).



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

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

Наверх




Память: 0.56 MB
Время: 0.033 c
6-1116052678
Chaser
2005-05-14 10:37
2005.08.28
Защита от автоматической регистрации сайтов


1-1123237260
officeman
2005-08-05 14:21
2005.08.28
бесконечная запись в файл


1-1123213552
Viktop
2005-08-05 07:45
2005.08.28
Изменить высоту элемента в TreeView


1-1123516665
Zer0
2005-08-08 19:57
2005.08.28
запуск метода сразу после заверщения работы FormCreate


10-1080215297
Max_Fin
2004-03-25 14:48
2005.08.28
DCOM и LPSTR