文件过滤系统Filemon开发教程

上传人:飞*** 文档编号:43601110 上传时间:2018-06-07 格式:DOC 页数:13 大小:81KB
返回 下载 相关 举报
文件过滤系统Filemon开发教程_第1页
第1页 / 共13页
文件过滤系统Filemon开发教程_第2页
第2页 / 共13页
文件过滤系统Filemon开发教程_第3页
第3页 / 共13页
文件过滤系统Filemon开发教程_第4页
第4页 / 共13页
文件过滤系统Filemon开发教程_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《文件过滤系统Filemon开发教程》由会员分享,可在线阅读,更多相关《文件过滤系统Filemon开发教程(13页珍藏版)》请在金锄头文库上搜索。

1、 文件过滤系统驱动开发 Filemon 学习笔记WINDOWS 文件过滤系统驱动开发,可用于硬盘还原,防病毒,文件安全防护,文件加密 等诸多领域。而掌握核心层的理论及实践,对于成为一名优秀的开发人员不可或缺。WINDOWS 文件过滤系统驱动开发的两个经典例子,Filemon 与 SFilter,初学者在经过一 定的理论积累后,对此两个例子代码的研究分析,会是步入驱动开发殿堂的重要一步,相 信一定的理论积累以及贯穿剖析理解此两个例程后,就有能力开始进行文件过滤系统驱动 开发的实际工作了。 对于 SFilter 例子的讲解,楚狂人的教程已经比较流行,而 Filemon 例子也许因框架结构相 对明晰

2、,易于剖析理解,无人贴出教程,本人在剖析 Filemon 的过程中积累的一些笔记资 料,陆续贴出希望对初学者有所帮助,并通过和大家的交流而互相提高。Filemon 学习笔记 第一篇:Filemon 的大致架构为,在此驱动程序中,创建了两类设备对象。 一类设备对象用于和 Filemon 对应的 exe 程序通信,以接收用户输入信息,比如挂接或监 控哪个分区,是否要挂接,是否要监控,监控何种操作等。此设备对象只创建了一个,在 驱动程序的入口函数 DriverEntry 中。此类设备对象一般称为控制设备对象,并有名字,以 方便应用层与其通信操作。 第二类设备对象用于挂接到所须监控的分区,比如 c:,

3、d:或 e:,f:,以便拦截到引应 用层对该分区所执行的读,写等操作。此类设备对象为安全起见,一般不予命名,可根据 须监控多少分区而创建一个或多个。驱动入口函数大致如下NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) NTSTATUS ntStatus;PDEVICE_OBJECT guiDevice;WCHAR deviceNameBuffer = L“DeviceFilemon“;UNICODE_STRING deviceNameUnicodeString;WCHAR

