Как получить имя exe'шника по дескриптору окна?

Тема в разделе "WASM.WIN32", создана пользователем BreakPointMAN, 23 июн 2006.

  1. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    Собственно, сабж. В данный момент я использую функции GetWindowThreadProcessId + CreateToolhelp32Snapshot/Process32First/Process32Next и OpenProcess/GetModuleFileNameEx, однако это не всегда дает положительный результат. В программе CyberManiac'а InqSoft Window Scanner (большой респект ему за такой великолепный инструмент!) есть "получение имени файла модуля внедрением DLL". Если это не представляет большого секрета, как именно это сделано? :)
     
  2. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    Код (Text):
    1. // Для начала определяешь какому процессу принадлежит окно:
    2.  
    3. Var pProcID : ^DWORD;
    4. begin
    5.  GetMem (pProcID, SizeOf (DWORD));
    6.  GetWindowThreadProcessId (WinHandle, pProcID);
    7. end;
    8.  
    9. // а после этого используешь TProcessEntry32 примерно так:
    10.  
    11. function GetExeNameByProcID (ProcID : DWord) : String;
    12. var
    13.  ContinueLoop   : BOOL;
    14.  FSnapshotHandle : THandle;
    15.  FProcessEntry32 : TProcessEntry32;
    16. begin
    17.  FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    18.  
    19.  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
    20.  
    21.  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    22.  
    23.  Result := '';
    24.  while (Integer (ContinueLoop) <> 0) and (Result='') do
    25.  begin
    26.   if FProcessEntry32.th32ProcessID = ProcID then
    27.    Result := FProcessEntry32.szExeFile;
    28.   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    29.  end;
    30. end;
    31.  
    32. // Не забудь в uses добавить Tlhelp32




    PS Просто рипнул из хелпа, это не моё. Может реализуешь неправильно?
     
  3. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    PE_Kill, спасибо, но примерно так у меня все и реализовано. Меня интересует именно "получение имени файла модуля внедрением DLL".
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    GetWindowThreadProcessId

    OpenProcess

    WriteProcessMemory

    CreateRemoteThread



    Поиск рулит, о инжекте кода здесь кучу раз говорили.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Внедрение длл (см. выше и статьи) + GetModuleFileName(0,...)
     
  6. santOS

    santOS New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2005
    Сообщения:
    6
    Адрес:
    Russia
    Используем EnumProcessModules и GetModuleFileNameEx,

    для первого "модуля" получается полный путь до ехе, создавшего процесс.



    И не надо никаких DLL... ;)
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    вызвав из DLL

    GetModuleFileName(NULL, lpFilename, nSize);

    ?
     
  8. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    У меня прекрасно работает способ с ToolHelp API. Если не срабатывает полностью Process32*, используется Module32*. Алгоритм используется для получения иконок у упрямых процессов.