Блокировать запуск процесса

Тема в разделе "WASM.NT.KERNEL", создана пользователем GVL, 22 окт 2008.

  1. GVL

    GVL New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    7
    Доброго времени суток.
    У меня задача - разрешить запускаться "разрешенным" приложениям и блокировать "запрещенные".
    На данный момент я пробовал вот так:
    простейший драйвер, который перехватывает сервис NtCreateSection и возвращает ошибку в случае создания секции для "запрещенного" приложения. Приложение не запускается, однако система отображает сообщение - например: "notepad is not a valid win32 app..."

    Вопрос в следующем:
    1. Есть ли другие способы блокировки запуска процессов из драйвера, так чтобы сообщение об ошибке не возникало?
    2. Если без сообщения об ошибки не получиться, то как блокировать собственно это сообщение?
     
  2. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Можно, например, перехватывать функцию NtCreateProcess и возвращать ошибку типа STATUS_ACCESS_DENIED, и сообщение будет выводиться соответствующее. Проще и лучше, и я думаю врядли кто будет создавать процесс вручную, обходя NtCreateProcess.
     
  3. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Из юзермода? Оо это как? может вы с потоком перепутали?) или имеете ввиду NtCreateProcessEx?))
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Как это создать процесс вручную минуя NtCreateProcess ? :lol: из юзермода

    а поток как это создать вручную минуя NtCreateThread? :lol:
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Software Restriction Policy?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Сказал ведь Blast, NtCreateProcessEx, к ней и сводится kernel32!CreateProcessInternal() и ост.
    [NtCreateProcess сводится к NtCreateProcessEx]
     
  7. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    туплю )
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    разница то? похукать 1 или похукать 2 функции
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    У тебя вопрос был как создать без NtCreateProcess, не пойму причём число хуканых функций. Лан, шучу :)))
     
  10. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    GVL, я сталкивался с проблемой, когда при перехвате NtCreateSection выдаёшь что-то типа STATUS_ACCESS_DENIED. Винда ругается в красном окошке, мол файл не валидный и т.п. Если очень хочется хукать именно создание секции, то надо делать приблизительно так:
    Код (Text):
    1. NTSTATUS NtCreateSection_HOOKED (OUT PHANDLE  SectionHandle,
    2.                               IN ACCESS_MASK  DesiredAccess,
    3.                        IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
    4.                            IN PLARGE_INTEGER  MaximumSize OPTIONAL,
    5.                                     IN ULONG  SectionPageProtection,
    6.                                     IN ULONG  AllocationAttributes,
    7.                                    IN HANDLE  FileHandle OPTIONAL)
    8. {
    9. ...
    10. if (Access_Denied(..))
    11. {
    12.     SectionHandle = NULL;
    13.     return STATUS_SUCCESS;
    14. }
    15. ...
    16. }
     
  11. GVL

    GVL New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    7
    Тотлько все проверил. Результаты следующие:

    Вернуть STATUS_ACCESS_DENIED из NtCreateProcess(Ex) не получается, так как не понятно для какого экзешника создается процесс (у меня всегда ObjectAttributes == NULL).

    Действительно, если вернуть STATUS_ACCESS_DENIED из NtCreateSection то все равно светиться ошибка "... is not valid win32 app...".

    Если сделать так как предлагает AntiFreeze то тогда светиться ошибка: "Handle is invalid".
    2AntiFreeze: мне все равно что хукать, лишь бы работало так как мне нужно.

    Вобщем, все равно как-то этот мессадж нужно давить. Пока что идея такая: попробовать перехватить NtUserGetDCEx и вернуть NULL. Пошел смотреть что получиться...
     
  12. lev

    lev New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2006
    Сообщения:
    16
    PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine,FALSE);
    далее когда вызовется ваша функция
    ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&oa,&clientId)
    ObReferenceObjectByHandle(hProcess,0,NULL,UserMode,&eprocess,NULL);
    KeStackAttachProcess(eprocess,&ApcState);
    далее читаем полное имя процесса и если нам не нравится например то откуда он запущен или с какими параметрами то ZwTerminateProcess(hProcess,0); и нафик.
    И ненадо мудрить не скакими перехватами.
     
  13. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    Перехватывать NtUserGetDCEx для этой задачи, ну.. совсем через одно место. ИМХО.

    Просто тут NtCreateSection не совсем годится - винда всё равно будет ругаться. Я поборол вышеописанным методом создание "побочных секций" в уже загруженном модуле.

    В конце-концов хукни NtCreateThread, если с NtCreateProcess(Ex) не получается.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AntiFreeze
    ыы
    )))
    lev
    Нотификаторов может не хватить :)
    GVL
    Стену видишь ?)
    Находим указатель на секцию, хэндл которой передаётся, извлекаем полное имя модуля.
    All
    Ручки кривые)
     
  15. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    http://www.rsdn.ru/Forum/message/2308423.flat.1.aspx
     
  16. GVL

    GVL New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    7
    2lev - спасибо, это как раз то решение которое мне нужно, и оно меня вполне устраивает, не смотря на огранничения. Только что проверил - все работает!

    Ну а поповоду NtUserGetDCEx - не смейтесь :) - я новичок в программировании на уровне ринг0.
    Всем спапсибо.
     
  17. GVL

    GVL New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    7
    Привет всем, тема снова актуальна. Вот решение которое отлично работало больше года:
    После очередного виндового апдейта метод ZwTerminateProcess стабильно светит месаджбкс, что мол ошибка - файл не валидный или доступа нет. Пробовал метод NtTerminateProcess - этот возвращает ошибку ACCESS_DENIDED.
    Возможно ли еще решение с блокровкой запуска процесса без всяких месаджей об ошибках?
     
  18. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Тебе именно в драйвере? Есть рабочее решение в режиме пользователя. В ядре только начиная с Vista SP1 можно нормально это сделать. Ну если сильно надо именно в ядре, ok, расскажу, но ты подумай всё таки.
     
  19. reader323

    reader323 New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    134
    Поделитесь идеями, x64 всем интересно :)
     
  20. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Почему бы не поведать оба решения )