Filemon是一款用于监控文件系统活动的工具,它的框架结构分为上层应用程序(FileMon.exe)和内核驱动程序(FileMon.sys)。FileMon的核心功能在于能够捕获并记录对特定卷(如C:盘)的文件操作,以便进行分析和调试。下面是Filemon框架结构的详细说明:
1. **原理分析**:
- **启动过程**:当FileMon启动时,其内核驱动程序`FileMon.sys`的`DriverEntry`函数会创建设备和符号连接。设备的创建通过`IoCreateDevice`函数实现,这使得上层应用程序(FileMon.exe)能够向驱动发送IO请求。
- **IO请求分发**:FileMon使用一系列分发函数,如`IRP_MJ_READ`、`IRP_MJ_CREATE`等,来处理不同的IO操作。
- **卷设备监控**:FileMon通过为每个卷生成一个设备hook(hookDevice),然后使用`IoAttachDeviceByPointer`将hookDevice挂载到卷设备上。这样一来,针对卷的所有IO请求都会先经过hookDevice处理,达到监控的目的。
2. **派遣函数和处理函数**:
- **FilemonDispatch**:这是默认的处理函数,它根据设备类型决定是交由`FilemonDeviceRoutine`处理用户交互设备,还是调用`FilemonHookRoutine`处理系统设备。
- **FilemonUnload**:这是卸载例程,负责卸载FileMon驱动。
- **FilemonDeviceRoutine**:主要处理通信设备的IRP,最终调用`FilemonFastIoDeviceControl`来处理不同类型的控制代码。
- **FilemonFastIoDeviceControl**:这个函数处理各种IOCTL控制代码,例如设置监控驱动器、挂载/卸载特殊文件系统、开始/停止信息过滤等。
- **FilemonHookRoutine**:系统设备的IRP处理函数,记录IRP信息,并设置完成例程,然后将请求传递给原始设备处理。
- **FilemonHookDone**:作为FilemonHookRoutine的完成例程,负责记录操作的完成状态,无法在Dispatch级别记录时,会创建工作任务并在`FilemonHookDoneWork`中完成记录。
3. **数据结构与模块**:
- **记录链**:由`LogMutex`控制同步,用于存储和管理监控记录。包括`FilemonAllocateLog`(分配记录空间)、`FilemonFreeLog`(释放记录)、`FilemonGetOldestLog`(获取最旧记录)、`FilemonResetLog`(重置记录链)以及`LogRecord`(记录数据)等功能。
- **哈希表链**:由`HashResource`控制同步,用于快速查找文件路径。每个文件指针对应一个`Hash_Entry`,在文件关闭时释放。
- **过滤模块**:允许用户设置过滤条件。包括`FilemonFreeFilters`(释放过滤链资源)等函数。
4. **特殊操作处理**:
- **删除文件**:通过`IRP_MJ_SET_INFORMATION`操作处理文件删除。
- **打开文件**:使用`IRP_MJ_CREATE`来监控文件的打开操作。
Filemon通过内核驱动程序在系统层面进行文件操作的监控,利用设备hook和IRP的拦截,配合记录链和哈希表的数据结构,实现了高效、详尽的文件活动跟踪。同时,其过滤模块允许用户自定义监控条件,提高了实用性。通过这些机制,Filemon成为了数据库等IT领域进行系统行为分析和问题排查的重要工具。