PsGetCurrentProcess и определение EXEшника процесса

Тема в разделе "WASM.WIN32", создана пользователем biocheshire, 28 апр 2006.

  1. biocheshire

    biocheshire Алексей

    Публикаций:
    0
    Регистрация:
    1 апр 2006
    Сообщения:
    13
    Адрес:
    Russia
    Привет, All

    Покопался на форуме и понятной реализации вопроса по нахождению имени текущего процесса (кернел мод) не нашел.

    Насколько я понял:

    вариант 1) Извлечь все необходимое из PEB. Но здесь что-то не получается с ZwQueryInformation (если есть рабочий код, плз поделитесь)

    вариант 2) Использовать эти структуры - PEPROCESS->SectionObject->Segment->ControlArea->FilePointer->FileName. Buffer

    Но и здесь есть проблемы, т.к. нужно определять целую кучу структур.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Однозначно 2 вариант, так как не стоит обращаться из ядра к юзермодным структурам без лишней необходимости.

    Ну а насчет того что много структур надо обьявлять, так лениться тоже не стоит :) вперед за работу
     
  3. biocheshire

    biocheshire Алексей

    Публикаций:
    0
    Регистрация:
    1 апр 2006
    Сообщения:
    13
    Адрес:
    Russia
    :) Я вооружился pdbdump и ntoskrnl.pdb

    И pdbdump выдаёт фразу вида ERROR =х абыр абыр абыр

    Откуда взять описания недостающих структур?
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    biocheshire

    С качай тутушный, васмовый рулит и некаких заклинаний не требуется, все на уровне начинающего волшебника
     
  5. biocheshire

    biocheshire Алексей

    Публикаций:
    0
    Регистрация:
    1 апр 2006
    Сообщения:
    13
    Адрес:
    Russia
    Спасибо, помогло

    Все таки надо купить бубен ;)
     
  6. biocheshire

    biocheshire Алексей

    Публикаций:
    0
    Регистрация:
    1 апр 2006
    Сообщения:
    13
    Адрес:
    Russia
    В продолжение темы..

    Не могу заставить код работать, подскажите плиз где баг
    Код (Text):
    1.  
    2. UNICODE_STRING GetFullProcessName()
    3. {
    4. PEPROCESS proc;
    5. PSECTION_OBJECT Section;
    6. PSEGMENT_OBJECT Segment;
    7. PCONTROL_AREA ControlArea;
    8. PFILE_OBJECT FileObject;
    9.  
    10. proc = PsGetCurrentProcess();
    11.  
    12. if(proc->SectionObject)
    13. {
    14. Section = proc->SectionObject;
    15. Segment = Section->Segment;
    16. ControlArea = Segment->ControlArea;
    17. FileObject = ControlArea->FilePointer;
    18. DbgPrint("Section FileName: %S\n",FileObject->FileName.Buffer);
    19. }
    20. ObDereferenceObject((PVOID)proc);
    21. return FileObject->FileName;
    22. }
    23.  


    Есть драйвер, который перехватывает NtUserGetMessage, уже внутри есть необходимость вызвать эту GetFullProcessName дабы узнать имя процесса, отославшего сообщение. Получаю BSOD.

    Или быть может есть у кого рабочий пример - как узнать имя текущего процесса из драйвера через ZwQuerySystemInformation ?
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Какой-то странный путь: PEPROCESS->SectionObject->Segment->ControlArea->FilePointer->FileName. Buffer

    Посмотрел несколько раз - не вижу в структуре EPROCESS такого элемента, как SectionObject. Откуда он взялся?



    Я знаю такой путь:

    PEPROCESS->Peb->Ldr->InLoadOrderModuleList



    Кроме этого есть ещё способ:

    при загрузке драйвер стартует в процессе System. В DriverEntry можно вызвать PsGetCurrentProcess(); и посканировать PERPOCESS процесса System на глубину примерно 1000h в поисках сигнатуры "System".


    Код (Text):
    1. //====================================================================   =
    2. int GetImageFileNameOffset(){
    3.     char*           hProcess;
    4.     int             i;
    5.     hProcess = (char*)IoGetCurrentProcess();
    6.     for (i=0; i<0x1000; i++){
    7.         if ( 0 ==  _strnicmp((hProcess + i), "system", 6) ) return i;
    8.     }
    9.     return 0;
    10. }




    Оффсет, по которому сигнатура будет найдена - он будет постоянным для всех процессов. запомни его и

    далее просто прибавляя к PEPROCESS этот оффсет, получишь адрес имени процесса (это не имя ехе, хотя в большинстве случаев совпадает) Имя не zero-terminated, и ограничено длиной 16 символов.
     
  8. biocheshire

    biocheshire Алексей

    Публикаций:
    0
    Регистрация:
    1 апр 2006
    Сообщения:
    13
    Адрес:
    Russia
    SectionObject там есть, pdbdump'ом проверял, да и вообще этот способ не сам придумывал, но судя по описанию он должен работать.

    А по поводу PEB..

    Самое странное то, что после PsGetCurrentProcess (вызывается внутри перехваченной функции) поле PEB ни на что не указывает.

    За способ с оффсетом спасибо, сейчас попробую.
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    из ... сам найдешь:
    Код (Text):
    1. /* _____________________________________________________________________
    2.  . GetProcessNameOffset
    3.  .
    4.  . Scan the KPEB looking for the "System" process name - because
    5.  . DriverEntry is called in that context.  This offset becomes a
    6.  . reference for later. -thanks to sysinternals for this trick ;-)
    7.  . _____________________________________________________________________ */
    8. void GetProcessNameOffset()
    9. {
    10.     PEPROCESS curproc;
    11.     int i;
    12.     curproc = PsGetCurrentProcess();
    13.     for( i = 0; i < 3*PAGE_SIZE; i++ )
    14.     {
    15.         if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
    16.         {
    17.             gProcessNameOffset = i;
    18.         }
    19.     }
    20. }
     
  10. b_vital

    b_vital New Member

    Публикаций:
    0
    Регистрация:
    6 май 2006
    Сообщения:
    9
    status = ZwQueryInformationProcess(

    hProcess,

    ProcessImageFileName,

    buffer,

    sizeof( buffer ),

    &nReturnLength );
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    В данном случае черезвычайно важна производительность обработчика, и единственный пригодный вариант - это брать имя из EPROCESS. (см. пост EvilsInterrupt).