简介
有些情况下,我们需要伪装某个文件,比如请求打开文件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) { 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); return FLT_PREOP_COMPLETE; } } return FLT_PREOP_SUCCESS_NO_CALLBACK; }
|
注意:因为文件操作本身就特别复杂,所以文件重定向需要格外注意细节,以上代码仅作技术参考