sfilter文件驱动(二)--文件的关联
来源:互联网 发布:matlab高级编程基础 编辑:程序博客网 时间:2024/06/05 00:42
前面说了关于sFilter的设备的挂载,主要是针对DeviceObject, 通过将驱动创建多个过滤设备,挂载到系统的卷设备上, 系统就会将所有到该卷的IRP操作都重定向到我们的驱动派遣函数中
接着,我们这里要分析关于针对文件的操作了,经过几天的研究,发现了几个有趣的地方,首先了解下大致的流程。
IRP_MJ_CREATE: 创建文件例程
首先,我们操作文件的时候,都要先打开一个文件,有些使用notepad.exe打开,有些是word.exe, 有些是winrar.exe之类的,所有的文件都需要由某个应用程序的进程来打开,实际上,内部的操作,应该都是该应用程序的操作,例如:CreateFile(), ReadFile(), WriteFile()之类的。(你也可以自己写一个进程,然后打开某个路径的文件,那么此时打开该文件的句柄,就是你所写的进程所打开的句柄)。
所以首先,我们一般HANDLE hFilehandle=CreateFile(READ|WRITE); 这样打开一个文件的时候,NT的I/O管理器就会产生一个IRP请求,并且如果此时加载了我们的过滤驱动,那么该操作就会被我们捕获,这样NT的I/O管理器会将该IRP请求(CREATE)的请求发送给了我们之前附加的最顶层的过滤设备,然后重定向到我们的驱动中的IRP_MJ_CREATE中注册的函数中来(强调一次: 每个I/O管理器的IRP请求,都只是针对该操作产生一次,处理完就会释放掉,如果有新的操作,那么就会再次产生新的IRP),此时我们的Create注册函数类似这样:
NTSTATUS SfCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
---DeviceObject就是过滤设备,Irp就是该次的I/O请求
{
PIO_STACK_LOCATION irpSp;
irpSp = IoGetCurrentIrpStackLocation(Irp); ----我们在该函数中,先获取当前的IRP的位置指针
FileObject->FileName; ----这个是文件的名称
irpSp->FileObject; ----这个会出现一个FileObject的东东,这个非常的关键,
irpSp->FileObject->FsContext;----这个网上已经有很多开源的,逆向以后是一个FCB,所谓的文件控制块,后面所有的核心都是围绕这个东东开展,这个东西在用户操作一个文件的时候,文件系统会自动创建出irpSp->FileObject->FsContext内存,实际上就是该文件的Handle句柄,在没有Close该句柄前,这个irpSp->FileObject->FsContext是不会变的
}
我这里做的测试是,打开一个Text文件,然后编辑新增几个字节,关闭。
通过打印调试,我们看到sfCreate()有多次进入,在sfCreate()的时候,该FileObject是会变化的,并且此时的FileObject->FsContext都是NULL,但是后面出现IRP的read和IRP的write请求的时候,我们找到了其中的一个FileObject, 这个FileObject->FsContext的指针是不为NULL的,并且Read和Write的两个不同的IRP的请求的指针是一样的。
例如这个日志打印:
sfCreate!-----FileObject=87017428,filepath path=C:\Users\cloud\Desktop\1111.txt, context=00000000, context2=00000000;
pfpRead! equal--!filepath=C:\Users\cloud\Desktop\1111.txt,fileobject=8700D490,context=A339B860
pfpRead! equal--!filepath=C:\Users\cloud\Desktop\1111.txt,fileobject=8700D490, pFCB->OpenCount=4
SfWrite! equal--!filepath=C:\Users\cloud\Desktop\1111.txt,fileobject=886E28C8, context=A339B860
SfWrite! equal--!filepath=C:\Users\cloud\Desktop\1111.txt,fileobject=886E28C8, pFCB->OpenCount=2
也就是说,我们看到不同的IRP请求的FileObject都是不一样的,但是关键的FileObject->Context是一样的,所以我们可以自己创建一个链表,用于Create的时候,通过判断,我们记录对应的文件名称是要加密或者解密的,然后在read和write的时候,找到该文件链表,并且通过将context记录到该链表中,后面就可以通过这个指针是否相同来判断,是否是一个相同的文件流句柄,主要是很多情况下,我们应用层明明只打开了一个文件,但是系统内部会有很多个针对该文件不同的操作,例如不同的IRP_Read还有FastIoRead之类的,所以我们要有手段来识别什么是相同的文件流。
搞定了上面说的相同的文件流的读和写的识别,那么我们接下来就可以针对数据进行处理了。
可以参考好文:
http://blog.csdn.net/zhuhuibeishadiao/article/details/51178901 ---sFilter框架理解
阅读全文
0 0
- sfilter文件驱动(二)--文件的关联
- 【原创】文件过滤驱动sfilter学习笔记
- 文件过滤驱动Sfilter学习笔记
- sfilter开源驱动分析(一)--文件过滤的基本步骤
- Sfilter过滤驱动框架
- 说说文件的关联
- 关联文件的打开
- Ubuntu的文件关联
- 文件关联
- 文件关联
- 文件关联
- 文件关联
- 文件关联
- 文件关联
- 文件关联
- linux下usb驱动头文件的usb.h(二)
- windows 内核驱动的文件操作(转载二)
- 关于EXE文件关联的.
- Caused by: org.apache.ibatis.reflection.ReflectionException
- JAVA四种引用方式-下篇
- 使用WAMP搭建PHP本地开发环境
- java上传文件到磁盘中,设置tomcat虚拟路径进行访问,解决重布项目图片消失问题
- golang设计模式(9)装饰模式
- sfilter文件驱动(二)--文件的关联
- linkedlist双向链表结构
- 【phpcms-v9】利用phpcms-v9站群功能建立多个分站
- Java 将数据库对应的表生成对应的实体类,包含注释信息
- GO语言学习三(流程控制语句)
- 字节、字、bit、bite的关系
- 命令行执行php文件面临的文件路径问题
- Mybatis中联表查询实现
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法