阅读:2764回复:18
禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文件???
采用文件过滤驱动对请求返回STATUS_ACCESS_DENIED,实现了禁止删除文件。
现在碰到一个问题,就是冰刃(IceSword)删除文件根本就不产生IRP_MJ_SET_INFORMATION请求,直接一个IRP_MJ_CLEANUP就把文件删除掉了。 请问哪位知道IcesSword删除文件的原理,该如何禁止它对文件删除的操作呢? 谢谢!! |
|
最新喜欢:threeb...
|
沙发#
发布于:2005-04-14 09:42
怎么会有这种事?关注
|
|
板凳#
发布于:2005-04-14 10:12
昨天在网上看了eva发的关于拿Icesword出气的帖子,大概有个了解,但是还是没有很好的办法来解决问题。基于IRP过滤和Native API Hook实现的文件保护和进程保护对于Icesword来说,没有任何意义的。
|
|
|
地板#
发布于:2005-04-14 17:25
它是直接向fsd发irp,所以在上面的东东无效
|
|
|
地下室#
发布于:2005-04-15 10:40
它是直接向fsd发irp,所以在上面的东东无效 我认为Icesword的驱动Detport.sys也应该是一个文件过滤驱动吧,莫非它在过滤驱动堆栈的最底层,可以绕过所有其它的过滤驱动? 还有,通过hook ZwTerminateProcess来保护了特定进程,一般的工具的kill操作可以被禁止,但这个对于icesword是无效的,哪位知道它是如何处理的? |
|
|
5楼#
发布于:2005-04-15 23:01
ICESWORD应该是终止进程中的所有线程,来实现进程的终止的。
不过如果碰上系统线程,或某些用户线程进入内核态后挂在核心态,这样的线程ICESWORD是无法终止的。 |
|
6楼#
发布于:2005-04-16 13:59
ICESWORD应该是终止进程中的所有线程,来实现进程的终止的。 应该是?看了pjf那篇帖子随便猜的吧:D 我想不是 试过icesword1.06强制终止系统线程没有?不过试了试好像 核心态挂起的线程弄不掉,当然这种线程已经什么事都不能做, 跟死线程一样 |
|
7楼#
发布于:2005-04-19 17:11
icesword就是pjf开发的嘛.hehe
|
|
|
8楼#
发布于:2005-04-20 11:54
既然他是直接发IRP的,那么你用标准的过滤就没用了.
但你可以直接挂钩文件系统的DISPATCH例程,这样只要发往,FASTFAT,NTFS,CDFS的IRP,你都拦截还怕不行???? |
|
|
9楼#
发布于:2005-04-25 10:48
既然他是直接发IRP的,那么你用标准的过滤就没用了. 用修订版试了,不行 |
|
10楼#
发布于:2005-04-26 11:20
[quote]既然他是直接发IRP的,那么你用标准的过滤就没用了. 用修订版试了,不行 [/quote] 删除文件还有可能是在打开文件的时候指定了delete_on_close标志,所以还需要处理IRP_CREATE,加上这个试试 |
|
11楼#
发布于:2005-04-26 13:43
[quote][quote]既然他是直接发IRP的,那么你用标准的过滤就没用了. 用修订版试了,不行 [/quote] 删除文件还有可能是在打开文件的时候指定了delete_on_close标志,所以还需要处理IRP_CREATE,加上这个试试 [/quote] 不是这样的,根本没有请求包通过我的驱动 |
|
12楼#
发布于:2005-04-26 15:52
你直接替换文件系统的dispatch routine,试了吗
|
|
13楼#
发布于:2005-04-26 16:06
你直接替换文件系统的dispatch routine,试了吗 试了,对修订版 |
|
14楼#
发布于:2005-04-26 17:15
能放一个icesword 修订版上来吗
|
|
15楼#
发布于:2005-04-26 17:44
能放一个icesword 修订版上来吗 就在作者blog上呀 http://www.blogcn.com/user17/pjf/blog/20444415.html [编辑 - 4/27/05 by violin] |
|
16楼#
发布于:2005-06-21 16:16
有进展吗啊?
|
|
17楼#
发布于:2007-05-29 20:58
Re:禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文
确实,直接挂Dispatch还是不能挂到irp包,难道它是直接发到ftdisk的吗?那的irp包根本不一样了。 |
|
18楼#
发布于:2007-05-29 22:44
引用第0楼fslife于2005-04-13 11:45发表的 禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文件??? : fslife大侠,你好! 你实现的禁止删除文件的方法是什么样的? 能否帮我看看我的代码?谢谢! NTSTATUS SfCreate (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { NTSTATUS status; KEVENT waitEvent; PUNICODE_STRING name; GET_NAME_CONTROL nameControl; int cmpresult; PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp ); wchar_t* testmyProtectPath = L"\\Device\\HarddiskVolume1\\user\\"; PAGED_CODE(); if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); ///////////////////////////////////////////////////////////////////////////////////////// KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext( Irp ); IoSetCompletionRoutine(Irp,SfCreateCompletion,&waitEvent,TRUE,TRUE,TRUE ); status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl ); cmpresult = wcsncmp(name->Buffer, testmyProtectPath,wcslen(testmyProtectPath)); if(cmpresult == 0) { if( (irpSp->FileObject != NULL) &&(irpSp->FileObject->FileName.Buffer != NULL) &&(wcsstr(irpSp->FileObject->FileName.Buffer, L"新建") != NULL) ) { DbgPrint("==================当前是一个新建文件的操作!!!======================\n"); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_ACCESS_DENIED; } } ////////////////////////////////////////////////////////////////////////////////////////// if (STATUS_PENDING == status) { NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL); ASSERT(STATUS_SUCCESS == localStatus); } ASSERT(KeReadStateEvent(&waitEvent) || !NT_SUCCESS(Irp->IoStatus.Status)); if (FlagOn(SfDebug, (SFDEBUG_GET_CREATE_NAMES|SFDEBUG_DISPLAY_CREATE_NAMES))) { SfDisplayCreateFileName( Irp ); } status = Irp->IoStatus.Status; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; } NTSTATUS SfCreateCompletion (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context) { PKEVENT event = Context; UNREFERENCED_PARAMETER( DeviceObject ); UNREFERENCED_PARAMETER( Irp ); ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); KeSetEvent(event, IO_NO_INCREMENT, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } 这段代码是在sfilter的基础上修改的,驱动加载后,会出现以下的问题: (1)在指定的文件夹新建文件夹时,系统也提示“无法创建文件夹,拒绝访问”,但是系统还是会新建文件夹,而且新建的文件夹无法访问; (2)在指定的文件夹新建文件时,系统也提示“无法创建文件,文件存在”,但是系统还是会999个新建文件,而且新建的文件无法访问。 不知道是什么原因? 期待你的解答!!! |
|