Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EXE внутри EXE [D7, Win2k]


Страницы:   1 2

ev ©   (2005-08-03 11:02:00) 

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

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


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

Так.

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


Джо   (2005-08-07 05:58:00) [2]

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


Джо   (2005-08-07 05:54:00) [3]

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


pasha_golub   (2005-08-07 04:59:00) [4]

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

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


pasha_golub   (2005-08-07 04:56:00) [5]

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

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

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

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


Leonid Troyanovsky   (2005-08-05 13:07:00) [6]


> 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-05 12:13:00) [7]

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

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

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

---
Regards, PMG


Leonid Troyanovsky   (2005-08-05 09:03:00) [8]


> 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.


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

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

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


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

2 ev   (05.08.05 01:12) [16]

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

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


pasha_golub   (2005-08-05 01:19:00) [11]

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


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

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

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


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

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

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

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

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


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

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

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


3DxFantastika   (2005-08-04 07:45:00) [15]

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

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


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

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

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

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


pasha_golub   (2005-08-03 23:51:00) [17]

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

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


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

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

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


Leonid Troyanovsky   (2005-08-03 20:11:00) [19]


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


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

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


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

--
Regards, LVT.


pasha_golub   (2005-08-03 19:46:00) [20]

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

Однако, под 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;



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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо