翻阅了驱网大部分老贴,关于U盘控制(禁用,只读等控制)依然没有什么清晰的解决思路,因此某些描述也可能不对,希望不要误导新人,XD。
首先第一个问题,在哪里过滤?
通过我翻阅老贴得知成功的例子有
“驱动小妹” 的 “U盘只读可控制 驱动程序实例” http://bbs.driverdevelop.com/read.php?tid-104501-keyword-%D6%BB%B6%C1.html
已经其关键代码 更早的 “zhjie374” 的 “共享我写的一个USB过滤驱动,实现U盘只读控制” http://bbs.driverdevelop.com/read.php?tid-90057-keyword-%D6%BB%B6%C1.html
这两位前辈都是用的 ddk中toaster/filter程序为原形 原理就是过滤相应的IRP_MJ_SCSI。
最后的结果就是一个 加载到USBSTOR的LowerFilters 。
给我的感觉这样做貌似已经不属于文件系统过滤驱动了吧,个人觉得这属于设备过滤驱动了,都已经是在和SCSI总线驱动交换数据了。
所以我在想能否使用 DDK中的filesys\filter\sfilter为原形开发呢?因为这个比较熟悉点 呵呵
可以通过过滤拦截 IRP_MJ_CREATE等IRP 来实现禁用呢?还可以把禁用分为“不可浏览目录”与“可浏览目录但无法读写” (笑)
以上两种方法都涉及到第二个问题,怎么判断过滤的是U盘(或者称为移动存储设备)
“zhjie374”前辈貌似没有说明这个问题,按照我对“zhjie374”前辈描述的猜测,如果驱动成功加载到USBSTOR的LowerFilters下,那么就只有U盘会加载这个驱动
但是按照“驱动小妹”前辈的例子,根据本人的测试,以及参照其余一些前辈的帖子后发现,挂接到USBSTOR的LowerFilters会引起重启系统时BSOD,因为我也是菜鸟,无法理解其原因,但是看见有前辈提出,这样做即便本地磁盘也会加载这个驱动,于是BSOD
如果是在 filesys\filter\sfilter为原形下开发,那么怎么判断是U盘呢? 想了两条路:
1.笨笨的方法:将驱动加载到所有卷上,然后判断是U盘加载卷的时候(准确的说应该是加载完成后),记录下对应的“盘符”(或者说“卷名”)。过滤IRP时判断是否是相应卷上的操作,如果是则拦截,不是则放行。
2.理想的方法:在驱动加载到卷上的时候,就判断这个卷对应的物理设备是否是U盘,是则加载,否则不加载。
关于这两个思路,对于第一个,我觉得可以在应用层得到U盘的插入事件,但是有两个问题:首先就是效率问题,明明不用过滤本地磁盘,还加载到本地磁盘的卷上显得太笨笨了。然后就是安全问题,因为应用层收到U盘插入设备的时候,卷已经加载完毕,可以正常读写,那么在这其中就可能造成本来应该禁用的U盘有段时间是可访问的。
于是提出第二的思路,但是可惜没有找到相应的示例,当然也考虑其实这是个错误的方法,因为既然是文件系统,那就应该屏蔽了下层的硬件介质,不过是否有更好的办法呢?
比如围绕USBSTOR编写驱动,在U盘加载设备驱动的时候就开始跟踪,做好标示,然后在加载文件系统的时候识别标示,再决定是否加载过滤驱动?
希望有前辈能指点一二,最希望的是能说明下应该查阅IFS Kit Documentation的哪个部分?因为平时都不知道怎么用IFS Kit Documentation,觉得不知如何下手查阅,有种身在宝山空手归的感觉 T_T。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)