mz_suya
驱动小牛
驱动小牛
  • 注册日期2008-06-13
  • 最后登录2010-08-01
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望648点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分1分
阅读:3170回复:10

也发一点学习体会

楼主#
更多 发布于:2008-11-15 10:39
在实际的去开发文件系统过滤驱动程序的时候,一直听别人说这个驱动是很难的。经过一些挫折将这些接近尾声的时候我才发现最难的不是驱动也不是过滤 是和业务逻辑的结合。
我需要做的是一个文件加密系统,简单的说就是一个通过设定的规则判断当前访问的文件是否需要加密(或者解密)以及进行何种加密(或者解密)的驱动。
因为文件系统属于上层驱动(文件系统上面的过滤驱动就更加应该属于上层了),所以可以通过content直接得到当前运行的process,因为irp并不一定都是应用程序发送的所以必须验证当前的top-level,通过这个可以知道这个irp的来源,不同来源的irp是需要不同处理的,所以合适准确的判断irp的来源是很关键的基础工作。
下面分几个方面对自己所做的积累做一个总结沉淀:
1 缓存管理器
一直以来所有的我知道的开发者都说缓存是一个很大的难点,但是真实的情况呢?
缓存是一个纯软件的系统组件。既然是组件就肯定需要和外界交互,系统提供了一系列的缓存操作函数,通过这些所谓的接口可以方便的实现对缓存的操作。另外还为文件系统提供了缓存回调函数(cachemanagecallback)通过这些回调函数就可以实现一些自己需要的操作。延迟写预读等。
缓存所涉及的另外一个就是fastio。其实所谓的绕过fsd并不是所理解的不经过filesystem而是可以不经过重新从硬盘等辅助存储上读写来实现所谓的绕过。
关于fastio 一直以来都和缓存的callback分不清楚,后来才明白原来逻辑连接的对象不一样。Fastio是io管理器和文件系统还有缓存管理器之间相互作用的。而回调函数是缓存管理器将某些数据延迟写造成的。
2磁盘上存储
其实所有的涉及磁盘的操作都可以归属于下面的三类
A 缓存管理器的延迟写
B 内存管理器的分页
C 需要写回磁盘的其他操作。
将这些分开来处理是一个很好的办法。
3 有没有必要处理进程相关
我认为这个是很有必要的,一个没有结合ndis加密的内网安全是必须需要这个的,因为你通过邮件或者qq直接发送某些涉密的文件也是考虑的范围。
如果不考虑这个就成了一个可以保护硬盘上的数据是加密,u盘时加密的。或者说直接连接主机的物理硬件是涉密的,但是内存中的数据是解密的,那么通过直接将内存中的数据转移的话就可以轻松的绕过了。
进程既然在考虑的范围内那么需要做的就是采用什么策略对内存中的数据进行保护。
因为一般而言进程有自己的地址空间,可以实现数据隔离,所以这些不在我们的考虑范围内。
数据通过将在内存的数据外泄的途径在内核看来是以下的方面。
(1)网络工具直接传输
(2)电子邮件附件形式
(3)网上邻居形式
4 缓存字节偏移部分文件写回的操作与处理
缓存可以缓存全部的文件,但是大多时候还是仅仅缓存部分文件,所以文件写回的时候就存在一个问题,如何组织这些文件。对于基于分组的加密来说这里存在一个对齐的问题。
读出来都是块,但是在缓存里面的并不一定都是块大小的(此处大小为实际读取的字节数),另外就是局部写回的时候,也并不一定是按照块大小写回的。所以必须用加密后的长度更改irp中的写回长度(或者可以直接拦截此处此种情况的irp,自己生成irp来进行需要的操作)
理解文件底层如何处理大文件的部分写回对于此处理解是关键。
注解:我认为我的前任失败的原因就是上面四点没有积极的把握好,处理好造成的。当然不排除个人原因。
5文件头
文件头中需要记录的东西很多,需要使用变长的文件头来记录需要的信息,所以有必要在文件头中包含文件头的长度。
文件头中会记录某些补零的位置(意识中应该是有好多需要补零的段落)这些记录的位置应该借助于原始的文件长度偏移的位置而不是现在文件偏移,因为文件头是变化的,这样可以减少许多麻烦。
如果直接用一个五字节来表示可以表示一个16g左右的偏移 (5*8=40)512/8=64 log64=6 2的34次米等于16g
文件头的位置并不重要,重要的是合适的处理某些偏移。以及文件头内部内容格式等,支持文件流的文件系统可以实现ADS。
6irp的处理
一个过滤驱动Irp的处理可以一般有下面几种情况
 直接返回失败或者成功 ---可以叫做“替代”
 直接pass到下层完成原先任务         --可以叫做“转发”
 将irp中的参数经过 某些变化处理以后发送到下层。 --可以叫做“代理”
 将irp挂起 自己发起irp完成需要的操作以后,填充原始irp结构,返回。可以叫做“隔离”
