在 NtOpenFile 钩子函数中创建 OBJECT_ATTRIBUTES 结构

问题描述 投票:0回答:0

上下文,一切都发生在 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 这样的函数,但结果相似。

我显然遗漏了一些东西,也许是一些愚蠢的东西,但我无法解决这个问题,我很困惑,所以如果有人有想法那就太好了!谢谢!

c++ c winapi hook ntdll
© www.soinside.com 2019 - 2024. All rights reserved.