Как узнать каким приложением создан процесс ?

Тема в разделе "WASM.WIN32", создана пользователем Tampabelle, 27 апр 2005.

  1. Tampabelle

    Tampabelle New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    5
    Как узнать каким приложением создан процесс ?

    Такая информация точно есть -- сисинтерналовский эксплорер показывает. Вопрос где её взять самому ?

    Спасибо
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Tampabelle

    поискать слабо?

    ZwQueryInformationProcess (ProcessBasicInformation class(InheritedFromUniqueProcessId)



    кусок из ntddk.inc

    ; +

    ; Basic Process Information

    ; NtQueryInformationProcess using ProcessBasicInfo

    ; -



    PROCESS_BASIC_INFORMATION STRUCT ; sizeof = 18h

    ExitStatus NTSTATUS ?

    PebBaseAddress PVOID ? ; PPEB

    AffinityMask DWORD ?

    BasePriority DWORD ? ; KPRIORITY

    UniqueProcessId DWORD ?

    InheritedFromUniqueProcessId DWORD ?

    PROCESS_BASIC_INFORMATION ENDS

    PPROCESS_BASIC_INFORMATION typedef PTR PROCESS_BASIC_INFORMATION
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Вот завалялся сэмпл убития родительского процесса
    Код (Text):
    1. .code
    2. ;=====================================================================
    3. ntdll      db      'ntdll.dll',0
    4. zwqip      db      'NtQueryInformationProcess',0
    5. ;=====================================================================
    6. start:     assume  fs:nothing              ; берем PID
    7.        mov     eax,fs:[18h]            ; текущего
    8.        mov     eax,[eax+20h]           ; процесса (можно использовать GetCurrentProcessId)
    9.        invoke  OpenProcess,PROCESS_QUERY_INFORMATION,1,eax ; получаем handle
    10.        sub     esp,6*4             ; выделяем в стеке место под структуру PROCESS_BASIC_INFORMATION
    11.        mov     ecx,esp             ; адресс её ещё пригодиться
    12.        push    0                   ; ниже заполняем параметры
    13.        push    6*4                 ; для вызова
    14.        push    ecx                 ; NtQueryInformationProcess
    15.        push    0                   ;
    16.        push    eax                 ; handle нашего процесса
    17.        invoke  GetModuleHandle,addr ntdll      ; получаем handle ntdll.dll
    18.        invoke  GetProcAddress,eax,addr zwqip   ; находим адресс ф-ции NtQueryInformationProcess
    19.        call    eax                 ; вызываем ф-цию (она нам вернет ParentID в структуре)
    20.        add     esp,5*4             ; убираем выделенное место (кроме последнего поля, там находится ParentID)
    21.        push    0                   ;
    22.        push    PROCESS_TERMINATE           ;
    23.        call    OpenProcess             ; Вызываем, чтобы получить из ParentID хендл для TerminateProcess
    24.        invoke  TerminateProcess,eax,0      ; давим родительский процесс
    25. ;=====================================================================
     
  4. Tampabelle

    Tampabelle New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    5
  5. FreeBSD

    FreeBSD New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2005
    Сообщения:
    5
    еще есть функция Process32First/Next из TOOLHELP32,

    которая, кстати говоря, работает и на NT, и на 9x.

    поле th32ParentProcessID - ID процесса-родителя.
     
  6. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Не стал создавать новую тему, сорри за некрофилию.
    Проблемы получить PID родителя нет, делаю как и в этом примере. Возникла проблема с тем, что родитель того же Explorer'а умирает после его запуска, а на его месте в скором времени может появится уже совсем другой процесс, с таким же PID'ом, у которого родитель опять же будет Explorer, в следствие чего у меня в программе начинается бесконечная рекурсия, т.к. у меня задача найти основного предка, до процесса System.
    Process Explorer от sysint, хорошо показывает, что у эксплорера родитель уже не существует, как он это делает?
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Он драйвер использует, там в ядре получить такую информацию не сложно.
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Process Explorer не использует драйвер для составления списка процессов.
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Filemon, Regmon от sysinternals - точно использует.
    Из ресурсов берет и потом трет.
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    x64
    Полноценную инфу про родитель можно получить только если сбор этой инфы разрешён при старте системы(FLG_MAINTAIN_OBJECT_TYPELIST). Иначе её нельзя получить в ядре, так как это инфы нигде нет. Получать наследуемый описатель родителя не надёжно.
     
  11. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    NtQueryInformationProcess с ProcessBasicInformation

    typedef struct _PROCESS_BASIC_INFORMATION {
    PVOID Reserved1;
    PPEB PebBaseAddress;
    PVOID Reserved2[2];
    ULONG_PTR UniqueProcessId;
    PVOID Reserved3; -> PID родительского процесса.
    } PROCESS_BASIC_INFORMATION;
     
  12. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Partner
    InheritedFromUniqueProcessId это поле завётся. И берётся оно из прототипа сервиса(после референса):
    Код (Text):
    1. NTSTATUS
    2. NtCreateProcessEx(
    3.     __out PHANDLE ProcessHandle,
    4.     __in ACCESS_MASK DesiredAccess,
    5.     __in_opt POBJECT_ATTRIBUTES ObjectAttributes,
    6.     __in HANDLE ParentProcess,
    7.     __in ULONG Flags,
    8.     __in_opt HANDLE SectionHandle,
    9.     __in_opt HANDLE DebugPort,
    10.     __in_opt HANDLE ExceptionPort,
    11.     __in ULONG JobMemberLevel
    12.     )
    ParentProcess - который опциональный.

    Хорошие, годные хидеры :lol:
     
  13. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Из приведенного прототипа не следует, что он опциональный.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms684280