Создание Event-a в kernel для user-mode

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

  1. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Собственно, вопрос заключается в следущем. Возникла необходимость реализовать следущую схему взаимодействия драйвера и юзермодной программы.
    Драйвер во время инициализации создает именованный Notification Event, устанавливая его в несигнальное состояние. После запуска юзермодной программы последней необходимо открыть этот евент по имени с правами EVENT_MODIFY_STATE. Логика понятна. Но на прктике получаю ACCESS_DENIED. Собственно, каким образом возможно это ограничение обойти? Предполагаю, что нужно копать в сторону настройки SECURITY_DESCRIPTOR прежде чем вызвать ZwCreateEvent(...).
    У кого какие соображения и видимые решения проблемы?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нет, не нужно.

    код в студию. у меня все работало без секьюрити дескрипторов.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да ну что ты говоришь, это как же у тебя приложение открывало событие, созданное процессом ядра, у которого в DACL на модификацию разрешение только SYSTEM'у, м?
     
  4. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    из кода драйвера:
    Код (Text):
    1.  
    2.  
    3. #define OBJECT_NUM_FOR_WAIT 1
    4. ...
    5. // -1= инициализируем Notification Event
    6. PVOID pvWaitEvents[OBJECT_NUM_FOR_WAIT];
    7. RtlInitUnicodeString(&usUserEventName, L"\\BaseNamedObjects\\scatch_us");
    8. InitializeObjectAttributes(&oaUserEvent, &usUserEventName, OBJ_INHERIT, NULL, NULL);
    9. ZwCreateEvent(&hUserEvent, EVENT_ALL_ACCESS, &oaUserEvent, NotificationEvent, FALSE);
    10. if (hUserEvent == NULL)
    11. {
    12.     DbgPrint("[Thread] ERR: cann't create 'scatch_us'-event \n");
    13.     PsTerminateSystemThread(STATUS_UNSUCCESSFUL);
    14. }
    15. if (STATUS_SUCCESS != ObReferenceObjectByHandle(hUserEvent,
    16.                                                        EVENT_ALL_ACCESS,
    17.                                                       *ExEventObjectType,
    18.                                                       KernelMode,
    19.                                                       &pkUserEvent,NULL))
    20. {
    21.     DbgPrint("[Thread] cann't get KPEVENT of 'scatch_us'\n");
    22.     ZwClose(hUserEvent);
    23.     PsTerminateSystemThread(STATUS_UNSUCCESSFUL);
    24. }
    25.  
    26. while(1)
    27. {
    28.            KeWaitForMultipleObjects(OBJECT_NUM_FOR_WAIT,
    29.                                               pvWaitEvents,
    30.                                               WaitAny,
    31.                                               Executive,
    32.                                               KernelMode,
    33.                                               FALSE,
    34.                                               NULL,
    35.                                               NULL);
    36.            // TODO дальнейшие действия
    37. }
    из кода программы:
    Код (Text):
    1. hUserEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, (LPCSTR)("scatch_us"));
    2. if (hUserEvent == NULL)
    3. {
    4.     printf("[ERR] cann't open event. Err: %X\n", GetLastError());
    5.     return 0;
    6. }
    GetLastError() возвращает ERROR_ACCESS_DENIED
     
  5. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    небольшая опечатка. Не заметил: pvWaitEvents[0] = pkUserEvent;
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    "scatch_us" ==> "Global\\scatch_us"
     
  7. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    hUserEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, (LPCSTR)("Global\\scatch_us"));

    так же ERROR_ACCESS_DENIED
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Конечно, потому что нужно правильно навесить DACL на объект-событие. Проще всего его тупо обнулить, код здесь. Учти только, что в этом случае доступ к объект получит любое приложение с любым уровнем привилегий.
     
  9. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Всем спасибо.
    Отдельное спасибо x64 - выручил!
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    x64
    ой я перепутал, извиняюсь. я хендл передавал :lol:
     
  11. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    amisto0x07, кста, решение с event-ом кривоватое. Что ты будешь делать в user-mode после возвращения WaitFor..()? ога, deviceIOcontrol() или XxxFile(). Так их можно сделать сразу а в драйвере пометить IRP как pending и положить в очередь. Усё.
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Такая модель сообщения называется inverted calls, если что.