4、 deviceLinkBuffer = L“DosDevicesFilemon“;UNICODE_STRING deviceLinkUnicodeString;ULONG i;DbgPrint (“Filemon.SYS: entering DriverEntryn“);FilemonDriver = DriverObject;/ / Setup the device name/ RtlInitUnicodeString (/ Create the device used for GUI communications/此设备对象用来和用户交互信息ntStatus = IoCreateDevic

5、e ( DriverObject,sizeof(HOOK_EXTENSION),/ If successful, make a symbolic link that allows for the device/ objects access from Win32 programs/if(NT_SUCCESS(ntStatus) / Mark this as our GUI device/(PHOOK_EXTENSION) guiDevice-DeviceExtension)-Type = GUIINTERFACE;/ Create a symbolic link that the GUI ca

6、n specify to gain access/ to this driver/device/RtlInitUnicodeString (ntStatus = IoCreateSymbolicLink (if(!NT_SUCCESS(ntStatus) DbgPrint (“Filemon.SYS: IoCreateSymbolicLink failedn“);IoDeleteDevice( guiDevice );return ntStatus; / Create dispatch points for all routines that must be handled. / All en

7、try points are registered since we might filter a/ file system that processes all of them./for( i = 0; i MajorFunctioni = FilemonDispatch; #if DBG / Driver unload is only set if we are debugging Filemon. This is / because unloading a filter is not really safe - threads could/ be in our fastio routin

8、es (or about to enter them), for example, / and there is no way to tell. When debugging, we can risk the / occasional unload crash as a trade-off for not having to / reboot as often./ DriverObject-DriverUnload = FilemonUnload; #endif / DBG/ Set up the Fast I/O dispatch table/DriverObject-FastIoDispa

9、tch = else / If something went wrong, cleanup the device object and dont load/DbgPrint(“Filemon: Failed to create our device!n“);return ntStatus;/ Initialize the name hash table/for(i = 0; i Len = 0;CurrentLog-Next = NULL;NumLog = 1;return STATUS_SUCCESS; 在此驱动入口点函数中,主要做了生成新的设备对象,此设备对象用来和应用层信息交互, 比如应

10、用层向驱动传递需要挂接或者监控的分区盘符,或者是否挂接盘符,是否监控操作 等。上面创建设备对象的代码为: ntStatus = IoCreateDevice ( DriverObject,sizeof(HOOK_EXTENSION),/ If successful, make a symbolic link that allows for the device/ objects access from Win32 programs/if(NT_SUCCESS(ntStatus) / Mark this as our GUI device/(PHOOK_EXTENSION) guiDevice-

11、DeviceExtension)-Type = GUIINTERFACE;/ Create a symbolic link that the GUI can specify to gain access/ to this driver/device/RtlInitUnicodeString (ntStatus = IoCreateSymbolicLink (if(!NT_SUCCESS(ntStatus) DbgPrint (“Filemon.SYS: IoCreateSymbolicLink failedn“);IoDeleteDevice( guiDevice );return ntSta

12、tus; 上面代码完成的功能为创建了用于与应用层交互的控制设备对象,名字在参数 /为了得到当前进程名字。 此函数体如下: ULONG FilemonGetProcessNameOffset(VOID) PEPROCESS curproc;int i;curproc = PsGetCurrentProcess();/调用 PsGetCurrentProcess 取得 KPEB 基址/然后搜索 KPEB,得到 ProcessName 相对 KPEB 的偏移量/ Scan for 12KB, hoping the KPEB never grows that big!/for( i = 0; i Ma

13、jorFunctioni = FilemonDispatch; 简单地把各个分发例程设置成了 FilemonDispatch; 然后我们追踪其函数体:NTSTATUS FilemonDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )/ Determine if its a request from the GUI to us, or one that is/ directed at a file system driver that weve hooked/if( (PHOOK_EXTENSION) DeviceObject-Devi

14、ceExtension)-Type = GUIINTERFACE ) return FilemonDeviceRoutine( DeviceObject, Irp ); else return FilemonHookRoutine( DeviceObject, Irp ); 函数体先判断需要处理 IRP 包的设备对象的类型,看是属于控制设备对象,还是属于用于 挂接并监控文件读写操作的过滤设备对象。如果是属于后者 则进入: FilemonHookRoutine( DeviceObject, Irp ) 此函数是拦截文件操作的中心,在其中获得了被操作的文件名字,并且根据操作类型,在 switch(

15、 currentIrpStack-MajorFunction ) 中针对不同的 MajorFunction,打印出相关操作信息。 因此函数体太长 不再全部列出。 其函数体总体框架为:得到被操作的文件名字,打印相关操作信息,然后下发 IRP 到底层 驱动。 在下发 IRP 到底层驱动处理前,本层驱动必须负责设置下层 IO 堆栈的内容。这样下一层 驱动调用 IoGetCurrentIrpStackLocation()时能得到相应的数据。 设置下层 IO 堆栈的内容,一般用两个函数来实现: IoCopyCurrentIrpStackLocationToNext( Irp ) 此函数一般用在本驱动设置了完成例程时调用,把本层 IO _STACK_LOCATION 中的参数 copy 到下层,但与完成例程相关的参数信息例外。因为本驱动设置的完成例程只对本层驱 动有效。 IoSkipCurrentIrpStackLocationToNext(Irp) 此函数的作用是:直接把本层驱动 IO 堆栈的内容设置为下层驱动 IO 堆栈指针的指向。因 两

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号