Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Загрузка чужого приложения


Автор: tigger 24.5.2008, 18:54
Можно ли средствами Delphi запустить другую программу например notepad.exe от имени explorer.exe (т.е как будто бы запуск программы был из проводника).

Автор: aktuba 24.5.2008, 19:41
Цитата(tigger @  24.5.2008,  19:54 Найти цитируемый пост)
Можно ли средствами Delphi запустить другую программу например notepad.exe от имени explorer.exe (т.е как будто бы запуск программы был из проводника). 


Думаю да, но не средствами Delphi, а средствами системы. Например, внедрить dll в эксплорер, а у же эта dll запустить программу... Не факт, что сработает, но это первое, что пришло в голову...

Автор: Poseidon 25.5.2008, 01:15
tigger, позволь поинтересоваться, зачем такие извращения? Чувствуется мне что ты хочешь кое-чей HIPS надурить...

Автор: MadCoder 25.5.2008, 02:03
Можно:
Код

{
  Process Hijacking by Aphex
  http://www.iamaphex.cjb.net
  [email protected]

  Greets to dildog for giving me the idea.
}

program Project1;

{$IMAGEBASE $13140000}

uses
  Windows;

function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
  {now we are in notepad}
  LoadLibrary('kernel32.dll');
  LoadLibrary('user32.dll');
  MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
  MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
  MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
  MessageBox(0, 'See?', 'Hijacked Process', 0);
  MessageBox(0, 'Told you.', 'Hijacked Process', 0);
  MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
  MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
  ExitProcess(0);
  Result := 0;
end;

procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
  Module, NewModule: Pointer;
  Size, BytesWritten, TID: longword;
begin
  Module := Pointer(GetModuleHandle(nil));
  Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
  VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
  NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
  CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;

var
  ProcessHandle, PID: longword;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;

begin
  {lets make a new process}
  CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
  {give it some time to wake up}
  Sleep(500);
  {and hijack it!}
  GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  Inject(ProcessHandle, @Main);
  CloseHandle(ProcessHandle);
  {we have a copy of ourself running in notepad so we can exit}
end.


Описанный код внедряется в блокнот, пишет "из него" сообщения, удаляет главный exe-file и в конце закрывает блокнот. 
Все быстро и мажорно. Спасибо Aphex за предоставленные материалы (что с ним случилось кстати, вроде как посадили?)

Автор: tigger 25.5.2008, 04:02
Все спасибо.
Воспользовался просто ShellExecuteA.
В процесс внедряться мне не нужно, просто запуск не патч.

Автор: MetalFan 25.5.2008, 10:51
MadCoder, местами туповатый код. автор кода не знает, зачем в CreateProcess последний параметр?

Автор: MadCoder 25.5.2008, 17:49
Цитата(MetalFan @ 25.5.2008,  10:51)
MadCoder, местами туповатый код. автор кода не знает, зачем в CreateProcess последний параметр?

Главное, что работает и работает хорошо smile.

Автор: MetalFan 25.5.2008, 18:09
MadCoder, ну с таким подходом конечно все норм) не дай чорт разбираться с кодом таких "писателей"

Автор: ama_kid 25.5.2008, 18:30
Цитата(MetalFan @  25.5.2008,  10:51 Найти цитируемый пост)
автор кода не знает, зачем в CreateProcess последний параметр? 
Я думаю он не нужен, просто сделать nil (как в С++) не даст компилятор:
Цитата
Types of actual and formal var parameters must be identical

Автор: MetalFan 26.5.2008, 08:16
Цитата(ama_kid @  25.5.2008,  18:30 Найти цитируемый пост)
Я думаю он не нужен, просто сделать nil (как в С++) не даст компилятор:

нет, как раз очень нужен...
ладно, опишу все замеченные мной недочеты данного кода:

Код

var
  ProcessHandle, PID: longword;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
   //1. Где "очистка" структуры и установка STARTUPINFO.cb ?
  //2. здесь в ProcessInfo вернется вся необходимая информация о процессе.
  //3. Нет проверки результата функции CreateProcess
  CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
  //4.нах.я sleep? есть же WaitForInputIdle 
  Sleep(500);
  //5. следующие 2 строчки нах не нужны, ибо уже в ProcessInfo уже все есть
  GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  //
  Inject(ProcessHandle, @Main);
  //6. молодца, закрыли хэндл процесса, а хэндл потока из ProcessInfo?
  CloseHandle(ProcessHandle);
end;

Вот так вот... и это только по запуску процесса

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)