简易文件审计工具的设计与实现 第8页
来向卷设备询问这个FileObject 的信息之外更好的办法。自己发送IRP很麻烦,但是FileObject 都是在CreateFile 的时候诞生的。在诞生的过程中,确实有机会得到这个即将诞生的FileObject,是一个文件还是一个目录。
Create的时候,获得当前IO_STACK_LOCATION,假设为irpsp,那么irpsp->Parameters.Create 的结构为:
这个结构中的参数是与CreateFile函数中的参数是对应的。取得方法如下:
然后我们搞清上面Options 和FileAttributes 的意思。是不是Options 包含FILE_DIRECTORY_FILE 标记就表示这是一个目录?实际上,CreateOpen是一种尝试性的动作。无论如何,我们只有当CreateOpen 成功的时候,判断FileObject 才有意义,否则是空谈。
成功有两种可能,一是已经打开了原有的文件或者目录,另一种是新建立了文件或者目录。Options 里边带有FILE_DIRECTORY_FILE 表示打开或者生成的对象是一个目录。那么,如果在Create 的完成函数中,证实生成或者打开是成功的,那么返回得到的FILE_OBJECT,确实应该是一个目录。
当我经常要使用我过滤时得到的文件或者目录对象的时候,我一般在Create 成功的的时候捕获他们,并把他们记录在毕业论文
http://www.751com.cn/ 论文网
http://www.751com.cn/这里需要设置一下Create 的完成函数。请参考上面对文件读操作。
这里可以捕获Cleanup 的IRP 来做这个。因为判断FileObject 是文件还是目录的问题,我们已经见识了文件的打开和关闭工作。现在看一下文件是如何被删除的。删除的操作,第一步是打开文件,打开文件的时候必须设置为可以删除。如果打开失败,则直接导致无法删除文件。第二步设置文件属性为用于删除,第三步关闭文件即可。关闭的时候,文件被系统删除。不过请注意这里的“删除”并非把文件删除到回收站。如果要测试,必须按住shift 彻底删除文件。文件删除到回收站只是一种改名操作。改名操作我们留到以后再讨论。
第一步是打开文件,我应该可以在文件被打开的时候,捕获到的irpsp 的参数,记得前边的参数结构,中间有:
PIO_SECURITY_CONTEXT SecurityContext;
相关的结构如下:
注意其中的DesiredAccess,其中必须有DELETE 标记,才可以删除文件。
第二步是设置为”关闭时删除”。这是通过发送一个IRP(Set Information)来设置的。捕获主功能码为IRP_MJ_SET_INFORMATION 的IRP 后:
首先,IrpSp->Parameters.SetFile.FileInformationClass 应该为FileDispositionInformation。然后,Irp->AssociatedIrp.SystemBuffer 指向一个如下的结构:
如果DeleteFile 为TRUE,那么这是一个删除文件的操作。文件将在这个FileObject Close 的时候被删除。
3.2.5 与运用程序通信
程序主要通过SpyDispatch 函数来处理驱动和运用程序的交互,现在摘录以部分程序:
在运用程序中,我们有相应的代码一直对应。它先打开驱动,然后调用DeviceIoControl函数,该函数会发送FILESPY_GetLog到驱动程序,而驱动程序会根据该信息而做出相应的动作,把数据保存在buffer中返回。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
简易文件审计工具的设计与实现 第8页下载如图片无法显示或论文不完整,请联系qq752018766