2014-09-24 2 views
1

Я пишу минифильтр, чтобы заблокировать выполнение приложения. Minifilter запросит сканирование файлов на IRP_MJ_CREATE в приложениях usermode. Приложение usermode будет проверять, разрешать ли выполнение файла PE (.exe/.dll/etc) или нет.Minifilter: Заблокировать приложения с уведомлением

В настоящее время, когда приложения usermode говорят «нет», мини-фильтр выдаст статус отказа в доступе и отменит открытие файла. (Да, с помощью FltCancelFileOpen)

Проблема при выдаче доступа Отказано возвращаемое значение, с точки зрения пользователя, они получат окно сообщения из системы, как это: Windows cannot access the specified path or file. You may not have the appropriate permissions to access the item.

Другой пример, когда блокировать конкретные DLL из загружаемых, другой MessageBox появится:

The application was unable to start correctly (0xc00000022)

То, что я хочу сделать это до сих пор отрицает открытым, но подавить окно сообщения и иметь уведомление о моем собственных, которая является удобным для пользователя ERR или сообщение о том, что приложения были заблокированы. Пример подобен функции smartscreen от Windows 8, которая будет уведомлять пользователя при запуске заблокированного exe без какого-либо сообщения с сообщением об отказе в доступе или подобном. Windows 8 smart screen

Как я могу это сделать?

ответ

1

Давайте рассмотрим пример DLL. Вы получаете эту ошибку, потому что есть код в эквивалентном Windows, чтобы

if (!LoadLibrary(szDllName)) 
{ 
    MessageBox("Application Error", ...); 
} 
else 
{ 
    DllMain = GetProcAddress("DllMain"); 
    DllMain(DLL_PROCESS_ATTACH); 

Так что, если вы не хотите, чтобы первая ветвь коды, которые необходимо принять, вы должны позволить DLL для загрузки. Третьего варианта нет.

Пример Windows 8 вводит в заблуждение. Если вы Microsoft, конечно, вы можете добавить этот третий вариант.

С другой стороны, вы отменили операцию, используя FltCancelFileOpen? Если нет, то как вы это сделали?

+0

Спасибо за понимание, я знаю об этом. Возможно, то, что я ищу, является чем-то, что завершает работу приложения до его запуска. Например, IIRC, PsSetImageNotify. –

+0

Не похоже на работоспособный план - загрузка этой DLL происходит при блокировке загрузчика. Если загрузка будет успешной, DllMain будет выполняться под одной и той же блокировкой. Для завершения работы приложения вам потребуется блокировка загрузчика, так что он будет ждать завершения DllMain. (Я думаю, что Windows теперь уничтожит убегающие DllMains, но это не мгновенно) – MSalters

+0

Просто мысль здесь, что я не совсем уверен в ее возможности ... Вы можете перенаправить библиотеку на другой файл своего собственного создания, пустой DllMain. Это позволит вызывающему думать, что он успешно загружен. У вас все еще есть проблема с тем, что пытается выполнить звонок, т. Е. GetProcAddress не будет работать. Это может позволить вам завершить процесс, прежде чем он сможет вызвать GetProcAddress. – lordjeb

Смежные вопросы