Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как определить откуда был запущен процесс

Delphi , Программа и Интерфейс , Процессы и Сервисы



Автор: TAPAKAH
WEB-сайт: http://forum.vingrad.ru

Есть handle запущенного PE файла. Как определить откуда он был запущен? Я так предполагаю что getmodulefilename как и GetModuleHandle работает в рамках только своего процесса. А решить твою задачу .. можно так: Тут парочка моих любимых функций:

uses
  tlhelp32;

type
  TModuleArray = array of TModuleEntry32;

  // Возвращает список описаний (TModuleEntry32) модулей по идентификатору процесса

function GetModulesListByProcessId(ProcessId: Cardinal): TModuleArray;

implementation

function GetModulesListByProcessId(ProcessId: Cardinal): TModuleArray;
var
  hSnapshot: THandle;
  lpme: TModuleEntry32;

  procedure AddModuleToList;
  begin
    SetLength(Result, High(Result) + 2);
    Result[high(Result)] := lpme;
  end;

begin
  SetLength(Result, 0);
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  if hSnapshot = -1 then
    RaiseLastWin32Error;
  lpme.dwSize := SizeOf(lpme);
  if Module32First(hSnapshot, lpme) then
  begin
    AddModuleToList;
    while Module32Next(hSnapshot, lpme) do
      AddModuleToList;
  end;
end;

Исходный код

var
  Wnd: hWnd;
  buff: array[0..127] of Char;
  //------------------------------------
  Pid: Cardinal;
  modarr: TModuleArray;
  Name: string;
  //------------------------------------
begin
  StringGrid1.RowCount := 1;
  Wnd := GetWindow(Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      fillchar(name, sizeof(name), #0);
      GetWindowText(wnd, buff, sizeof(buff));

      // if getmodulefilename(GetWindowLong(wnd,GWL_HINSTANCE),name,sizeof(name))=0
      // then name:='Null';
      //-----------------------------------------
      GetWindowThreadProcessId(Wnd, @Pid);
      modarr := GetModulesListByProcessId(Pid);
      name := 'Null';
      for i := 0 to High(modarr) do
      begin
        if Integer(modarr[i].modBaseAddr) = $400000 then
        begin
          name := modarr[i].szExePath;
          break;
        end;
      end;
      //-----------------------------------------
      StringGrid1.Cells[0, StringGrid1.RowCount - 1] := StrPas(buff);
      StringGrid1.Cells[1, StringGrid1.RowCount - 1] := StrPas(name);
      StringGrid1.RowCount := StringGrid1.RowCount + 1;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
  StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;

Первый код, написанный на языке Delphi, использует функции Windows API для перебора окон и модулей процесса.

Для определения места запуска процесса можно использовать функцию GetStartupInfo, которая возвращает информацию о характеристиках запуска процесса. В частности, поле lpDesktop содержит имя рабочего стола, на котором был запущен процесс.

Однако данный подход может не подходить для ваших требований, потому что он работает только для процессов, запущенных с рабочего стола.

В коде, который вы предоставили, нет прямого способа определить место запуска PE-файла. Функция GetModuleFileName возвращает путь к файлу модуля, но не предоставляет информации о том, как был запущен процесс или что спровоцировало его выполнение.

Альтернативный подход, который вы упомянули, использует юнит tlhelp32 и функции CreateToolhelp32Snapshot, Module32First и Module32Next для перебора модулей процесса. Однако он не предоставляет информации о месте запуска процесса.

Чтобы достичь вашего цели, вам может потребоваться использовать дополнительные техники, такие как:

  1. Анализ системы реестра для записей запуска.
  2. Мониторинг системных событий и логирование событий создания процессов.
  3. Использование API, которые предоставляют информацию о выполнении процесса, таких как CreateProcess или ShellExecute.

Вот модифицированная версия вашего кода, которая демонстрирует использование функции GetStartupInfo:

procedure GetProcessStartupInfo(ProcessId: Cardinal);
var
  psi: TStartupInfo;
begin
  GetStartupInfo(ProcessId, psi);
  // psi.lpDesktop содержит имя рабочего стола, на котором был запущен процесс
end;

function GetModulesListByProcessId(ProcessId: Cardinal): TModuleArray; // ... (rest of your code remains the same)

procedure TForm1.Button1Click(Sender: TObject);
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
  Pid: Cardinal;
  modarr: TModuleArray;
  Name: string;
begin
  // ... (rest of your code remains the same)

  GetWindowThreadProcessId(Wnd, @Pid);
  modarr := GetModulesListByProcessId(Pid);

  for i := 0 to High(modarr) do
  begin
    if Integer(modarr[i].modBaseAddr) = $400000 then
    begin
      Name := modarr[i].szExePath;
      break;
    end;
  end;

  // Get the startup info of the process
  GetProcessStartupInfo(Pid);

  // psi.lpDesktop contains the name of the desktop where the process was started
  StringGrid1.Cells[0, StringGrid1.RowCount - 1] := 'Startup Desktop: ' + psi.lpDesktop;
  StringGrid1.Cells[1, StringGrid1.RowCount - 1] := StrPas(Name);
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
end;

Обратите внимание, что функция GetProcessStartupInfo не является стандартной функцией Delphi и может требовать дополнительных библиотек или импортов. Кроме того, данный подход работает только для процессов, запущенных с рабочего стола.

В статье описано, как использовать функции из библиотеки ToolHelp для определения источника запуска процесса PE-файла по его handle.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:31:39/0.0036189556121826/0