Получение имени процесса

Тема в разделе "WASM.WIN32", создана пользователем Lex2029, 18 ноя 2007.

  1. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Всем привет.
    Подскажите, как получить имя процесса, используя EnumProcesses, и соответственно имея только ID процессов?
    Process32First / Next, я знаю, просто интересно как добраться до имени процесса, с другого направления.
    МСДН перерыл, ничего не нашел :dntknw: Хотя мне кажется, что это возможно
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    из пеба 100 раз уже писали, напишем в 101-й
    Код (Text):
    1. int GetModuleNameByPid(
    2.                    IN HANDLE ProcessId,
    3.                    IN WCHAR** pwszFullPath)
    4. //
    5. // get name form PEB
    6. // return ZERO if fails
    7. //
    8. // remark: memory pointed by wszFullPath must be free when it unneeded,
    9. // wszFullPath -- always NULL-termintated
    10. //
    11.  
    12. {
    13.    
    14.     NTSTATUS status;
    15.     PEB_LDR_DATA Ldr;
    16.     LDR_DATA_TABLE_ENTRY LdrData;
    17.     PEB peb;
    18.     PROCESS_BASIC_INFORMATION ProcBasicInfo;
    19.     HANDLE hProcess;
    20.     CLIENT_ID clid;
    21.     OBJECT_ATTRIBUTES oa;
    22.     SIZE_T rw;
    23.     PVOID ptr;
    24.     //temp
    25.     //char str[256];
    26.  
    27.     RtlZeroMemory(&oa, sizeof(oa));
    28.     oa.Length = sizeof(oa);
    29.     clid.UniqueProcess = ProcessId;
    30.     clid.UniqueThread = 0;
    31.     status = NtOpenProcess(
    32.         &hProcess,
    33.         PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    34.         &oa,
    35.         &clid);
    36.  
    37.     if (status) return 0;
    38.  
    39.     status = NtQueryInformationProcess(
    40.         hProcess,
    41.         ProcessBasicInformation,
    42.         &ProcBasicInfo,
    43.         sizeof(ProcBasicInfo),
    44.         0);
    45.  
    46.     if (!ProcBasicInfo.PebBaseAddress && !status) {
    47.         wsprintf(str, "ZERO PEB pid = 0x%04X\n", ProcBasicInfo.UniqueProcessId);
    48.         print(str);
    49.     }
    50.    
    51.     if (status || !ProcBasicInfo.PebBaseAddress) {
    52. exit:
    53.         CloseHandle(hProcess);
    54.         return 0;
    55.     }
    56.  
    57.     RtlZeroMemory(&peb, sizeof(peb));
    58.     if (NtReadVirtualMemory(hProcess, ProcBasicInfo.PebBaseAddress, &peb, sizeof(peb), &rw))
    59.         goto exit;
    60.    
    61.     if (NtReadVirtualMemory(hProcess, peb.Ldr, &Ldr, sizeof(Ldr), &rw))
    62.         goto exit;
    63.    
    64.     if (NtReadVirtualMemory(hProcess, Ldr.InLoadOrderModuleList.Flink, &LdrData, sizeof(LdrData), &rw))
    65.         goto exit;
    66.    
    67.     ptr = GlobalAlloc(GMEM_FIXED, LdrData.BaseDllName.Length + 2);
    68.     if (!ptr)  goto exit;
    69.  
    70.     RtlZeroMemory(ptr, LdrData.BaseDllName.Length + 2);
    71.     if (NtReadVirtualMemory(hProcess, LdrData.BaseDllName.Buffer, ptr, LdrData.BaseDllName.Length, &rw)){
    72.         GlobalFree(ptr);
    73.         goto exit;
    74.     }
    75.  
    76.     CloseHandle(hProcess);
    77.     *pwszFullPath = ptr;
    78.     //wsprintf(str, "name retrieved successful pid = 0x%04X, name = %ws\n", ProcBasicInfo.UniqueProcessId,  ptr);
    79.     //print(str);
    80.     return 1;
    81. }
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    можно легче, но менее документированным способом
    Код (Text):
    1. name  db 500 dup (?)
    2. oa OBJECT_ATTRIBUTES
    3. clid CLIENT_ID
    4. hProcess dd ?
    5. shit dd ?
    6. .....
    7.         mov     [clid.UniqueProcess],PID
    8.         invoke  NtOpenProcess,hProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,oa,clid
    9.         invoke  NtQueryInformationProcess,[hProcess],27,name,500,shit
    в name получим UNICODE_STRING :)
     
  4. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Спасибо :)
     
  5. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    PsGetProcessImageFileName :)
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    tylerdurden вы научились из юзера читать EPROCEES или невнимательно прочитали топик?
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    rain
    а в вопросе про ring0 ничего не говорится ;)
     
  8. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Самый толковый способ прочитать память процесса, где командная строка лежит. Но жаль, что нет функций типа GetProcessFileName и GetProcessCommandLine
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    заменяется чтением PEB интересующего процесса
     
  10. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    rain
    Конечно научился, открыв память ядра юзерским приложениям (ака в Европу прорубив окно)