Как достать полный путь к файлу процесса

Тема в разделе "WASM.NT.KERNEL", создана пользователем Hippey, 6 мар 2012.

  1. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    Здравствуйте!

    Выбрал один из немногих вариантов по доставанию полного пути к исполнительному файлу процесса - танцы с PEB. Имеется функция, но она не работает(как минимум на Windows 7 x64) возвращает нулл:
    Код (Text):
    1. #define BASE_PROCESS_PEB_OFFSET                       0x01B0
    2. #define BASE_PEB_PROCESS_PARAMETER_OFFSET         0x0010
    3. #define BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME     0x003C
    4. #define W2003_BASE_PROCESS_PEB_OFFSET               0x0190
    5. #define W2003_BASE_PROCESS_PEB_OFFSET_SP1         0x01A0
    6. #define VISTA_BASE_PROCESS_PEB_OFFSET               0x0188
    7. PCWSTR GetProcessFullName()
    8. {
    9.   ULONG OsMajorVersion;
    10.   ULONG OsMinorVersion ;
    11.   ULONG dwAddress;
    12.   if(KeGetCurrentIrql() != PASSIVE_LEVEL)
    13.   {
    14.       return NULL;
    15.   }
    16.  
    17.   try
    18.   {
    19.       dwAddress = (ULONG)PsGetCurrentProcess();
    20.  
    21.       if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
    22.       {
    23.           return NULL;
    24.       }
    25.       PsGetVersion(&OsMajorVersion, &OsMinorVersion, NULL, NULL);
    26.  
    27.       if( OsMajorVersion < 5 || OsMinorVersion > 2 )
    28.       {
    29.           return NULL;
    30.       }
    31.  
    32.       if( OsMajorVersion == 5 && OsMinorVersion < 2)
    33.       {
    34.  
    35.           dwAddress += BASE_PROCESS_PEB_OFFSET;
    36.       }
    37.  
    38.       if(OsMajorVersion == 5 && OsMinorVersion ==2)
    39.       {
    40.             dwAddress += W2003_BASE_PROCESS_PEB_OFFSET;
    41.       }
    42.  
    43.       if(OsMajorVersion == 6 && OsMinorVersion ==0)
    44.       {
    45.             dwAddress += VISTA_BASE_PROCESS_PEB_OFFSET;
    46.       }
    47.  
    48.       if((dwAddress = *(ULONG*)dwAddress) == 0)
    49.       {
    50.           return NULL;
    51.       }
    52.  
    53.       dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
    54.       if((dwAddress = *(ULONG*)dwAddress) == 0)
    55.       {
    56.           return NULL;
    57.       }
    58.  
    59.       dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
    60.       if((dwAddress = *(ULONG*)dwAddress) == 0)
    61.       {
    62.           return NULL;
    63.       }
    64.   }
    65.   except (EXCEPTION_EXECUTE_HANDLER)
    66.   {
    67.         try
    68.         {
    69.               if(OsMajorVersion == 5 && OsMinorVersion ==2)
    70.               {dwAddress = (ULONG)PsGetCurrentProcess();
    71.                   dwAddress += W2003_BASE_PROCESS_PEB_OFFSET_SP1;
    72.                   if((dwAddress = *(ULONG*)dwAddress) == 0)
    73.                   {
    74.                     return NULL;
    75.                   }
    76.  
    77.                   dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
    78.                   if((dwAddress = *(ULONG*)dwAddress) == 0)
    79.                   {
    80.                     return NULL;
    81.                   }
    82.  
    83.                   dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
    84.                   if((dwAddress = *(ULONG*)dwAddress) == 0)
    85.                   {
    86.                     return NULL;
    87.                   }
    88.                   return (PCWSTR)dwAddress;
    89.               }
    90.         }
    91.         except (EXCEPTION_EXECUTE_HANDLER)
    92.         {              
    93.         }
    94.     return NULL;
    95.   }
    96.   return (PCWSTR)dwAddress;
    97. }
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Hippey
    Мил человек, как же она у тебя работать будет на 7 x64, если там версия ядра 6.2, а этот случай у тебя тупо не учитывается в коде? Заканчивай копипастить и начинай вникать в то, что пишешь. Кроме того, адрес PEB замечательно берётся функцией PsGetProcessPeb(), не надо никаких смещений для этого. И даже, чтобы путь к файлу процесса получить оттуда, тоже никаких смещений не надо, структура частично документирована и эти её поля не менялись вплоть до Windows 7 (что там в восьмёрке, я не в курсе).
     
  3. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Hippey
    А она должна?

    что это? да и все остальное

    x64
    6.1, 6.2 это 8.
     
  4. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Peb->ProcessParameters +0x10 для x86, +0x20 для x64
    ProcessParameters->ImagePathName +0x38 для x86 +0x60 для x64

    + если обращаться к ImagePathName из CREATE_PROCESS_NOTIFY_ROUTINE при создании процесса, надо учитывать, что структура проинициализирована не полностью, в частности ImagePathName->Buffer будет содержать не адрес, а смещение относительно Peb->ProcessParameters.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    EP_X0FF
    Да, верно, ошибся циферкой.
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Тогда уже
    6.0 Vista
    6.1 Windows 7
    6.2 Windows 8