【问题标题】:Minifilter: Block applications with notificationMinifilter:通过通知阻止应用程序
【发布时间】:2014-09-24 10:35:47
【问题描述】:

我正在编写一个微过滤器来阻止应用程序执行。微过滤器将向用户模式应用程序请求对 IRP_MJ_CREATE 进行文件扫描。用户态应用程序会扫描是否允许PE文件(.exe/.dll/etc)执行。

目前,当用户模式应用程序拒绝时,微过滤器将发出拒绝访问状态,并取消文件打开。 (是的,使用FltCancelFileOpen

发出拒绝访问返回值时的问题是,从用户的角度来看,他们会从系统中得到一个消息框,如下所示:

另一个例子,当阻止特定的dll被加载时,会出现另一个消息框:

我想要完成的是仍然拒绝打开但抑制消息框并有我自己的通知,这是一个用户友好的错误消息,表明应用程序被阻止。示例就像 Windows 8 智能屏幕功能,它会在运行被阻止的 exe 时通知用户,而没有任何消息框说访问被拒绝或类似。

我该怎么做?

【问题讨论】:

    标签: c++ c windows driver minifilter


    【解决方案1】:

    让我们以 DLL 为例。您收到该错误是因为 Windows 中有相当于

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

    因此,如果您不想占用代码的第一个分支,则应允许加载 DLL。没有第三种选择。

    Windows 8 示例具有误导性。如果您是 Microsoft,当然可以添加第三个选项。

    [编辑] 再想一想,您是否使用 FltCancelFileOpen 取消了操作?如果没有,那你是怎么做到的?

    【讨论】:

    • 感谢您的洞察力,我知道这一点。也许我正在寻找的是在应用程序运行之前终止它的东西。例如,IIRC、PsSetImageNotify。
    • 听起来不像一个可行的计划 - 该 DLL 的加载发生在加载程序锁定下。如果加载成功,DllMain 将在同一个锁下执行。要终止应用程序,您还需要加载程序锁,以便等待 DllMain 完成。 (我认为 Windows 现在会杀死失控的 DllMains,但这不是即时的)
    • 只是一个想法,我不太确定它的可行性...您可以将打开的库重定向到您自己创建的另一个具有空 DllMain 的文件。这将使调用者认为他已成功加载。无论调用者接下来尝试什么,您仍然有问题,即 GetProcAddress 将失败。不过,这可能允许您在进程调用 GetProcAddress 之前终止进程。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多