我一直在看Windows的文件系统filter驱动程序 。 我从这个“FsFilter”的例子开始:
http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial
通过努力,我设法build立并签署了从64位Win8到32位WinXP的各种版本。 (好吧,只要我运行Bcdedit.exe -set TESTSIGNING ON
来允许它接受我的testing证书,因为我没有支付微软$ 250来签署我的.SYS文件。: – /)
现在我想修改FsFilter。 我想写访问某些types的文件被filter困住。 然后,我想要用户收到一个对话框,他们可以在其中允许访问或拒绝访问。
也许很明显…内核模式代码不能显示UI。 它将不得不发出一些用户模式过程的信号,这将在(任意潜伏的时间段之后)将用户的愿望反馈给驾驶员。 我已经看了一下有关用户模式交互:内核模式驱动程序指南 (这里是谷歌的caching为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; }
我应该使用类似的技术? 也许filter驱动程序在接收到要检查的请求时,可能会放置一个logging,以便在包含两个HEVENT的缓冲区中跟踪请求。 然后,这两个HEVENT上的WaitForMultipleObjects将代表用户模式中的“YES”或“NO”是否允许访问。
定期监视进程(以用户模式运行)将使用自定义IOCTL从另一个线程轮询驱动程序。 filter驱动程序将返回请求信息以及请求正在等待的两个HEVENT。 监视器将等待用户的反馈,并在可用时发出适当的事件信号。
我也可以反转这个模型。 用户模式代码可以使用自定义的IOCTL来传递数据,例如可以由驱动程序发送的HEVENT,只是实现某种安全的协议。 这将消除轮询的需要。
基本上只是寻找方法的指导,或在networking上的工作示例! 我也有兴趣知道什么机制将在asynchronous文件访问。 我假设有一种方法,使得正在被检查的asynchronous调用的客户端可以继续运行,并且只有在等待请求完成时才被阻止。
(注意:在构build和debuggingfilter的过程中,我通过“迷你filter ”了解到了一些更加现代的技术,这些filterpipe理器模型是filterpipe理器模型的一部分,但目前我并不担心只要支持传统模式,无论如何看起来都很相似。)
你(又名我)已经列举了很多可能性。 轮询FileMon的方式,或者传递一个事件。 传递事件可能更容易出错,如果你不是线程专家,那么可能会有更多的错误发生。 但是,如果你倾向于犯很多错误,那么设备驱动程序可能不适合你…跳伞也许是一个不好的选择。
我会提供看看这个项目,但请注意自述文件中的免责声明。 (这只是一个考验和调查) :
https://github.com/hostilefork/CloneLocker
是的,如果微软和他们的驾驶员模型成为人们担心的事情,那么miniFilters是最好的选择。