首页
社区
课程
招聘
[求助]我晕,关于sfilter做文件夹保护的问题
发表于: 2011-12-6 12:50 6516

[求助]我晕,关于sfilter做文件夹保护的问题

2011-12-6 12:50
6516
我在sfilter处理IRP_MJ_CREATE的函数sfcreate中,直接对 FILE_CREATE ||  FILE_OPEN_IF || FILE_OVERWRITE||FILE_OVERWRITE_IF这些操作返回了STATUS_ACCESS_DENIED

但是令人蛋疼的事情发生了,这样做太坑爹了,至少有以下几个问题。。
1.右键新建新建文本文档的时候,提示文件已经存在,但是确一下子新建了1000个文件。。。
2.新建的那些文件有些能删除,有些不能删除,有些提示拒绝访问,有些能访问。。。。。
3.有时候已经存在的文件没被保护,有时候又被保护。。。

还有那些不可爱的打开失败消息,怎样屏蔽

怎样做个比较不是demo级别的文件夹保护呢,返回值是不是有讲究?或者对不同的操作都有不同的处理

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2011-12-6 12:55
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还有我已经将驱动unload了,怎么还是有保护。。
2011-12-6 13:00
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你在处理CREATE_NEW操作时,SHELL收到的失败后会再次尝试创建。哥们你是否在PostCreate处拦截的啊?
2011-12-6 16:52
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没啊,我没用minifilter,也没在完成历程中拦截啊,不过我确实是在等待完成历程完成后拦截
2011-12-7 08:40
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
6
说得话自相矛盾啊,哥们.....

ps:要解决问题,首先要别人能明确问题,贴你认为别人能可以看的码....这样也不用 都在这猜测..
2011-12-7 08:41
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
其实也没,我不知道在等待完成例程完成后是不是就是在postcreate里面,新手不懂啊

	if (FlagOn( SfDebug, SFDEBUG_DISPLAY_CREATE_NAMES |
		SFDEBUG_DO_CREATE_COMPLETION ) &&
		!FlagOn(devExt->Flags,SFDEVFL_DISABLE_VOLUME)) 
	{
			KEVENT waitEvent;
			KeInitializeEvent( &waitEvent, NotificationEvent, FALSE );
			IoCopyCurrentIrpStackLocationToNext( Irp );
			IoSetCompletionRoutine(
				Irp,
				SfCreateCompletion,
				&waitEvent,
				TRUE,
				TRUE,
				TRUE );

			status = IoCallDriver( devExt->NLExtHeader.AttachedToDeviceObject, Irp );
			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 (fileName != NULL) 
			{
				RtlInitUnicodeString(&filter_string,PROTECTED);
				CreateOptions = ((irpSp->Parameters.Create.Options>>24)&0x000000ff);
				if (CreateOptions == FILE_CREATE || CreateOptions == FILE_OPEN_IF ||
					CreateOptions == FILE_OVERWRITE || CreateOptions == FILE_OVERWRITE_IF/*||CreateOptions == FILE_SUPERSEDE*/)
				{
					SF_LOG_PRINT( SFDEBUG_DISPLAY_CREATE_NAMES,
						("SFilter!SfCreate: OPENED        fo=%p %08x:%08x   %wZ\n",
						irpSp->FileObject,
						Irp->IoStatus.Status,
						Irp->IoStatus.Information,
						&fileName->Name) );

					if (wcsstr(fileName->Name.Buffer,filter_string.Buffer))
					{
						KdPrint(("SFilter!SfCreate:	hollyshit !\n"));
						Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
						Irp->IoStatus.Information = 0;
						IoCompleteRequest(Irp, IO_NO_INCREMENT);
						return STATUS_ACCESS_DENIED;
					}
				NLFreeNameControl( fileName, &gSfNameBufferLookasideList );
			}
			status = Irp->IoStatus.Status;
			IoCompleteRequest( Irp, IO_NO_INCREMENT );
			return status;

	}


其实我这里就没加几行代码
2011-12-7 09:03
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
你这个时候都打开创建了,你如果禁止 就得 cancel open  
ps:IoCancelFileOpen
具体应该参考  wdk 下的 取消源码 ,然后 就是 denied_access 返回给 管理器
2011-12-7 09:15
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
将代码移到IoCallDriver之前,确实解决了创建1000个文件的问题~~
2011-12-7 09:20
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
嗯,多谢提点,我研究下IoCancelFileOpen
2011-12-7 09:21
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
11
做拦截 和可以在 pre create 操作 ,不严格的话 在完成之前 操作即可,这个时候就不用 取消创建 ...
2011-12-7 09:26
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那什么时候需要取消创建呢
2011-12-7 09:33
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
听句劝,,那个IoCancelFileOpen 函数极度危险。尽量别用。
2011-12-7 18:02
0
游客
登录 | 注册 方可回帖
返回
//