sfilter文件驱动(二)--文件的关联

前面说了关于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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值