[x64] ObRegisterCallbacks - Использование на деле

Тема в разделе "WASM.X64", создана пользователем MuForum, 3 мар 2011.

  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Доброго времени суток.
    Разрабатываю драйвер для x64.
    Есть драйвер под x86-32, который устанавливает SSTD хук на ZwOpenProcess, необходим аналог на x64.
    - В смежной теме подсказали смотреть в сторону ObRegisterCallbacks().
    - Пытался в интернете найти какие-то исходники или статьи по конкретной работе с данным мини-фильтром, но так и не нашел.

    P.S. -> Может кто-то подсказать ссылки, статьи, исходники где используется ObRegisterCallbacks(), чтобы посмотреть в деле, а то одно описание этого.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Никаких статей и исходников тут не нужно, всё предельно просто. Единственное, что нужно учесть, это, во-первых, что драйвер, использующий эти колбеки, должен в обязательном порядке иметь цифровую подпись (тестовая тоже подойдёт), во-вторых, тебе придётся заказать уникальное значение для Altitude ID во избежание коллизий, и наконец, в-третьих, драйвер должен быть собран с флагом Integrity Check в заголовке PE-файла:

    Sources
    Код (Text):
    1. LINKER_FLAGS=/INTEGRITYCHECK
    P.S.
    Интересно, я один вообще, кто пишет об этом на форумах?
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    x64
    Зачем заказывать, если ты уверен что у юзверей "Софт_Х" (из списка занятых) в 99,9% случаев установлен не будет.

    MuForum
    Много вопросов на форуме задаёшь. Я год назад ровно с такими вопросами столкнулся, но все ответы нашёл как на wasm'е , так и в инете (кодес юзающий ObRegisterCallbacks() там есть).
     
  4. x64

    x64 New Member

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

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    x64, а что такое Altitude ID ?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    См. описание поля Altitude в структуре OB_CALLBACK_REGISTRATION.
     
  7. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    # Вопрос: Каким образом в функции PreProcCreateRoutine() определить, к какому процессу(PID) идёт обращение?
    - Необходимо узнать PID процесса, который пытаются открыть.


    MSDN смотрел, ответ не нашел...
    1. OB_CALLBACK_REGISTRATION Structure;
    2. OB_OPERATION_REGISTRATION Structure;
    3. ObjectPreCallback Routine;
    4. OB_PRE_OPERATION_INFORMATION Structure;


    Код (Text):
    1. OB_PREOP_CALLBACK_STATUS PreProcCreateRoutine(IN PVOID RegistrationContext, IN POB_PRE_OPERATION_INFORMATION OperationInformation)
    2. {
    3.     DbgPrint("PreProcCreateRoutine();\n");
    4.     return OB_PREOP_SUCCESS;
    5. }
    В 32-разрядной системе:
    Код (Text):
    1. NTSTATUS NtOpenProcessNew(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
    2. {
    3. ...
    4. PID = ClientId->UniqueProcess;
    5. ...
    6. }
    P.S. -> Можно как-то сделать аналог на x64?


    # Дополнение: В структуре OB_PRE_OPERATION_INFORMATION есть поле Object.
    - Но, как узнать PID процесса?
     
  8. x64

    x64 New Member

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

    Код (Text):
    1. ULONG uProcessId = 0;
    2. uProcessId = (ULONG) PsGetProcessId (OpInfo -> Object);
    Не забудь только проверить, что колбек вызван именно для процесса.
     
  9. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    x64 Спасибо за твои сообщения и советы.
    Всё работает на ура.
     
  10. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    # Вопрос: Как заблокировать доступ к процессу зная его PID?

    # x86:
    Код (Text):
    1. NTSTATUS NtOpenProcessNew(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess,
    2.         IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
    3. {
    4. ...
    5. ULONG uPID = (ULONG)ClientId->UniqueProcess;
    6. // ----
    7. if ( uPID == 2148 )
    8. {
    9.     return STATUS_ACCESS_DENIED
    10. }
    11. ...
    12. }
    # x64:
    Код (Text):
    1. OB_PREOP_CALLBACK_STATUS PreProcCreateRoutine(IN PVOID RegistrationContext, IN POB_PRE_OPERATION_INFORMATION OpInfo)
    2. {
    3.     ULONG uProcessID    = 0;
    4.     // ----
    5.     if ( OpInfo->ObjectType != *PsProcessType ) return OB_PREOP_SUCCESS;
    6.     // ----
    7.     uProcessID    = (ULONG)PsGetProcessId(OpInfo->Object);
    8.     // ----
    9.     if ( uProcessID == 2148 )
    10.     {
    11.         DbgPrint("PreProcCreateRoutine();\n");
    12.         // ----
    13.         return STATUS_ACCESS_DENIED; // Вот тут мне надо как-то заблокировать доступ к процессу.
    14.     }
    15.     return OB_PREOP_SUCCESS;
    16. }
    P.S. -> Я смотрел MSDN, там сказано что функция PreProcCreateRoutine() может возвращать только результат OB_PREOP_SUCCESS. (ObjectPreCallback returns an OB_PREOP_CALLBACK_STATUS value. Drivers must return OB_PREOP_SUCCESS.)
    - Может тогда как-то через доступ?
    Код (Text):
    1. OpInfo->Parameters->CreateHandleInformation.DesiredAccess = что-то;
    2. либо
    3. OpInfo->Object = NULL; // Но это думаю не совсем корректно.
    P.S. -> В общем прошу помочь/подсказать, как правильно сделать данную задачу.
    - Заранее спасибо.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Идеология этих колбеков такова, что не позволяет фильтрам полностью запрещать доступ к объектам. Вместо этого фильтру разрешается лишь урезать клиента в правах к целевому объекту (добавлять права нельзя). Например, чтобы запретить убийство целевого процесса, можно написать так:

    Код (Text):
    1. pOpInfo -> Parameters.CreateHandleInformation.DesiredAccess =
    2.     pOpInfo -> Parameters.CreateHandleInformation.OriginalDesiredAccess & ~PROCESS_TERMINATE;
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    хм, странное решение, чебы нет?
     
  13. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Благодарю за ответ.

    Обратился к MSDN и нашел описание OB_PRE_CREATE_HANDLE_INFORMATION Structure, НО, при добавление тогоже PROCESS_TERMINATE, компилятор ругается, что незнаком с такой константой/макросом.
    P.S. -> Что необходимо подключить, чтобы данный константы/макросы компилятор видел?


    # Добавлено: Прописать самим макросы.