NtCreateProcessEx, NtCreateSection и определение файла процесса

Тема в разделе "WASM.NT.KERNEL", создана пользователем sasha_s, 16 июн 2009.

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Перехватил NtCreateProcessEx.
    Надо забанить запуск заданного процесса. Но в NtCreateProcessEx приходит NULL в (POBJECT_ATTRIBUTES ObjectAttributes). Порыл сей форум, в частности http://www.wasm.ru/forum/viewtopic.php?id=19562 и это http://www.wasm.ru/forum/viewtopic.php?id=29309 . Там обсуждался вариант перехвата NtCreateSection и отслеживание имени файла. Я тоже перехватил и сие подходит, но если кто-либо вызовет LoadLibrary("нужный мне екзешник") -- то в NtCreateSection я его получается тоже обрублю.

    В одном из форумов (http://www.wasm.ru/forum/viewtopic.php?id=29309) Clerk сказал что: "Находим указатель на секцию, хэндл которой передаётся, извлекаем полное имя модуля." (я так понимаю хендл секции который передается в NtCreateProcessEx, я прав?)

    Но как сие корректно сделать я не представляю. Попробывал вызвать ObReferenceObjectByHandle, как писал сей автор http://www.wasm.ru/forum/viewtopic.php?pid=166927#p166927 и ничего не вышло, в полях либо NULL, либо невалидные адреса.

    Подскажите кто сталкивался...
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    http://www.wasm.ru/article.php?article=drvw2k14
    В статье описано как найти полный путь к файлу если известен указатель на секцию. Указатель по хендлу получаешь с помощью ObReferenceObjectByHandle.
     
  3. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Я смотрел этот код. Помоему это немного не мой случай. Т.к. там получается имя секции на этапе уже нотификации, т.е. процесс или создан, или почти создан, как минимум уже создана EPROCESS.

    Код (Text):
    1.              xor ebx, ebx
    2.              mov edi, 4
    3.              .while ebx < 3
    4.  
    5.                  invoke IoGetCurrentProcess
    6.                  .if eax == peProcess
    7.                      
    8.                      mov ecx, MmSectionObjectType
    9.                      mov ecx, [ecx]
    10.                      mov ecx, [ecx]  ; PTR OBJECT_TYPE
    11.                  
    12.                      invoke ObReferenceObjectByHandle, edi, SECTION_QUERY, ecx, KernelMode, addr pSection, NULL
    13.                      mov status, eax
    14.  
    15.                  .else
    16.  
    17.                      invoke KeAttachProcess, peProcess
    18.  
    19.                      mov ecx, MmSectionObjectType
    20.                      mov ecx, [ecx]
    21.                      mov ecx, [ecx]
    22.  
    23.                      invoke ObReferenceObjectByHandle, edi, SECTION_QUERY, ecx, KernelMode, addr pSection, NULL
    24.                      mov status, eax
    25.  
    26.                      invoke KeDetachProcess
    27.  
    28.                  .endif
    29.  
    30.                  .break .if status == STATUS_SUCCESS
    31.                      
    32.                  .if ebx == 0
    33.                      
    34.                      mov edi, 03F8h  ; Try 03F8h handle.
    35.                          
    36.                  .elseif ebx == 1
    37.                      
    38.                      mov eax, peProcess
    39.                      add eax, 01ACh
    40.                      mov eax, [eax]
    41.                      mov edi, eax
    42.  
    43.                      and eax, (4 - 1)
    44.                      .break .if ( eax != 0 ) || ( edi >= 800h )
    45.                          
    46.                  .endif
    47.                  
    48.                  inc ebx
    49.              .endw
    Тут или текущий процесс, или вызывается KeAttachProcess. У меня еще процесса нет, я нахожусь в перехваченной NtCreateProcessEx и ей передается хендл секции.
    Пробовал вызвать ObReferenceObjectByHandle так как в статье вызывается:
    Код (Text):
    1.         PSECTION *section_ptr = NULL;
    2.         NTSTATUS status =
    3.             ObReferenceObjectByHandle(
    4.             SectionHandle,
    5.             SECTION_QUERY,
    6.             MmSectionObjectType,
    7.             KernelMode,
    8.             (PVOID*)&section_ptr,
    9.             NULL);
    10.         if (NT_SUCCESS(status))
    11.         {
    12.             TRACE(("section_ptr=0x%.8X\n", *section_ptr));
    13.             ObDereferenceObject(*section_ptr);
    14.         }
    15.         else
    16.         {
    17.             TRACE(("ERROR ObReferenceObjectByHandle=0x%.8X\n", status));
    18.         }
    ObReferenceObjectByHandle выдает ошибку STATUS_OBJECT_TYPE_MISMATCH(0xC0000024L)...

    как поправить?
     
  4. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    1. перехватывай ZwCreateThread, на этом этапе это peb процесса заполнен(на этапе NtCreateProcessEx нет ещё), и можно сразу вытянуть имя файла.
    2. в win2k вызывается функция NtCreateProcess, поэтому придётся ещё её хукать ;)
     
  5. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    как вариант дать процессу создаться, если STATUS_SUCCESS, то по PID получить EPROCESS и далее до FILE_OBJECT как в статье
    готовое решение есть на форуме (автор поста - Twister)
    также никто не отменял ZwQueryInformationProcess(ProcessImageFileName)
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    На Windows XP и выше достаточно похукать NtCreateProcessEx() и вытягивать всю информацию из объекта-секции по её хендлу. Ну это как обычно: секция, сегмент, файл и там уже имя можно вытянуть как у меня в блоге расписано. В случае, если в качестве хендла секции указан NULL, значит это fork'ается родительский процесс и всю информацию (например, имя файла-образа) можно вытянуть по указателю на процесс-родитель. Ну а это просто: по EPROCESS'у получаем указатель на секцию, а далее как в предыдущем случае. Не вижу смысла хукать NtCreateThread() или NtCreateSection().
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    пишешь на си, который не контролирует тип указателей?
    по-моему, надо все-таки *MmSectionObjectType вместо MmSectionObjectType.
     
  8. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Да, это помогло. Отрабатывает без ошибки, но возвращает NULL в (*section_ptr).
     
  9. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Порыл я блог ваш, но ответа не нашел.

    Код (Text):
    1. if (NULL != SectionHandle)
    2. {
    3.     PSECTION *section_ptr = NULL;
    4.     NTSTATUS status =
    5.         ObReferenceObjectByHandle(
    6.         SectionHandle,
    7.         SECTION_QUERY,
    8.         *MmSectionObjectType,
    9.         KernelMode,
    10.         (PVOID*)&section_ptr,
    11.         NULL);
    12.     if (NT_SUCCESS(status))
    13.     {
    14.           .....
    15.     }
    16.     else
    17.     {
    18.           .....
    19.     }
    20. }
    Вот код, который отрабатывает, но в *section_ptr возвращает NULL. Что не так делаю?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А кто сказал, что возвращает оно PSECTION*?
    Возвращается указатель на объект. эТо просто PSECTION. Не нужно разыменовыать полученный указатель
    Читайте MSDN перед тем как писать
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не то искал...
     
  12. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Да, глупая ошибка с моей стороны, согласен.
    Но пока вы не убежали мот еще подскажете:
    section_ptr->_Segment->ControlArea == 0x08e6742a
    Это, как я понимаю, не кернеловский адрес. Что вызвать чтобы получить к нему доступ?
     
  13. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Большое спасибо всем за проявленное участие. Проблема разрешилась.