首页 文章

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

提问于
浏览
5

我've been looking at Windows' s File System Filter Drivers . 我从这个"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 . 它必须发出一些用户模式进程的信号,这将(在任意潜伏的一段时间之后)信号反馈用户's wish to the driver. I' ve看起来有点超过User-Mode Interactions: Guidelines for Kernel-Mode Drivers(这里是Google's Cache as 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;
}

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

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

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

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


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

1 回答

  • 1

    你(a.k.a.我)几乎列举了各种可能性 . 以FileMon的方式进行轮询,或者传递事件 . 传递事件可能更容易出错,如果你不是更容易出错的话 . 但是如果你犯了很多错误,那么设备驱动程序可能不适合你......跳伞也可能是一个糟糕的选择 .

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

    https://github.com/hostilefork/CloneLocker

    是的,如果微软及其驱动程序模型成为人们所担心的问题,那么miniFilters是最好的选择 .

相关问题