再“弹”谈WindwsNT内核下文件系统过滤驱动程序开发再“弹”谈WindwsNT内核下文件系统过滤驱动程序开发WindOws
再“弹”谈WindwsNT内核下文件系统过滤驱动程序开发
再“弹”谈WindwsNT内核下文件系统过滤驱动程序开发
WindOwsNT 和基于NT内核的WindOws2000/XP操作系统中,通常需要通过开发文件系统过滤驱动程序来保证文件系统的信息安全运行,主要包括动态病毒扫描、透明文件加密解密、文件保护和系统恢复等功能。文件系统驱动程序(FileSystemDriver,简称FSD)管理文件系统格式。WindOwSNT的文件系统驱动程序是I/O子系统的一个组件,为用户提供在磁盘或者磁带等非易失性存储介质上存取数据服务。WindOwsNT的文件系统驱动程序和其他的设备驱动程序的一个主要的区别就在于文件系统驱动程序和内存管理器、高速缓存管理器有机的结合在一起,有着密不可分的关系。为了提高系统性能,FSD通常使用高速缓存(Cache)管理器以高速缓存文件数据。FSD还和内存管理器结合起来,以使内存映射文件能被正确实现_1J。本文首先探讨文件系统过滤驱动程序开发的原理和步骤,然后给出一个实现文件透明加密解密的实例。由于Wind0wSNT/20O0/XP操作系统的文件系统过滤驱动程序开发有着很类似的方面,下文中如果没有特别说明,则是针对以NT内核为基础的WindOwsNT/2000操作系统而言的。
1 文件系统过滤驱动程序开发
WindOwsNT 的I/O管理器是一个可扩展的结构,通过开发过滤驱动程序可以扩展I/O子系统的功能。I/O管理器支持分层驱动程序模型,每个I/O请求包(IRP)的处理分别经过各层驱动程序,直到某层驱动程序完成这个请求。这样第三方开发的驱动程序就有机会插入到这个层次结构中并获得截获及处理来自上层的操作请求的机会,把这种驱动程序称为过滤驱动程序。
文件系统过滤驱动程序是针对文件系统而言的。WindOwsNT的I/O管理器根据用户的文件操作请求构造IRP发到文件系统驱动程序,文件系统驱动程序把相应于文件系统的操作转换为相应于存储设备驱动程序的操作并通过I/O管理器来调用存储设备驱动程序。I/O管理器在发送操作请求到目标设备之前会检查是否有其他的设备附着于目标设备对象之上。通过构造附加的设备对象附着在文件系统或者存储设备对象之上,并为该设备对象指定专门的驱动程序,I/O管理器就会把要发送到目标设备的请求先发到附加的过滤设备,在该设备对应的过滤驱动程序中对原始请求加入附加的处理来实现对文件系统操作的截取、监控甚至替换。
文件系统过滤驱动程序可以附着在文件系统驱动程序之上,也可以加入到文件系统驱动程序和存储设备驱动程序之间,如图1所示。具体实现一个过滤驱动程序的基本步骤包括:构造一个设备对象(过滤设备)附着在目标设备上;在这个过滤设备对应的驱动程序(过滤驱动程序)中截取发送到目标设备的操作;在过滤操作中可能需要构造新的IRP来驱动下层驱动程序,也可能需要为某个IRP指定对应的完成例程以便这个IRP被下层驱动程序完成返回后调用;在合适的时候可以断开过滤程序。
图 1 文件系统过滤驱动程序在系统中的位置
2 文件透明加密解密的过滤器实例
下面给出一个在WindOwT下进行文件加密解密的过滤器具体实现过程。用户的数据在存储到磁盘上设定的安全区域(例如安全文件夹)之前经过了加密处理,读取时经过解密返回给用户,这个过程对用户来说是透明的。对这个安全区域访问时先要通过认证处理,这样就保证了安全区域里的数据安全。对于现有的WindOwsNT/2000/XP系列操作系统的文件系统本身来说,只是对WindOws2000/XP支持的5。0版本以上的NTFS文件系统本身实现了加密文件系统(EFS)。对所有文件系统分区的文件实现透明的加密解密并采用特殊的加密算法,就需要通过文件系统过滤驱动程序来实现。
在文件系统驱动程序和硬盘驱动程序之间加入过滤驱动程序。当文件系统驱动程序写硬盘的时候,过滤驱动程序首先对数据进行加密然后再调用硬盘驱动程序。当文件系统驱动程序读硬盘的时候,过滤驱动程序先调用硬盘驱动程序读取数据并对从硬盘返回的已加密数据进行解密,然后再返回给文件系统驱动程序。过滤器在系统中位于文件系统驱动程序和磁盘驱动程序之间。
要实现这个过滤器,首先需要把过滤器挂接在某个硬盘分区之上,可以在过滤驱动程序的DriverEntry例程或者应用程序中调用DeviceIO—COntrOl发送一个IOC~L请求驱动程序来挂接到硬盘上。该过程的函数调用过程为:由ZwCreate—File得到硬盘分区的设备句柄,再用ObRefer—enceObjectByHandle得到对应的FILE—OBJECT指针(wind0wsNT把每个设备当作一个文件来看待,并有一个对应的FILE—OBJECT结构描述其属性),调用IOGetRelatedDevieeObjeet得到硬盘分区设备对象指针。然后调用IOCreateDevice来构造代表过滤器的一个设备并为它指定驱动程序也就是过滤驱动程序。最后调用IOAttachDe—viceByPOinter把该设备挂接在硬盘分区设备上。这样文件系统驱动程序发送到这个硬盘分区设备的所有请求都会先经过过滤器。
硬盘驱动程序由DriverEntry提供一系列的IRP处理函数供高层驱动程序调用。在过滤驱动程序中实现加密解密是通过截取IRP_MJ_READ和IRP_MJ_WRITE来实现的。在过滤驱动程序的DriverEntry例程中指定处理函数:DriverObject->MajOrFunctiOn[IRP_MJ_WRITE] = MyFilterWrite;DriverObject->MajOrFunctiOn[IRP—MJ—READ] = MyFilterRead。
在IRP—MJ—WRITE的处理函数中如果需要加密处理就在非分页内存中分配一段与待写数据空间大小相同的内存,并把待写数据拷贝到这段内存中,对这段内存数据调用加密处理,建立这段内存的内存描述符MDL,更新IRP结构中的Irp->MdlAddress指向这个新建立的MDL,并记住原先的值。为这个IPR指定一个完成例程,接着调用下层的硬盘驱动程序写入已加密数据。硬盘驱动程序完成这个写操作并返回后,系统会调用指定的这个完成例程。在完成例程中恢复Irp->MdlAddress为原来的值并且释放原先分配的那段内存。
在IRP—MJ—READ的处理函数中解密是一个近似相反的过程。先直接调用硬盘驱动程序取得数据,然后在它的完成例程中对读取的数据进行解密返回上层驱动程序。
3 主要应用和展望
基于文件系统过滤驱动程序可以实现动态的病毒扫描。文件系统针对病毒的安全措施有两种:一种是以杀为主的静态反病毒措施,另一种是以防为主的动态反病毒措施。动态的反病毒措施也就是对病毒实时监控,这个可以通过文件系统过滤驱动程序来实现。基本方法是在文件系统驱动程序上面加入一个过滤驱动程序来过滤被病毒感染的文件。这个过滤驱动程序先于文件系统看到I/O操作请求,在截取到上层传下来的写操作请求时如果侦测到病毒特征就拒绝这个请求,保证硬盘数据的安全。
另外,利用文件系统过滤驱动程序可以实现分级的存储管理。举例来说,一个系统中有两个存储设备,一个存取速度很快价格很昂贵;另一个存取速度较慢但是价格便宜。可以作一个过滤驱动程序附着在文件系统驱动程序之上来优化系统性能。把不常用的数据放在慢速设备上,当截取到对这些数据的操作请求时先把这些数据转移到快速设备然后再向下传递原来的操作请求到文件系统驱动程序,这样就可以在现有设备不变的情况下获得更好的系统性能。
开发文件系统过滤驱动程序的用途在于它可以扩展、修改、甚至替代现有文件系统的操作而不用重新开发新的文件系统驱动程序。随着信息技术的发展和WindOwsNT应用的普及,文件系统过滤驱动程序的开发会有着更广泛的应用
[解决办法]
顺带说说,我只是找资料百度到这里,但是楼主,劝你一句,先把基础打好了,别一个劲的在这里问,Delphi据我所知现在适用率最高的还是信息系统那一套,这里的高手对windows很少有熟悉的,玩内核,先把基础打好了再说,楼主我可以这么评价你:好高骛远却又没有真才实学。你什么都不懂却又以为自己懂,这是大忌,好自为之吧
[解决办法]
[解决办法]无论是delphi也是c++也好
都要面对的是大量的 底层数据结构 函数。。
[解决办法]楼上某位话虽然很冲,不过也是大实话,只是大实话往往不中听……
毕竟windows大部分是C语言写的,搭配少量的ASM,要去操作windows内核,C语言还是最佳的选择。
另外,楼主是想玩玩而已呢还是想深入下去?深入下去,要等你学会一点皮毛,可能需要一两年的时间,甚至更多,如果不靠这个吃饭,还是做点其他相对更有意义的事情比较好。急于求成的确不是好事。
如果打定主意学这方面的东西,就先学学C和汇编吧,windows的复杂程度远超你的想象。
另外就是先弄清楚驱动是个什么东西,好像你之前问过sys的原理是什么,如果你连这最基本的原理都不懂,谈何开发呢?
如果有兴趣,先找几本windows驱动方面的书看看吧,张帆的,马勇的那两本,看看你能了解多少
[解决办法]这方面公开代码肯定很少,文件过滤驱动是很多公司吃饭的东西,是核心技术,核心技术怎么可能随便流传开来呢……
底层数据结构其实通过逆向也差不多被人摸了个七七八八了,只是危险性和不稳定性仍然存在,所以写驱动的经常会死机蓝屏调试……
[解决办法]EFS只是一个很初级的加密,不带任何代码,不需要驱动操作任何IRP的方式
比如这里
http://www.enet.com.cn/article/2009/0430/A20090430466747.shtml
这是不需要代码的一种方式
[解决办法]高端。。。
[解决办法]EFS只适合NTFS,你要通用,不可能
你要自己写一个类似的,还必须针对FAT32和NTFS两种不同的结构写两种不同的处理方法
好像微软的sfilter能通用,可以去找找看
[解决办法]谢谢楼主发布分享
学习一下
[解决办法]透明加密,我懂,不告诉你
[解决办法][解决办法] 你收集的资料有些有部分道理,有些没有道理,有些有似是而非,如果真想搞透明文件加密,目前的所有加密方式对单机可以,在网络文件系统下就有问题,几点提示:
1. 操作系统的内存管理分为内核层和用户层,一般的用户软件没法访问内核的API(如果使用C,只要调用了WINDOWS.H就没戏)。
2. 目前大部分透明加解密软件都是用下钩子的方式改变了ZWReadFile, ZwWriteFile以及相关的内核API函数,当然前提是他的钩子也工作在内核层,这就需要专门的安装方式,而且还要有微软的授权书。
另外这种方式微软并不推荐,因为你改了人家的东西,出了事算谁的?而且你对微软下钩子,别人又对你下钩子,钩子何其多,系统不崩才怪。真正风险较小的方式反而是用WDM做驱动级编程。不过绝大部分软件企业不愿意在这里钻牛角尖。
3. 透明加密有几个问题要考虑:
1)加密的途径(你收集的资料主要讲的是这方面)。
2)密钥的生成与管理,这点实际上是很麻烦的,你的文章很少涉及,如果涉及网络文件管理就更麻烦。
3)软件系统的广泛支持,普通的软件是规规矩矩的使用ReadFile,WriteFile来进行文件存取的,很容易用钩子解决,但微软自己的OFFICE和其他一些软件为了提高效率等,使用的是另一套底层处理机制,你下钩子对它没用。
[解决办法][解决办法]而且SSDT HOOK的话,在X64 win7很有问题,也不是微软推荐的方法,微软推荐的是文件过滤驱动
[解决办法]微软从来就不推荐任何驱动什么的东西……特别是undocumented API这类
现行的文件过滤驱动好像是截IRP然后自己发包进行IRP操作,Zw和Nt那一类用的很少了
[解决办法][解决办法]楼上某位话虽然很冲,不过也是大实话,只是大实话往往不中听……
毕竟windows大部分是C语言写的,搭配少量的ASM,要去操作windows内核,C语言还是最佳的选择。
另外,楼主是想玩玩而已呢还是想深入下去?深入下去,要等你学会一点皮毛,可能需要一两年的时间,甚至更多,如果不靠这个吃饭,还是做点其他相对更有意义的事情比较好。急于求成的确不是好事。
如果打定主意学这方面的东西,就先学学C和汇编吧,windows的复杂程度远超你的想象。
另外就是先弄清楚驱动是个什么东西,好像你之前问过sys的原理是什么,如果你连这最基本的原理都不懂,谈何开发呢?
如果有兴趣,先找几本windows驱动方面的书看看吧,张帆的,马勇的那两本,看看你能了解多少
------解决方案--------------------
几分?
[解决办法][解决办法][解决办法][解决办法]hao .
[解决办法]学习了
[解决办法]学习了,好东西
[解决办法]你是在你自己的计算机运行驱动程序还是要在别人的计算机运行?
[解决办法][解决办法]来学习下了。
[解决办法]好帖,,收藏。。
[解决办法]想写就写不要顾虑这么多。不写怎么不知道自己写不出来。比尔才上两年大学。他那时候知道的东西更少。
努力就有希望。放弃注定失败。
[解决办法]这个……文章的图在哪里啊?
[解决办法]学习。
[解决办法]你如果认为自己有足够的钻研精神多学一个汇编和c又有何妨
[解决办法]这两个的作用远比windows驱动程序大
[解决办法]学习下,长点见识。。。
[解决办法]好多高手啊,佩服中。。。
[解决办法]能,,,
[解决办法]如果仅仅是用vc,缺少头文件和导入库,你是否安装了wdk
[解决办法]开发环境推荐VC2008 + WDK 7600 + DDK Wizerd,网上有教程,相信你的搜索能力。
手写makefile也是可以的,小工程可以玩玩,大项目就有点坑爹了
[解决办法][解决办法]理论上不是很需要Debugview,文件过滤驱动大部分时间都是分析蓝屏Dump,因为一出错就蓝了,哪会给你机会看输出……
[解决办法]打酱油路过。各位讨论的很热烈啊!
驱动程序是一棵树,大概的说是各种设备驱动挂在总线驱动上,各个不同驱动对象的设备对象构成一个栈,同一驱动对象的设备对象构成一个横向的链,这样就构成一个二维的网,IRP主要在垂直方向上传递。
各个不同的设备有不同的驱动对象,各个驱动对象间有很大的不同点,因为具体的硬件设备的特点不同。可以理解为一种驱动对象对应一种硬件规范,比如串口、文件系统、NDIS等。
应用层的现象都是驱动层设计的结果,比如各种锁和等待事件等。驱动层和应用层的编程思维方式有很大的不同。
比如,驱动层你的函数时刻都会重入,你不是工作在一个固定的上下文,你的很多代码行为要符合OS的规范,而不是按照你的思路去写。
至于学习,中文版资料:windows驱动开发详解 寒江独钓 曲径通幽
英文资料:要看很多网站OSR NTFS等。
其他知识:机器码的解析过程、Rootkit、反汇编代码的阅读和分析、缓冲区溢出。
指望学些了这些就可以游刃有余,达到应用层开发的水平,还差的很远。因为光是一个文件系统就要掌握虚拟内存管理器和文件缓存、物理磁盘之间的关系、同时又有新的知识minifilter,你也要掌握。
其他的我也不清楚,不敢多说,打酱油去了。
[解决办法]
好贴就是得顶!
[解决办法]
谢谢楼主发布分享
学习一下呢
[解决办法]
[解决办法]标记下回来细看^^
[解决办法]雖然用不上,但值得收藏!
[解决办法]WindwsNT内核下文件系统过滤驱动程序开发
很值得阅读
[解决办法]路过学习
[解决办法]事实上事实上收拾收拾收拾收拾
[解决办法]hah .看看.
[解决办法]防拷贝?用BitLocker不就行了。
关于Kernel mode编程资料,直接读WDK的帮助就行了,别的基本上不需要什么。
关于过滤,本质上就是看谁做得更绝更底层,文件过滤是在文件系统驱动的栈中做手脚,底下是Volume Object,可以在存储设备驱动的栈中做手脚,可以在端口驱动上做手脚,在磁盘的控制器中做手脚。
[解决办法][解决办法]容存入剪贴板
[解决办法]占楼观望 顺便接分
[解决办法]鄙视LS某些装13的人。除了装13,还是装13,什么WDK就够了,你没听过WDK的错误吧?你不知道WDK关于文件过滤系统只有只言片语么?什么楼主什么都不懂,你牛B,你牛B还有时间在这里吹牛B?什么SDT HOOK是小孩子玩的,你看过360的SDT HOOK框架没?还有些就不列举了,往往这种自以为是的人,自己最可能是半罐子水!!楼主别被他们影响了
建议楼主多去看雪逛逛,搞驱这东西,还是看雪来的好,CSDN比较适合应用层开发的朋友来逛~~我自己写了一个文件透明加密的demo,但是没打算公开,O(∩_∩)O~
另外,楚老大的那个PDF档,名字叫《文件过滤驱动及应用》,只有70多页,写的非常的好,建议看看!!!
我是在CSDN看看新闻无意看到这帖子的,受不了某些人一副高高在上的样子才发言的,别理那些泼冷水的213,楼主加油!!!
[解决办法]纠正一个小错误,是叫《 windows文件系统过滤驱动开发教程 第二版》 我从文件夹里copy错了文件名,sorry啦,希望对你有帮助
[解决办法]写的真好,实在没有哪么多时间研究这些,了解
[解决办法]LS的……
360不是SSDT框架……是KiFastCallEntry……
您要是这都不懂的话,还是少说两句吧,省得被人笑……