minifilter重定向

在PreCreate函数中来完成

FLT_PREOP_CALLBACK_STATUS
FileCreatePreOperation(
	_Inout_ PFLT_CALLBACK_DATA Cbd,
	_In_ PCFLT_RELATED_OBJECTS FltObjects,
	_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
)
{
	PFLT_FILE_NAME_INFORMATION nameInfo = NULL;
	NTSTATUS status;
	FLT_PREOP_CALLBACK_STATUS callbackStatus;
	
	UNREFERENCED_PARAMETER(FltObjects);
	UNREFERENCED_PARAMETER(CompletionContext);

	PAGED_CODE();

	status = STATUS_SUCCESS;
	callbackStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;

	NT_ASSERT(Cbd->Iopb->MajorFunction == IRP_MJ_CREATE);


	if (FlagOn(Cbd->Iopb->OperationFlags, SL_OPEN_PAGING_FILE)) {
		return callbackStatus;
	}

	//打开卷的操作 不重定位
	if (FlagOn(Cbd->Iopb->TargetFileObject->Flags, FO_VOLUME_OPEN)) {
		return callbackStatus;
	}

	//按ID打开的不重定位,因为不知道这种打开方式的意图
	if (FlagOn(Cbd->Iopb->Parameters.Create.Options, FILE_OPEN_BY_FILE_ID)) {

		return callbackStatus;
	}

	if (FlagOn(Cbd->Iopb->OperationFlags, SL_OPEN_TARGET_DIRECTORY)) {

		return callbackStatus;
	}

	do
	{

		status = FltGetFileNameInformation(Cbd,
			FLT_FILE_NAME_OPENED |
			FLT_FILE_NAME_QUERY_DEFAULT,
			&nameInfo);
		if (!NT_SUCCESS(status))
		{
			break;
		}

		status = FltParseFileNameInformation(nameInfo);
		if (!NT_SUCCESS(status)) {
			FltReleaseFileNameInformation(nameInfo);
			break;
		}

		WCHAR Path[260] = { 0 };
		memcpy_s(Path,260, nameInfo->Name.Buffer, nameInfo->Name.Length);
		
		if (wcsstr(Path,L"1.txt")==0)
		{
			break;
		}

		//lnk不屏蔽掉  会出问题
		if (wcsstr(Path, L"1.txt.lnk"))
		{
			DbgPrint("打开文件快捷方式%S\n", Path);
			break;
		}

		DbgPrint("打开文件%S\n", Path);
		PWCHAR Name = L"\\Device\\HarddiskVolume1\\2.txt";
		status = IoReplaceFileObjectName(Cbd->Iopb->TargetFileObject, Name,wcslen(Name)*2);
		if (!NT_SUCCESS(status))
		{
			break;
		}
		status = STATUS_REPARSE;
	} while (FALSE);
	
	if (nameInfo != NULL) {

		FltReleaseFileNameInformation(nameInfo);
	}
	
	if (status == STATUS_REPARSE) {

		//
		//  Reparse the open
		//

		Cbd->IoStatus.Status = STATUS_REPARSE;
		Cbd->IoStatus.Information = IO_REPARSE;
		callbackStatus = FLT_PREOP_COMPLETE;
		FltSetCallbackDataDirty(Cbd);
	}
	return callbackStatus;
}

IoReplaceFileObjectName逆向分析

NTSTATUS  IoReplaceFileObjectName(PFILE_OBJECT FileObject, const void *RedirectPath, USHORT Length)
{
	USHORT FileObjectLength; // bx
	PVOID Buffer; // rbp

	FileObjectLength = FileObject->FileName.MaximumLength;

	//如果重定向的路径长度小于文件对象路径的长度 直接用原来的buffer 完成拷贝
	if (Length <= FileObjectLength)
	{
	LABEL_2:
		//设置长度
		FileObject->FileName.Length = Length;
		//完成拷贝
		memset(FileObject->FileName.Buffer, 0, FileObjectLength);
		memmove(FileObject->FileName.Buffer, RedirectPath, Length);
		return 0;
	}

	//这里文件对象路径的长度使用了几个特别的值
	FileObjectLength = 0x38;  //56
	if (Length >= 0x38)
	{
		FileObjectLength = 0x78;  //120
		if (Length >= 0x78)
		{
			FileObjectLength = 0xF8;
			if (Length >= 0xF8)   //248
			{
				FileObjectLength = Length;
			}
		}
	}
	Buffer = ExAllocatePoolWithTag(PagedPool, FileObjectLength, 0x6D4E6F49);
	if (Buffer)
	{
		if (FileObject->FileName.Buffer)
		{
			ExFreePoolWithTag(FileObject->FileName.Buffer, 0);
		}
		FileObject->FileName.Buffer = Buffer;
		FileObject->FileName.MaximumLength = FileObjectLength;
		goto LABEL_2;
	}
	return STATUS_INSUFFICIENT_RESOURCES;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Minifilter是Windows操作系统中的一个内核模块,它可以对文件系统I/O操作进行监控和过滤,提供一定程度的文件系统访问控制和文件操作的修改能力。minifilter可以在文件系统级别实现对文件的读写访问控制、文件内容加密、文件过滤等功能。 minifilter的下载通常分为两个步骤:首先需要下载Windows Driver Kit(WDK)或Windows SDK,以获取minifilter开发所需的工具和库文件;其次,可以根据自己的具体需求编写或下载现有的minifilter源代码。 WDK或Windows SDK是微软提供的一套开发工具,它包含了开发Windows驱动程序所需的一系列工具、示例代码、库文件和文档等,可以用于minifilter开发及其他相关驱动程序的开发。 一般来说,在微软官网上可以找到WDK或Windows SDK的下载链接,用户可以根据自己的操作系统版本和开发环境选择合适的版本进行下载安装。安装完成后,用户可以在Windows开发环境中配置相应的环境变量,然后就可以使用WDK或Windows SDK提供的工具和库文件进行minifilter开发。 另外,也可以通过搜索引擎或开源社区等途径,找到已经编写好的minifilter源代码,并根据需要进行下载和修改。这种方式适用于一些常见的minifilter功能,如文件加密、病毒扫描等,可以节省开发时间和工作量。 总之,minifilter的下载需要获取Windows Driver Kit或Windows SDK,然后可以通过官方渠道或开源社区获取minifilter的源代码,以进行开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值