NtOpenFile returns STATUS_OBJECT_NAME_INVALID

NtOpenFile returns STATUS_OBJECT_NAME_INVALID

本文关键字:NAME INVALID OBJECT NtOpenFile STATUS returns      更新时间:2023-10-16

以下代码尝试使用NtOpenFile:生成文件句柄

HANDLE spawnFileHandle(){
HANDLE ret;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES ObjectAttributes;
ObjectAttributes.SecurityDescriptor=0;
ObjectAttributes.SecurityQualityOfService=0;
ObjectAttributes.RootDirectory=0;
ObjectAttributes.Attributes=0;
ObjectAttributes.Length=sizeof(OBJECT_ATTRIBUTES);
WCHAR stringBuffer[5048];
UNICODE_STRING  string;
string.Buffer = stringBuffer;
lstrcpyW(stringBuffer, L"\??\");
lstrcatW(stringBuffer, EXEPath);
string.Length = lstrlenW(stringBuffer)*2; // Edit after comment.
string.MaximumLength = 5048;
ObjectAttributes.ObjectName=&string;
NTSTATUS error=origZwOpenFile(&ret, FILE_READ_DATA, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, 0);
printf("huh %ls %x", stringBuffer, error);
return ret;
}

但它始终返回STATUS_OBJECT_NAME_INVALID,例如:

编辑:[HBIP]-隐藏因为我偏执。-

EXE path : C:Usersn00bDesktop[HBIP]Debug[HBIP].exe
huh ??C:Usersn00bDesktop[HBIP]Debug[HBIP].exe c0000033
Spawned Handle : cccccccc

原因可能是什么?

UNICODE_STRING结构要求LengthMaximumLength都以字节为单位。请注意,这些值将始终是偶数。

您得到STATUS_OBJECT_NAME_INVALID是因为您的Length是奇数,因此无效。