Доброго времени суток. У меня задача - разрешить запускаться "разрешенным" приложениям и блокировать "запрещенные". На данный момент я пробовал вот так: простейший драйвер, который перехватывает сервис NtCreateSection и возвращает ошибку в случае создания секции для "запрещенного" приложения. Приложение не запускается, однако система отображает сообщение - например: "notepad is not a valid win32 app..." Вопрос в следующем: 1. Есть ли другие способы блокировки запуска процессов из драйвера, так чтобы сообщение об ошибке не возникало? 2. Если без сообщения об ошибки не получиться, то как блокировать собственно это сообщение?
Можно, например, перехватывать функцию NtCreateProcess и возвращать ошибку типа STATUS_ACCESS_DENIED, и сообщение будет выводиться соответствующее. Проще и лучше, и я думаю врядли кто будет создавать процесс вручную, обходя NtCreateProcess.
Как это создать процесс вручную минуя NtCreateProcess ? из юзермода а поток как это создать вручную минуя NtCreateThread?
Great Сказал ведь Blast, NtCreateProcessEx, к ней и сводится kernel32!CreateProcessInternal() и ост. [NtCreateProcess сводится к NtCreateProcessEx]
Great У тебя вопрос был как создать без NtCreateProcess, не пойму причём число хуканых функций. Лан, шучу ))
GVL, я сталкивался с проблемой, когда при перехвате NtCreateSection выдаёшь что-то типа STATUS_ACCESS_DENIED. Винда ругается в красном окошке, мол файл не валидный и т.п. Если очень хочется хукать именно создание секции, то надо делать приблизительно так: Код (Text): NTSTATUS NtCreateSection_HOOKED (OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL) { ... if (Access_Denied(..)) { SectionHandle = NULL; return STATUS_SUCCESS; } ... }
Тотлько все проверил. Результаты следующие: Вернуть STATUS_ACCESS_DENIED из NtCreateProcess(Ex) не получается, так как не понятно для какого экзешника создается процесс (у меня всегда ObjectAttributes == NULL). Действительно, если вернуть STATUS_ACCESS_DENIED из NtCreateSection то все равно светиться ошибка "... is not valid win32 app...". Если сделать так как предлагает AntiFreeze то тогда светиться ошибка: "Handle is invalid". 2AntiFreeze: мне все равно что хукать, лишь бы работало так как мне нужно. Вобщем, все равно как-то этот мессадж нужно давить. Пока что идея такая: попробовать перехватить NtUserGetDCEx и вернуть NULL. Пошел смотреть что получиться...
PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine,FALSE); далее когда вызовется ваша функция ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&oa,&clientId) ObReferenceObjectByHandle(hProcess,0,NULL,UserMode,&eprocess,NULL); KeStackAttachProcess(eprocess,&ApcState); далее читаем полное имя процесса и если нам не нравится например то откуда он запущен или с какими параметрами то ZwTerminateProcess(hProcess,0); и нафик. И ненадо мудрить не скакими перехватами.
Перехватывать NtUserGetDCEx для этой задачи, ну.. совсем через одно место. ИМХО. Просто тут NtCreateSection не совсем годится - винда всё равно будет ругаться. Я поборол вышеописанным методом создание "побочных секций" в уже загруженном модуле. В конце-концов хукни NtCreateThread, если с NtCreateProcess(Ex) не получается.
AntiFreeze ыы ))) lev Нотификаторов может не хватить GVL Стену видишь ?) Находим указатель на секцию, хэндл которой передаётся, извлекаем полное имя модуля. All Ручки кривые)
2lev - спасибо, это как раз то решение которое мне нужно, и оно меня вполне устраивает, не смотря на огранничения. Только что проверил - все работает! Ну а поповоду NtUserGetDCEx - не смейтесь - я новичок в программировании на уровне ринг0. Всем спапсибо.
Привет всем, тема снова актуальна. Вот решение которое отлично работало больше года: После очередного виндового апдейта метод ZwTerminateProcess стабильно светит месаджбкс, что мол ошибка - файл не валидный или доступа нет. Пробовал метод NtTerminateProcess - этот возвращает ошибку ACCESS_DENIDED. Возможно ли еще решение с блокровкой запуска процесса без всяких месаджей об ошибках?
Тебе именно в драйвере? Есть рабочее решение в режиме пользователя. В ядре только начиная с Vista SP1 можно нормально это сделать. Ну если сильно надо именно в ядре, ok, расскажу, но ты подумай всё таки.