Нужна помощь с NtDuplicateObject

Тема в разделе "WASM.NT.KERNEL", создана пользователем n2, 7 авг 2011.

  1. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Есть драйвер режима ядра. Вычитал, что получить хендл процесса в обход NtOpenProcess можно через функцию NtDuplicateObject. Собственно, её вид: NTSTATUS NtDuplicateObject (
    IN HANDLE SourceProcessHandle,
    IN PHANDLE SourceHandle,
    IN HANDLE TargetProcessHandle,
    OUT PHANDLE TargetHandle,
    IN ACCESS_MASK DesiredAccess OPTIONAL,
    IN BOOLEAN InheritHandle,
    IN ULONG Options
    )
    Задача:есть процесс с PID=xxx, который нельзя разрешать дублировать. Я ставлю перехватчик на эту функцию. И тут встает вопрос, что делать дальше? Я так понимаю, что SourceProcessHandle (или SourceHandle??) и есть хендлом процесса, который пытаются дублировать. Мне же нужно узнать ПИД это самого процесса, дабы сравнить с подзащитным. Как это сделать? Читал, что можно через вызов NtOpenProcess, но не понял, как именно, откуда брать параметры для её вызова, а именно IN PCLIENT_ID ClientId OPTIONAL, из которого потом и получаем ПИД. Подскажите, пожалуйста, как поступить.
    Спасибо!
     
  2. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    запретить NtOpenProcess с TOKEN_DUPLICATE
     
  3. n2

    n2 New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2011
    Сообщения:
    26
    Эм..я думал, что с помощью ДупликейтОбджект можно взять хендл в обход ОпенПроцесс. Нет?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Короче, рассказываю. Тебе нужно контролировать создание хендлов на свой процесс. Хендлы в приложениях можно создавать либо через NtOpenProcess(), либо через NtDuplicateHandle(), соответственно, тебе следует контролировать оба сервиса. С первым всё понятно, а со вторым тебе нужно проверять значение SourceHandle, при чём сравнивать желательно не с ID защищаемого процесса, а с адресом его объекта (EPROCESS), для этого используй ObReferenceObjectByHandle(). Но в твоей схеме могут быть проблемы с системными процессами, т.к. некоторые из них открывают процессы для собственных нужд, например, CSR любит этим баловаться, насколько я в курсе, т.е. всем подряд запрещать открытие нельзя. Я советую, во-первых, вести список исключений, т.е. например, процессу CSR разрешать открывать твой процесс, ну и так далее, и во-вторых, начиная с Vista SP1 рекомендую использовать соответствующий колбек ObRegisterCallbacks(), который как раз и перехватывает все необходимые тебе операции.