C语言 如何用过滤器驱动程序(内核)捕获文件访问尝试,并提供允许/拒绝(用户)对话框



我一直在看Windows的文件系统过滤驱动程序。我从这个"FsFilter"的例子开始:

http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial

经过努力,我设法构建并签署了从64位Win8到32位WinXP的所有版本。(好吧,只要我运行Bcdedit.exe -set TESTSIGNING ON允许它接受我的测试证书,因为我没有支付微软250美元来签署我的。sys文件。: -/)

现在我想修改FsFilter。我希望对过滤器捕获的某些类型的文件进行写访问。然后,我希望用户收到一个对话框,在这个对话框中,他们可以允许访问或拒绝访问。

也许很明显……内核模式代码无法显示UI。它必须向某个用户模式进程发送信号,该进程将(在任意潜伏一段时间后)向驱动程序发送回用户的愿望信号。我已经仔细看了一下用户模式交互:内核模式驱动指南(这里是Google的缓存格式为HTML,而不是。doc)

我不知道最好的攻击方式是什么。我发现的唯一一个值得研究的例子是SysInternals FileMon。它安装的驱动程序在缓冲区中收集数据,该缓冲区由.EXE根据WM_TIMER循环定期请求:

// Have driver fill Stats buffer with information
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_GETSTATS,
            NULL, 0, &Stats, sizeof Stats,
            &StatsLen, NULL ) )
{
    Abort( hWnd, _T("Couldn't access device driver"), GetLastError() );
    return TRUE;
}

我应该使用类似的技术吗?也许过滤器驱动程序在接收到它想要检查的请求时,可以在包含两个heevent的缓冲区中放置一条记录来跟踪请求。然后,它将在这两个heevent上WaitForMultipleObjects,这两个事件表示来自用户模式的关于是否允许访问的带有信号的"YES"或"NO"。

监视器进程(在用户模式下运行)将使用自定义IOCTL从另一个线程轮询驱动程序。过滤器驱动程序将返回请求信息…以及请求正在等待的两个事件。监视器将等待用户的反馈,并在可用时发出适当的事件信号。

我也可以反转这个模型。用户模式代码可以使用自定义IOCTL来传递数据…例如可以由驱动程序发出信号的heevent,并实现某种安全协议。这将消除轮询的需要。

基本上只是在寻找方法上的指导,或者在网上一个工作的例子!我也很想知道异步文件访问的机制是什么。我假设有一种方法,使客户端正在检查的异步调用可以保持运行,只有当他们等待请求完成时才会被搁置……?


(注意:在构建和调试过滤器的过程中,我通过"miniFilters"了解了一些更现代的技术——它是过滤器管理器模型的一部分。但就目前而言,只要支持遗留模型,我就不那么担心。

I)已经列举了很多可能性。要么像FileMon那样轮询,要么传递一个事件。传递事件可能更容易出错,如果您不是线程专家,那么出错的可能性可能更大。但如果你经常犯错误,那么设备驱动程序可能不适合你……跳伞可能也是个糟糕的选择。

我将提供看一下这个项目,但请注意README中的免责声明。(这只是一个测试和调查):

https://github.com/hostilefork/CloneLocker

是的,在某种程度上,微软和他们的驱动模型是担心的东西,miniFilters是更好的选择,这些天

相关内容

最新更新