阅读:1321回复:4
sfilter能改造得简单一点吗?
我看了SFilter的代码,觉得它attatch的过程太复杂了,把我弄得神经混乱,心想能不能把它弄得简
单一点。它目前的情况下,把所有的文件系统的所有卷都hook住了,笼罩式的。假如我没有这么大的要 求,而只要hook一个指定的C:盘,我能不能做得简单一点呢? 我看了FileMon里面的实现,它可以直接从一个文件句柄,取得所对应的DeviceObject,然后调用 IoAttachDeviceToDeviceStack函数,将创建的设备对象Attach到找到的设备栈上去。这可简洁多啦! 我想依filemon的葫芦,画我Sfilter的瓢。我在寻找C:盘设备对象的时候,用了方法IoGetDeviceObjectPointer, 然后去attach,跟踪发现是成功了的。最后打开Devicetree察看,发现我的sfiter驱动加到了 \\driver\\ftdisk下面去了。真是不幸,我失败了,我并不能hook住我对c:盘文件的操作! 问题就在于取得C:盘的ntfs设备对象的方法,我的方法错了。不知道有人肯教我否? |
|
最新喜欢:linshi...
|
沙发#
发布于:2007-02-05 18:18
如果你想在sfilter的基础上修改,让他只attach到c:上,那么你在IRP_MJ_FILE_SYSTEM_CONTROL中的IRP_MN_MOUNT_VOLUME的时候判断进入的deviceobject的名字,然后ZwQuerySymbolicLink得到他的连接名,然后判断就可以了。filemon是一个动态加载的驱动,他attach的动作就非常简单,找到设备指针,attach到设备栈就可以了,如果你可以保证他在设备栈的顶层,你还可以动态卸载,实乃居家旅行,杀人放火之必备驱动。
|
|
板凳#
发布于:2007-02-06 13:35
好的,谢谢你。我用FileMon的动态加载,似乎也可以了。方法是在SFilter的DriverEntry最后调用一个函数,里面实现Attach。
BOOLEAN Attach2C_Volume() { UNICODE_STRING nameString; PDEVICE_OBJECT VolumeDeviceObject; PFILE_OBJECT fileObject; NTSTATUS ntStatus; PSFILTER_DEVICE_EXTENSION sfExtention; PDEVICE_OBJECT fileSysDevice; IO_STATUS_BLOCK ioStatus; HANDLE ntFileHandle; OBJECT_ATTRIBUTES objectAttributes; PAGED_CODE(); RtlInitUnicodeString( &nameString, L"\\DosDevices\\C:\\" ); InitializeObjectAttributes( &objectAttributes, &nameString, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, NULL, 0 ); if( !NT_SUCCESS( ntStatus ) ) { //DbgPrint(("Filemon: Could not open drive %c: \n", 'C'+0)); return FALSE; } DbgPrint(("Filemon: opened the root directory!!! handle: %x\n", ntFileHandle)); 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; } ntStatus = IoCreateDevice( gSFilterDriverObject, sizeof(SFILTER_DEVICE_EXTENSION), NULL, fileSysDevice->DeviceType, 0, FALSE, &VolumeDeviceObject ); if( !NT_SUCCESS(ntStatus) ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } VolumeDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; sfExtention = VolumeDeviceObject->DeviceExtension; sfExtention->AttachedToDeviceObject = fileSysDevice; RtlInitUnicodeString(&sfExtention->DeviceName, sfExtention->DeviceNameBuffer); RtlCopyUnicodeString(&sfExtention->DeviceName, &nameString); ntStatus = IoAttachDeviceByPointer( VolumeDeviceObject, fileSysDevice ); if( !NT_SUCCESS(ntStatus) ) { ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return FALSE; } ObDereferenceObject( fileObject ); ZwClose( ntFileHandle ); return TRUE; } |
|
|
地板#
发布于:2007-02-06 13:55
你确定这种方法好用?你判断这个函数的返回值为false的时候,你的driverentry返回的是什么?你把sfilter得attach的函数都去掉了么?
|
|
地下室#
发布于:2007-02-08 11:10
可以用的,我在虚拟机xp系统上测试通过了的。返回false就不管了,attach失败,driverentry正常结束。
|
|
|