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框架理解
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米4s屏幕乱跳怎么办 小米4s手机后壳碎了怎么办 小米5spius开不了机怎么办 小米5s无限重启怎么办 小米5s外屏坏了怎么办 小米5s内屏碎了怎么办 小米4充电没反应怎么办 小米5手机变卡了怎么办 小米5变卡了怎么办 小米手机充电无反应怎么办 小米6相机卡顿怎么办 华为手机玩游戏发热怎么办 华为手机变慢了怎么办 华为p10手机变慢怎么办 华为手机账户密码忘记了怎么办 QQ浏览器无法加载插件怎么办 电脑开了机黑屏怎么办 扫描仪打不开运单扫描怎么办 打印机不支持64位系统怎么办 xp系统dnf闪退怎么办 w10电脑所有程序都打不开怎么办 安卓手机太卡怎么办 系统装到f盘了怎么办 虚拟机占c盘内存怎么办 外机连无线虚拟机显示受限怎么办 使用msdn下载解压后怎么办 路由80端口被占用怎么办 c盘拒绝粘贴文件怎么办 oracle数据库密码忘了怎么办 电脑开机时不显示用户名怎么办? xp系统忘记开机密码怎么办 电脑开机密码忘了怎么办 c盘满了怎么办win10 win10电脑开机密码忘了怎么办 win10的开机密码忘了怎么办 u盘中了exe病毒怎么办 眼睛长个麦粒豆怎么办 苹果手机sdk授权失败怎么办 小米5王者荣耀卡怎么办 华为p9手机电池不耐用怎么办 华为g9青春版耗电快怎么办