我一直在看 Windows 的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
允许它接受我的测试证书,因为我没有支付 Microsoft 250 美元来签署我的 .SYS 文件。:-/)
现在我想修改 FsFilter。我想对某些类型的文件进行写访问以被过滤器捕获。然后我希望用户收到一个对话框,他们可以在其中允许访问或拒绝访问。
也许很明显......内核模式代码无法显示 UI。它必须向某些用户模式进程发出信号,该进程将(在任意潜伏时间之后)将用户的愿望返回给驱动程序。我看了一点 用户模式交互:内核模式驱动程序指南(这里是Google 的 Cache as 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;
}
我应该使用类似的技术吗?也许过滤器驱动程序在接收到它想要检查的请求时,可以在包含两个 HEVENT 的缓冲区中放置一条记录以跟踪该请求。然后它会在这两个 HEVENT 上 WaitForMultipleObjects,这表示来自用户模式的关于是否允许访问的信号“YES”或“NO”。
定期监控进程(在用户模式下运行)将使用自定义 IOCTL 从另一个线程轮询驱动程序。过滤器驱动程序将返回请求信息......以及请求正在等待的两个 HEVENT。监视器将等待用户的反馈,并在可用时发出适当事件的信号。
我也可以反转这个模型。用户模式代码可以使用自定义 IOCTL 来传递数据……例如可以由驱动程序发出信号的 HEVENT,并且只是实现某种安全协议。这将消除轮询的需要。
基本上只是在寻找有关方法的指导,或者在网上寻找一个工作示例!我也很想知道异步文件访问的机制是什么。我认为有一种方法可以使正在检查的进行异步调用的客户端可以继续运行,并且仅在他们等待请求完成时才被暂停...?
(注意:在构建和调试过滤器的过程中,我通过“miniFilters”了解到了一些更现代的技术——它们是过滤器管理器模型的一部分。但目前,我并不担心只要支持旧模型。无论如何,它看起来很相似。)