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

Hos*_*ork 5 c windows kernel driver wdk

我一直在关注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.它安装的驱动程序将数据收集到缓冲区中,根据WM_TIMER循环,.EXE会定期请求该缓冲区:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我也可以反转这个模型.用户模式代码可以使用自定义IOCTL传入数据......例如可以由驱动程序发出信号的HEVENT,并且只是实现某种安全协议.这将消除对民意调查的需要.

基本上只是寻找方法的指导,或在网络上的工作示例!我也有兴趣知道异步文件访问的机制是什么.我假设有一种方法可以让正在检查的异步调用的客户端继续运行,只有当他们等待请求完成时才会被阻止...?


(注意:在构建和调试过滤器的过程中,我通过"miniFilters"了解到了一些更现代的技术 - 这些是过滤器管理器模型的一部分.但是目前,我并不关心只要支持传统模型.无论如何它看起来都很相似.)

Hos*_*ork 1

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

我将提供查看该项目的机会,但请注意自述文件中的免责声明。(这只是一个测试和调查)

https://github.com/hostilefork/CloneLocker

是的,就微软及其驱动程序模型令人担忧的程度而言,迷你过滤器是当今更好的选择。