0%

使用MiniFilter实现文件重定向(1)

简介

有些情况下,我们需要伪装某个文件,比如请求打开文件A,实际上打开的是B,就需要
实现文件重定向的功能。比如在沙箱技术中,就可以用文件和文件夹的重定向技术实现,
这里参照的WDK示例 src -> filesys -> miniFilter -> simrep 的框架

工作原理

关于 MiniFilter 注册和安装的代码这里不再罗列,主要关注重定向核心逻辑。
我们需要在驱动触发 PreCreate 时,去查询目标文件的路径,如果匹配到,就改变这个路径
为另外的文件路径,最后返回 STATUS_REPARSE 结果,操作系统就会使用使用新路径去处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FLT_PREOP_CALLBACK_STATUS MyPreCreate(
PFLT_CALLBACK_DATA Data,
PCFLT_RELATED_OBJECTS FltObjects,
PVOID *CompletionContext)
{
PWCHAR NewName = NULL;
UNICODE_STRING OriName = { 0 };
UNREFERENCED_PARAMETER(FltObjects);
UNREFERENCED_PARAMETER(CompletionContext);
if (Data->Iopb->MajorFunction != IRP_MJ_CREATE)
return FLT_PREOP_SUCCESS_NO_CALLBACK;
if (!Data || !Data->Iopb || !Data->Iopb->TargetFileObject)
return FLT_PREOP_SUCCESS_NO_CALLBACK;
RtlInitUnicodeString(&OriName, L"\\System32\\1.txt");
if (RtlEqualUnicodeString(&Data->Iopb->TargetFileObject->FileName, &OriName, TRUE))
{
NewName = (PWCHAR)ExAllocatePool(NonPagedPoolNx, 256);
if (NewName)
{
// 注意新路径需要包含\\Device\\HardDiskVolume3卷信息
wcscpy(NewName, L"\\SystemRoot\\System32\\2.txt");
ExFreePool(Data->Iopb->TargetFileObject->FileName.Buffer);
RtlInitUnicodeString(&Data->Iopb->TargetFileObject->FileName, NewName);
Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
Data->IoStatus.Status = STATUS_REPARSE;
Data->IoStatus.Information = IO_REPARSE;
FltSetCallbackDataDirty(Data); // simrep中没有这行
return FLT_PREOP_COMPLETE;
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

注意:因为文件操作本身就特别复杂,所以文件重定向需要格外注意细节,以上代码仅作技术参考