阅读:7441回复:20
Minifilter框架下文件加密过滤驱动开发单元总结
最近在做一个文件加密过滤驱动,采用了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会涉及到文件长度,尤其是改变文件长度。 暂时先写到这里,希望对大家能有所帮助。以后的开发进展我将及时汇报。 |
|