[Kernel] Получить командную строку по PID.

Тема в разделе "WASM.WIN32", создана пользователем MuForum, 14 мар 2011.

  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Доброго времени суток.
    Работа в драйвере на ОС Windows XP/Vista/7 x86-32.

    # Задача: Получить командную строку процесса с которой он был запущен зная PID и дескриптор процесса.

    Код (Text):
    1. #ifndef TPEB_H
    2. #define TPEB_H
    3.  
    4. #include "Defines.h"
    5.  
    6. typedef struct _PEB_LDR_DATA {
    7.   BYTE       Reserved1[8];
    8.   PVOID      Reserved2[3];
    9.   LIST_ENTRY InMemoryOrderModuleList;
    10. } PEB_LDR_DATA, *PPEB_LDR_DATA;
    11.  
    12. typedef struct _RTL_USER_PROCESS_PARAMETERS {
    13.   BYTE           Reserved1[16];
    14.   PVOID          Reserved2[10];
    15.   UNICODE_STRING ImagePathName;
    16.   UNICODE_STRING CommandLine;
    17. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
    18.  
    19. typedef VOID (NTAPI *PPS_POST_PROCESS_INIT_ROUTINE) (VOID);
    20.  
    21. typedef struct _PEB {
    22.   BYTE                          Reserved1[2];
    23.   BYTE                          BeingDebugged;
    24.   BYTE                          Reserved2[1];
    25.   PVOID                         Reserved3[2];
    26.   PPEB_LDR_DATA                 Ldr;
    27.   PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
    28.   BYTE                          Reserved4[104];
    29.   PVOID                         Reserved5[52];
    30.   PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
    31.   BYTE                          Reserved6[128];
    32.   PVOID                         Reserved7[1];
    33.   ULONG                         SessionId;
    34. } PEB, *PPEB;
    35.  
    36. PPEB PsGetProcessPeb(IN PEPROCESS Process);
    37.  
    38. void GetCommandLineByProcess(PEPROCESS proc, HANDLE procId)
    39. {
    40.     PPEB pPeb               = NULL;
    41.     KAPC_STATE apcState;
    42.     PRTL_USER_PROCESS_PARAMETERS pp = NULL;
    43.     // ----
    44.     KeStackAttachProcess(proc, & apcState);
    45.     // ----
    46.     pPeb    = PsGetProcessPeb(proc);
    47.     // ----
    48.     DPRINT("[GetCommandLineByProcess] pPeb: %d;\n\0", pPeb);
    49.     // ----
    50.     pp      = pPeb->ProcessParameters;
    51.     // ----
    52.     DPRINT("[GetCommandLineByProcess] pPeb->ProcessParameters: %d;\n\0", pp);
    53.     // ----
    54.     DPRINT("[GetCommandLineByProcess] ImagePathName.Length: %d; CommandLine.Length: %d;\n\0",
    55.         pp->ImagePathName.Length, pp->CommandLine.Length);
    56.     // ----
    57.     DPRINT("[GetCommandLineByProcess] ImagePathName: '%wZ';\n\0",
    58.         pp->ImagePathName.Buffer);
    59.     // ----
    60.     DPRINT("[GetCommandLineByProcess] CommandLine: '%wZ';\n\0",
    61.         pp->CommandLine.Buffer);
    62.     // ----
    63.     KeUnstackDetachProcess( & apcState);
    64. }
    65.  
    66. #endif
    # Структуры взял с MSDN:
    # Лог:
    - Как видно даже последнего символа ' нет, он не выводится.


    P.S. -> Прошу помочь разобраться, в чём проблема.
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Посмею предположить, что лог ведется через вызовы ANSI-функций. Что несвойственно человеку, имеющему дело с драйверами, где всюду Unicode.
     
  3. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    # Отредактировано: Усё, проблема решена.
    - А точнее решена проблема моих слепых глаз =)
    - Необходимо передавать указатель на UNICODE_STRING (PUNICODE_STRING).
    Код (Text):
    1. //%ws - WCHAR*;
    2. //%wZ - PUNICODE_STRING;
    3. DPRINT("[GetCommandLineByProcess] ImagePathName: '%wZ';\n\0", & pp->ImagePathName);
    4. DPRINT("[GetCommandLineByProcess] CommandLine: '%wZ';\n\0", & pp->CommandLine);
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ткните мне на это в оф. документации, до тех пор не стал бы на это полагаться.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну это же все известно

    Хотя бы вот
    http://msdn.microsoft.com/en-us/library/hf4y5e3w%28v=vs.80%29.aspx
    %wZ - allow to use pointer to UNICODE_STRING as parameter for printing

    При желании можно найти ещё.