Несколько вопросов по перехвату Zw-функций

Тема в разделе "WASM.NT.KERNEL", создана пользователем Rodin, 1 июн 2007.

  1. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    1) Как в перехватываемой функции ZwDeleteKey из хендла получить имя ключа? Протопип:
    NTSTATUS NewZwDeleteKey (IN HANDLE KeyHandle);

    2) Как в перехватываемой функции ZwTerminateProcess получить имя завершаемого процесса? Протопип:
    NTSTATUS NewZwTerminateProcess (IN HANDLE ProcessHandle OPTIONAL, IN NTSTATUS ExitStatus);

    3) Почему при удалении файла перехватываемая функция ZwDeleteFile не вызывается? Система WinXP.

    4) Как в драйвере засаспендить процесс по имени либо id? Естесно после нужна возможность его возобновления либо завершения.

    Спасибо.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    1) ZwQueryKey
    4) саспендятся кажется только потоки, а не сразу весь процесс (поправьте, если ошибаюсь)
     
  3. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    1) ObReferenceObjectByHandle
    ObQueryNameString
    ObDereferenceObject

    2) пробуй также.

    3) потому что, чтобы удалить файл, достаточно его открыть
    ZwCreateFile,
    установить ему аттрибут DeleteFile:
    ZwSetInformationFile подкласс FileDispositionInformation,
    ну и ZwClose.
    Так и поступает kernel32!DeleteFile.

    4)
    PsLookupProcessbyProcessId
    затем, в ядре есть две функции: NtSuspendProcess и PsSuspendProcess
    но, они не экспортируются, и доступны только через SDT, сможешь их достать оттуда - вперед.
    Иначе придется, как уже было сказано, перебирать все потоки процесса и саспендить их по одному.
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    2. ObReferenceObjectByHandle (ну или ручками пройтись по PspCidTable, что тривиально) и дальше извлекаешь все что нужно из полученной EPROCESS-структуры.

    Zufyxe
    NtSuspendProcess и PsSuspendProcess присутствуют только начиная с WinXP, так что в целях совместимости лучше замораживать потоки.
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    если честно, не знаю/не помню, но ObQueryNameString применительно к EPROCESS - это как-то круто звучит
     
  6. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Twister,
    - угу, это самое реальное. Только опять же, структура очень зависит от версии.

    Nouzui, да я и сам не уверен на это счет :) Потому и предложил "пробовать" :)

    Кстати, насчет замораживания потоков.
    ZwSuspendThread также не экспортируется в ядре. Придется доставать из SDT.
     
  7. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Возникла проблема с ObQueryNameString. Проект не компилится, т.к. ntddk.h не содержит данного прототипа. Однако ядро эту функцию экспортирует. Система WinXP.

    Как получить адрес этой функции?
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Rodin
    Разобрать экспорт. Исходники на форуме выкладывались.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Rodin
    Ну раз ядро экспортирует, то просто допиши прототип сам. В lib'ах она точно есть.
    Если же у тебя мегадревний DDK, где нету её, то попробуй MmGetSystemRoutineAddress, только не факт, что в том ддк она тоже есть. Остается только посочувствовать.
    Кстаит, ObQueryNameString странная какаято. Она у меня не раз вылетала в PAGE_FAULT_IN_NONPAGED_AREA, в икспи исключили из нее проверку, что NameInfoOffset==NULL в OBJECT_HEADER, поэтому она теперь слетает для безымянных объектов=\ Проверял не один раз уже.. засранцы они :)
     
  10. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    .

    Great
    Не заметил, что нужно в ядре :)
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    maxdiver
    оО в ядре?)
     
  12. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Проверил, что в lib'е есть, после этого прописал прототип в ntddk.h и все заработало. Спасибо.
     
  13. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Возник еще один вопрос по ZwSuspendProcess.

    Перехватываю, например, ZwCreateFile. При срабатывании определенных условий должен засаспендить текущий процесс в контексте которого и выполняется ZwCreateFile. Как это осуществить?

    Практическая попытка засаспендить текущий процесс, как и ожидалось, ни к чему не привела - ZwSuspendProcess просто не сработал.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ты передавал -2 или реальный хендл?
     
  15. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    На самом деле я даже не знаю прототипа ZwSuspendProcess. По аналогии с ZwSuspendThread предположил, что прототип
    NTSTATUS ZwSuspendProcess (IN HANDLE hProcess);

    Поэтому и передавал хендл, полученный из EPROCESS через ObOpenObjectByPointer. Хэндл проверял - соответствует текущему процессу.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ...упс.. [del]
     
  17. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    К чему это?
     
  18. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Great, похоже, ошибся функцией.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Rodin
    упс ))
    RamMerLabs
    ага
    а тебе надо саспенднуть все потоки или тока текущий?
     
  20. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    По второму, может поможет.
    Код (Text):
    1. NTSTATUS NewZwTerminateProcess          (IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
    2. {  
    3.      NTSTATUS                            NZTP_STATUS = STATUS_SUCCESS;
    4.     PROCESS_BASIC_INFORMATION           pProcessInformation;
    5.     PEPROCESS                           remEprocess = 0;
    6.     CLIENT_ID                           remClientId;
    7.     PPEB                                remPeb;
    8.     ANSI_STRING                         remProcName;
    9.     UNICODE_STRING                      usStr1;
    10.  
    11.     NZTP_STATUS = ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&pProcessInformation,sizeof(PROCESS_BASIC_INFORMATION),NULL);
    12.     if (NT_SUCCESS(NZTP_STATUS))
    13.     {
    14.         remClientId.UniqueProcess   = (HANDLE)pProcessInformation.UniqueProcessId;
    15.         remClientId.UniqueThread    = 0;
    16.         remPeb                      = (PPEB)pProcessInformation.PebBaseAddress;
    17.  
    18.         NZTP_STATUS = PsLookupProcessByProcessId(remClientId.UniqueProcess,&remEprocess);
    19.         if (NT_SUCCESS(NZTP_STATUS))
    20.         {
    21.             RtlInitAnsiString(&remProcName,remEprocess->ImageFileName);
    22.             RtlAnsiStringToUnicodeString(&usStr1,&remProcName,TRUE);
    23.             if (ProtectProcessName(usStr1.Buffer))
    24.             {
    25.                 ObDereferenceObject(remEprocess);
    26.                 ZwClose(ProcessHandle);
    27.                 NZTP_STATUS = STATUS_ACCESS_DENIED;
    28.                 return NZTP_STATUS;
    29.             }
    30.             RtlFreeUnicodeString(&usStr1);
    31.         }
    32.     }
    33.     NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus);
    34.     return NZTP_STATUS;
    35. }