zzbwang
驱动牛犊
驱动牛犊
  • 注册日期2009-03-18
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分62分
  • 威望611点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
阅读:7441回复:20

Minifilter框架下文件加密过滤驱动开发单元总结

楼主#
更多 发布于:2009-04-11 09:53
最近在做一个文件加密过滤驱动,采用了minifilter架构,目前已经完成了以下功能:

1)跟应用程序通信,接受应用程序设置过滤参数,并把参数加密后保存到配置文件中
2)驱动加载后,读取配置文件获取过滤参数
3)加密算法采用了AES,密钥长度可以是128位,192位或者256位,为16字节分组加密,数据长度不足16字节则补0。
   准备以后支持更多加密算法,以及多密钥。
4)文件加密标识放在文件尾,标识中记录文件的有效数据长度(因为3中描述的原因,可能会在有效数据长度后补0)、加密算法索引、
   密钥索引和一个特征字符串。加密标识块长度为32字节。
5)在IRP_MJ_CREATE判断文件是否已经加密,是否需要加密,设置Stream Context。StreamContext中记录文件的以下内容:
     。文件有效数据长度,用于文件读写时能够返回正确的数据和长度
     。文件访问计数,该值用于判断何时文件被彻底关闭,将加密标识写到文件末尾。该值的更新参见OSR文章(http://www.osronline.com/article.cfm?id=102
     。文件是否加密
     。加密算法索引
     。密钥索引
6)在PRECLOSE中根据StreamContext中的文件访问计数判断是否文件将真正关闭,如果是,把加密标识写到文件尾。
7)IRP_MJ_READ和IRP_MJ_WRITE,只处理非缓冲IO,CallBack的Flags为FLTFL_OPERATION_REGISTRATION_SKIP_CACHED_IO
8)PostRead中,如文件处于加密状态,则对数据解密,并判断当前读的数据是否是文件最后一页(根据StreamContext中的文件有效长度,读操作的ByteOffset和读返回的数据长度判断),如果是,则在需要时修改返回FLTMGR的数据长度。
9)PreWrite中,如文件处于加密状态,则对数据加密;
10)PostWrite中,判断当前写的有效数据是否超出StreamContext中保存的文件有效数据长度,如果是,则更新StreamContext中的文件有效数据长度。
11)PostQueryInformation中,根据StreamContext返回文件的有效数据长度;

我设计的文件过滤规则是:文件名字和进程名匹配,规则中的文件名可以是文件全名,也可以是扩展名。如果文件名和操作文件的进程名都匹配,驱动就在读写操作中对文件加密和解密。否则就不加解密。

下一步准备做的工作:
1)对文件改名的处理。
2)对本地进程访问远程文件的处理(不需要处理远端主机访问本地进程,因为得不到进程名)


目前还没搞清楚的问题有:
1)除了IRP_MJ_READ,IRP_MJ_WRITE,IRP_MJ_SET_INFORMATION,IRP_MJ_QUERY_INFORMATION之外,还有哪些IRP会涉及到文件长度,尤其是改变文件长度。

暂时先写到这里,希望对大家能有所帮助。以后的开发进展我将及时汇报。

最新喜欢:

123218lzq123218... arbelarbel xiaobaochxiaoba...
游客

返回顶部