阅读:4090回复:12
[求助]写了个笨笨的文件过滤驱动,请教如何过滤才能禁止访问又能够安全卸载U盘?
编译环境:Win2003+DDK2003
驱动原形:sfliter(2003版) 适用环境:32位的XP,2003,vista 版本:0.0.0.1版 beta版前传 ^_^ 功能描述:禁止在移动存储设备(如:U盘)上打开或创建autorun.inf文件。 控制移动存储设备的权限:禁用,浏览,只读,可写。 未解决的问题:在禁用模式下U盘无法安全卸载(困扰我好几天了 T_T) 缺点:过滤IRP过于粗鲁 >_< 成果:演示了如何只过滤移动设备的卷,判断设备类型与设备总线,个人觉得属于比较完美的方法了,当然如果有错误,欢迎来BS我。 演示了如何与驱动程序通信,当然属于最简单的方法。 方向:细化IRP过滤,剔除2K的代码,编写应用层DLL PS:我的email是destinyqq@hotmail.com,经常在驱网,看雪,安全矩阵以及白细胞等地方鬼祟活动。 PS又PS:感谢楚狂人前辈的教程,膜拜ing。 |
|
|
沙发#
发布于:2008-07-11 11:28
看看卸载时发过来的IRP是什么,能不能把它放过去。
|
|
|
板凳#
发布于:2008-07-11 11:49
"过滤IRP过于粗鲁"
"看看卸载时发过来的IRP是什么,能不能把它放过去。" 我认为这样的驱动只有必须处理的才可以处理,其余的直接iocalldriver |
|
地板#
发布于:2008-07-11 13:31
感谢 两位前辈的指导
细化IRP过滤 确实是很重要的方向 但是作为权限控制类的IRP过滤,我认为应该是使用白名单原则,授权可以通过的IRP放行,否则就阻拦。 还有万恶的 explorer 制造N多IRP 看着头大 T_T 准备改造下 spyfile 把explorer 的IRP统统过滤掉 |
|
地下室#
发布于:2008-07-15 14:26
没啥意思,不如hook XXX,然后判断一下,然后把U盘给禁了~~
|
|
|
5楼#
发布于:2008-07-23 11:25
= =...同樣的情況....我用mini-fitler實作一樣的功能(阻擋,唯讀)也遭遇到一樣的問題....
設定為(阻擋,唯讀)後 就無法安全移除u盤了.... 我將設定清除或將mini-filter unload還是一樣............無法安全移除......感覺是我傳了什麼東西給fltmgr.....導致這樣的結果? IRP_MJ_CREATE XxxPostCreate() .............//取得FileInformation內的Volume Name if (是符合的Volume) { Data->IoStatus.Status = STATUS_ACCESS_DENIED; Data->IoStatus.Information = 0; returnStatus = FLT_POSTOP_FINISHED_PROCESSING; } 請知道的大牛....指點一下....3q |
|
6楼#
发布于:2008-07-23 15:54
我的問題解決了mini-filter用FltCancelFileOpen操作就好....千萬別自己填IoStatus.Status....
這樣就可以達到封鎖阻擋而且還可以安全移除的功能 |
|
7楼#
发布于:2008-07-23 16:54
发代码是光荣的
|
|
8楼#
发布于:2008-07-23 17:29
引用第6楼download于2008-07-23 15:54发表的 : 我没有接触过 mini filter ,希望download能提供下关键代码段,我再看看在sfilter中怎么实现这个“FltCancelFileOpen”操作。 不过目前我使用的是一个非文档的方式,在2003与XP下可以,其他操作系统没有测试。感觉不妥当,还是用文档的方式比较好。 |
|
9楼#
发布于:2008-07-24 10:39
WINDDK\6000\src\filesys\miniFilter\\swapBuffers\\swapBuffers.c
CONST FLT_OPERATION_REGISTRATION Callbacks[] = { { IRP_MJ_CREATE, <-----MJ Function 0, SwapPreCreate, <----XxxPreOperation SwapPostCreate},..... <----XxxPostOperation { IRP_MJ_OPERATION_END } }; 在SwapPostCreate裡面從nameInfo可以知道目前是哪個磁區(X:) 然後新增程式碼做判斷 if (volume name是我要禁止訪問的) { FltCancelFileOpen( FltObjects->Instance, FltObjects->FileObject ); Data->IoStatus.Status = STATUS_ACCESS_DENIED; Data->IoStatus.Information = 0; returnStatus = FLT_POSTOP_FINISHED_PROCESSING; } 以下都不用動....也可以再用FltGetVolumeContext取得PDO Name做比對 引用楚大翻譯的文章內容有說到: 『对于打算在后操作回调中取消一个文件打开的微过滤器,FltCancelFileOpen()调用可以对指定的FileObject来一个清理和关闭的功能。微过滤器必须必须填写合适的错误代码,并且在后操作回调中返回FLT_POSTOP_FINISHED_PROCESSING.』 這樣大概就是全部的東西了.....字符串比對自己處理..... |
|
10楼#
发布于:2008-07-24 11:05
sfilter下有一个IoCancelFileOpen,不过据说有bug,,参看OSR IFS FAQ
|
|
11楼#
发布于:2008-07-24 11:14
感谢 download
可惜 FltCancelFileOpen 只能在mini filter下使用 需要高手逆向下了 我来说说我在sfilter下的方法 判断FileObject下的name是否为空,可以让U盘正常卸载 据我观察,当一个U盘mount后,有4个这样的creat irp,放行即可,当然也可以多放行几次。 |
|
12楼#
发布于:2008-07-24 11:51
引用第10楼microbe于2008-07-24 11:05发表的 : 找到啦 http://bbs.driverdevelop.com/htm_data/39/0710/106350.html 这是在creat irp已经完成后,使用IoCancelFileOpen关闭文件可能遇到的问题,解决办法: http://bbs.driverdevelop.com/htm_data/39/0701/98700.html 不知道 download 是在creat irp完成后过滤的,还是在完成前过滤的呢 ? 我都是在完成前过滤的,因为autorun.inf没有短名,应该都过滤得到吧(希望高手指点) |
|