在处理创建请求的时候可以直接使用“替代”的处理方法来对非可信程序对加密数据的访问
在处理读请求的时候 可以直接采用“隔离”的处理办法来处理可信程序对加密文件的操作
一般的对非加密程序的访问  可以直接“转发”
7最后一个实际的问题就是工作流程
如何初始化设置驱动对象
生成设备
挂载设备栈
设置各种函数
如何获得数据
获取文件后缀
等等
这些都在 楚狂人的《文件过滤系统驱动开发手册》上有详细的讲解,看几遍就可以解决
获取规则表等都应该属于上面没有提到的简单的东西了


后记: 经过几个月的学习和挫折,明白了单机和网络的透明加密处理的实现和方法。许多细节还需要沉淀,尝试,练习。

以前看的一个文章叫做 黑道风云 天涯上的 孔二狗写的,为方便阅读制作成电子书了。放附件里面供大家闲暇看看。heihei
附件名称/大小 下载次数 最后更新
黑道风云(一).rar (612KB)  276 2008-11-15 10:45
lyp894@gmail.co
驱动牛犊
驱动牛犊
  • 注册日期2008-11-08
  • 最后登录2009-04-14
  • 粉丝2
  • 关注0
  • 积分9分
  • 威望36点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-11-15 11:51
学习ING
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-11-15 12:41
不错!
提问归提问,还是只能靠自己
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-11-15 19:03
这样的才算是有学习能力。不错
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2008-11-15 19:04
ads只在ntfs上才可以,如果为了兼容性,通常不这样处理,否则需要独立处理不同的文件分区格式
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-12-01 19:15
狂顶
先顶再看,
3KS FOR  SHARE!
fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-12-01 19:29
我什么时候才能有LZ的造诣啊
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-12-01 21:44
所以可以通过content直接得到当前运行的process,因为irp并不一定都是应用程序发送的所以必须验证当前的top-level,通过这个可以知道这个irp的来源,不同来源的irp是需要不同处理的,所以合适准确的判断irp的来源是很关键的基础工作。


这个是很有价值的!当然ddk的文件已经定义了 所有可能的toplevel的类型了!剩下的工作就是要通过 判断toplevel 已经 nocache的 和pageio的flag 就可以明确判断是usermode 的同步,以及ntfs的递归调用,cache的调用 以及cache的递归调用,已经layzewrite的调用了!当然判断这些东西 区分的再细我也不知道有什么好处!因为我没有实现filter 版本的 加密系统。

剩下的嘛就是filesize的变化没有谈!这个很重要!filesize涉及到 上层读数据的完整的保证,保证了往下写的数据的完整,保证了cache能不能把所有的数据都写到磁盘上去!保证了你的写磁盘的偏移量。
netspirit2006
驱动牛犊
驱动牛犊
  • 注册日期2009-05-30
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2009-06-10 16:50
看看学学
JenyCheng
驱动小牛
驱动小牛
  • 注册日期2005-07-26
  • 最后登录2021-01-24
  • 粉丝2
  • 关注0
  • 积分57分
  • 威望646点
  • 贡献值0点
  • 好评度119点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2009-09-30 04:10
学学学习
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2009-09-30 10:28
请教楼主
刚刚接触文件系统过滤,看了楚狂人的教程,有一定收获。
因为它只支持FAT文件系统,我把它稍稍修改了一下同时支持NTFS(因为刚刚学习)
可是问题来了,在NTFS下有时候能正常解密,有时候不能。跟踪了一下发现是:
不能正常解密时是因为我没有过滤到READ(好像是没有发送READ,这样的话也许是在
缓存里面读取,而没有READ出现)而FAT下解密时
都有READ出现。教程里面做法是在解密时打开清除了缓存,跟踪了一下,在NTFS
下打开也是做了缓存清除的,实在找不到原因,望指点。(教程里用的清除缓存的方法
是从FASTFAT里面移植出来的,不知道这种方法在NTFS下是否会出问题呢)


跪谢!!
游客

返回顶部