destinyqq
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2013-01-29
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望35点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4090回复:12

[求助]写了个笨笨的文件过滤驱动,请教如何过滤才能禁止访问又能够安全卸载U盘?

楼主#
更多 发布于:2008-07-11 01:26
编译环境: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。
附件名称/大小 下载次数 最后更新
RemovableStor0.1.rar (43KB)  195 2008-07-11 01:26
pilixuanke
驱动中牛
驱动中牛
  • 注册日期2005-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1018分
  • 威望626点
  • 贡献值0点
  • 好评度512点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-11 11:28
看看卸载时发过来的IRP是什么,能不能把它放过去。
向底层开发进军!!!
mz_suya
驱动小牛
驱动小牛
  • 注册日期2008-06-13
  • 最后登录2010-08-01
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望648点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2008-07-11 11:49
"过滤IRP过于粗鲁"


"看看卸载时发过来的IRP是什么,能不能把它放过去。"


我认为这样的驱动只有必须处理的才可以处理,其余的直接iocalldriver
destinyqq
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2013-01-29
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望35点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-11 13:31
感谢 两位前辈的指导

细化IRP过滤 确实是很重要的方向

但是作为权限控制类的IRP过滤,我认为应该是使用白名单原则,授权可以通过的IRP放行,否则就阻拦。

还有万恶的 explorer 制造N多IRP 看着头大 T_T

准备改造下 spyfile 把explorer 的IRP统统过滤掉
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2008-07-15 14:26
没啥意思,不如hook XXX,然后判断一下,然后把U盘给禁了~~
没有战争就没有进步 X3工作组 为您提供最好的军火
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
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
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-07-23 15:54
我的問題解決了mini-filter用FltCancelFileOpen操作就好....千萬別自己填IoStatus.Status....

這樣就可以達到封鎖阻擋而且還可以安全移除的功能
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2008-07-23 16:54
发代码是光荣的
destinyqq
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2013-01-29
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望35点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-07-23 17:29
引用第6楼download于2008-07-23 15:54发表的  :
我的問題解決了mini-filter用FltCancelFileOpen操作就好....千萬別自己填IoStatus.Status....

這樣就可以達到封鎖阻擋而且還可以安全移除的功能



我没有接触过 mini filter ,希望download能提供下关键代码段,我再看看在sfilter中怎么实现这个“FltCancelFileOpen”操作。

不过目前我使用的是一个非文档的方式,在2003与XP下可以,其他操作系统没有测试。感觉不妥当,还是用文档的方式比较好。
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
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.』

這樣大概就是全部的東西了.....字符串比對自己處理.....
microbe
驱动小牛
驱动小牛
  • 注册日期2007-12-10
  • 最后登录2011-01-17
  • 粉丝1
  • 关注0
  • 积分914分
  • 威望420点
  • 贡献值1点
  • 好评度88点
  • 原创分0分
  • 专家分1分
10楼#
发布于:2008-07-24 11:05
sfilter下有一个IoCancelFileOpen,不过据说有bug,,参看OSR IFS FAQ
destinyqq
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2013-01-29
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望35点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-07-24 11:14
感谢 download

可惜 FltCancelFileOpen 只能在mini filter下使用 需要高手逆向下了

我来说说我在sfilter下的方法

判断FileObject下的name是否为空,可以让U盘正常卸载

据我观察,当一个U盘mount后,有4个这样的creat irp,放行即可,当然也可以多放行几次。
destinyqq
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2013-01-29
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望35点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-07-24 11:51
引用第10楼microbe于2008-07-24 11:05发表的  :
sfilter下有一个IoCancelFileOpen,不过据说有bug,,参看OSR IFS FAQ


找到啦 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没有短名,应该都过滤得到吧(希望高手指点)
游客

返回顶部