上下文,一切都发生在 NtOpenFile 的钩子函数中,当应用程序尝试打开文件句柄时,将调用此函数而不是 NtOpenFile。代码在一个挂钩函数的 dll 中,dll 应该被注入到任何应用程序中,目标是将目标应用程序放入虚拟文件系统中。
Injection & Hook 在这里完美工作,没问题。
NtOpenFile 接受一个参数,它是包含要打开的文件/目录的 Nt 路径的 OBJECT_ATTRIBUTES 结构。
想法是修改包含在该结构中的路径(ObjectName 字段)并使用新参数调用原始的 NtOpenFile 函数。
当我尝试创建/修改与 OBJECT_ATTRIBETS 结构的 ObjectName 字段对应的 OBJECT_ATTRIBUTES 和/或 UNICODE_STRING 时,我收到错误 0xC0000033 或 0xC0000034:(STATUS_OBJECT_NAME_INVALID 和 STATUS_OBJECT_NAME_NOT_FOUND)。
我尝试了很多不同的方法。
手动创建整个 OBJECT_ATTRIBUTES,同时保持其他字段相同,可能看起来像这样:
UNICODE_STRING objectName{};
objectName.Buffer = fullPath.data(); //fullPath is a std::wstring containing NTPath
objectName.Length = fullPath.size(); //fullPath.size return size in byte
objectName.MaximumLength = fullPath.capacity();
OBJECT_ATTRIBUTES objectAttributes{};
objectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
objectAttributes.RootDirectory = ObjectAttributes->RootDirectory; //ObjectAttributes with a maj is the original ObjectAttributes
objectAttributes.ObjectName = &objectName;
objectAttributes.Attributes = ObjectAttributes->Attributes;
objectAttributes.SecurityDescriptor = ObjectAttributes->SecurityDescriptor;
objectAttributes.SecurityQualityOfService = ObjectAttributes->SecurityQualityOfService;
这在 NtPath 与原始路径相同时有效(虽然它不是相同的结构) 但不是当 NtPath 有效(文件/目录存在)但与原始路径不同时。 给我错误 0xC0000033
保留原始 OBJECT_ATTRIBUTES 但更改 ObjectName(它是指向 UNICODE_STRING 的指针) 给出相同的结果,以及任何类似的东西,比如改变 UNICODE_STRING 中的 ptr 以及长度/MaximumLength,原始缓冲区中的 memcpy 也给出相同的结果。无论如何我都不想那样做,但我不得不尝试。
我也尝试过像 RtlInitUnicodeString 和 RtlDosPathNameToNtPathName_U 这样的函数,但结果相似。
我显然遗漏了一些东西,也许是一些愚蠢的东西,但我无法解决这个问题,我很困惑,所以如果有人有想法那就太好了!谢谢!