阅读:1254回复:10
贴源码,请大虾指正、答疑
在看完filemon的源码后,我尝试修改其中的HookDrive
我想直接将设备对象绑定到文件目录或某一个具体的文件,可是试了以后还是不行,设备对象还是以磁盘为主, WCHAR filename[] = L"\\DosDevices\\D:\\TEST\\USB_SD.doc" WCHAR filename[] = L"\\DosDevices\\D:\\TEST\\" WCHAR filename[] = L"\\DosDevices\\D:\\" 的定义结果都是一样,没有区别,下面是我的修改代码,我已经编译运行过了,可以正常hook和unhook, 问题1:怎样才可以直接绑定到文件目录或某一个具体的文件??? 问题2:HookDrive函数和DriverEntry函数中的IoCreateDevice有什么不同啊? 问题3:HookDrive中的IoAttachDeviceByPointer干什么用的啊?为什么不在DriverEntry中实现呢? 问题4:创建设备扩展对象可以不创建吗??? //----------------------------------------------------------// H O O K / U N H O O K R O U T I N E S //---------------------------------------------------------- BOOLEAN myHook(IN PDRIVER_OBJECT DriverObject ) { IO_STATUS_BLOCK ioStatus; HANDLE ntFileHandle; OBJECT_ATTRIBUTES objectAttributes; PDEVICE_OBJECT fileSysDevice; PDEVICE_OBJECT hookDevice; UNICODE_STRING fileNameUnicodeString; WCHAR filename[] = L"\\DosDevices\\D:\\TEST\\USB_SD.doc"; NTSTATUS ntStatus; ULONG i; PFILE_OBJECT fileObject; PHOOK_EXTENSION hookExtension; // Has this drive already been hooked? if(myDevices == NULL){ RtlInitUnicodeString( &fileNameUnicodeString, filename ); InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntStatus = ZwCreateFile(&ntFileHandle, GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE, &objectAttributes, &ioStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if( !NT_SUCCESS( ntStatus ) ) { DbgPrint(("Filemon: Could not open drive!!!\n")); return FALSE; } // Got the file handle, so now look-up the file-object it refers to ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA, NULL, KernelMode, &fileObject, NULL ); if( !NT_SUCCESS( ntStatus )) { ZwClose( ntFileHandle ); return FALSE; } // fileSysDevice = IoGetRelatedDeviceObject( fileObject ); if ( ! fileSysDevice ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } if( myDevices == fileSysDevice ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); myDevices = fileSysDevice; return TRUE; } ntStatus = IoCreateDevice( DriverObject, sizeof(HOOK_EXTENSION), NULL, fileSysDevice->DeviceType, 0, FALSE, &hookDevice ); if ( !NT_SUCCESS(ntStatus) ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } hookDevice->Flags &= ~DO_DEVICE_INITIALIZING; // hookExtension = hookDevice->DeviceExtension; hookExtension->LogicalDrive = 'A'; hookExtension->FileSystem = fileSysDevice; ntStatus = IoAttachDeviceByPointer( hookDevice, fileSysDevice ); if ( !NT_SUCCESS(ntStatus) ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } // ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); myDevices = hookDevice; } return TRUE; } myDevices是我自己定义的设备对象 PDEVICE_OBJECT myDevices; 在unhook中释放myDevices就可以了,初学driver,多多包涵 |
|
沙发#
发布于:2004-11-25 09:17
请大虾伸出援助之手。。。
|
|
板凳#
发布于:2004-11-25 09:30
问题1:怎样才可以直接绑定到文件目录或某一个具体的文件???
我也不知道,望高手解题。 问题2:HookDrive函数和DriverEntry函数中的IoCreateDevice有什么不同啊? 创建的设备类型不一样。DriverEntry中只是一个简单的filemon设备对象,而HookDrive中则创建的是要过滤的目标设备的设备对象。 问题3:HookDrive中的IoAttachDeviceByPointer干什么用的啊?为什么不在DriverEntry中实现呢? 过滤设备加载的目标设备堆栈时要调用的函数。 问题4:创建设备扩展对象可以不创建吗??? 设备扩展中存储的很多判断的信息。应该不行。 |
|
地板#
发布于:2004-11-25 09:39
问题1:根据filemon的方法,只能绑定一个分区,因为只有一个分区才是一个设备(DeviceObject),只有对设备的驱动绑定过滤驱动才能完成文件系统过滤。要绑定一个文件或者文件夹,只能通过即时分析了,如果是目标文件(夹)就处理,否则丢弃。
|
|
|
地下室#
发布于:2004-11-25 11:20
通过即时分析来判断是目录或文件,可是这样系统的效率不就很低了吗?因为IRP的包太多了。
非常感谢两位的回答,还请来客继续讨论。 |
|
5楼#
发布于:2004-11-25 11:31
只能绑定分区
过虑规则定位到具体的目录或文件 |
|
|
6楼#
发布于:2004-11-25 14:07
只能绑定分区 好象目前只能那样. |
|
|
7楼#
发布于:2004-11-26 09:33
问题1看来也只能这样啦
问题2:我的理解是DriverEntry中只是创建filemon设备对象 HookDrive中是打开而不是创建要过滤的目标设备的设备对象 不知道大虾们有何见解 问题4:设备扩展对象是自己定义创建的,那它里面的数据结构应该可以随意定义吧,既然这样,那我把它设置为空可不可以啊? 请大虾答疑 |
|
8楼#
发布于:2004-11-26 10:08
问题2:我的理解是DriverEntry中只是创建filemon设备对象,
用来表示FILEMON本身,,除了和应用交互外不处理任何其他IRP HookDrive中是创建要过滤设备对象,有多少个设备要过滤,你就创建多少个该对象. 题4:设备扩展对象是自己定义创建的,那它里面的数据结构应该可以随意定义吧,既然这样,那我把它设置为空可不可以啊? 可以,不过一般对于CDO而言可以为空,但对过滤设备对象而言,可以存放些特定的东西,也可以用来区别CDO和过滤设备对象. |
|
|
9楼#
发布于:2004-11-26 14:09
设备扩展对象当然可以为空. 可是如果你需要创建许多自己的过滤对象的话, 你就需要一个设备扩展对象来存储一些标志信息来帮助你识别每一个过滤对象.
toad |
|
10楼#
发布于:2004-11-26 15:32
看来功夫不负有心人啊,大虾们总算解决了俺几个疑问。
|
|