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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.039 c
3-1121418159
vigo
2005-07-15 13:02
2005.08.28
Подключение к Oracle


4-1120431833
cranium
2005-07-04 03:03
2005.08.28
Как получить список физических дисков и их тип


8-1112443806
dimka@cs
2005-04-02 16:10
2005.08.28
уровень громкости


4-1121056430
Untermensch
2005-07-11 08:33
2005.08.28
Как заставить систему выйти диалапом в инет и обратно.


3-1121337516
Dysan
2005-07-14 14:38
2005.08.28
язык запросов к XML





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