-3

我列举了一个进程的所有句柄。我有进程句柄,现在我想知道该句柄所针对的进程的 PID。这是我正在使用的结构:

public struct SYSTEM_HANDLE_INFORMATION
{
public int ProcessID;
public byte ObjectTypeNumber;
public byte Flags; // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
public ushort Handle;
public int Object_Pointer;
public UInt32 GrantedAccess;
}

遗憾的是,我所有句柄的 ProcessID 与我正在运行的程序(主机)的 PI​​D 相同。它应该是 Object_Pointer,但我不知道如何使用它。现在 Object_Pointer 与 GrantedAccess 一起匹配句柄所针对的进程的对象地址 - 图片

但这很奇怪,因为 GrantedAccess 应该是进程的访问级别,而不是地址的一部分。

4

1 回答 1

1

如果我们有进程句柄PROCESS_QUERY_LIMITED_INFORMATIONPROCESS_QUERY_INFORMATION访问权限,我们可以通过GetProcessId函数获取它

你的定义SYSTEM_HANDLE_INFORMATION是错误的。显然,当它必须是(64 位系统上的 8 个Object_Pointer字节)时,它不能是 int(4 个字节)。void*这个结构的正确定义是

struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
    USHORT UniqueProcessId;
    USHORT CreatorBackTraceIndex;
    UCHAR ObjectTypeIndex;
    UCHAR HandleAttributes;
    USHORT HandleValue;
    PVOID Object;
    ULONG GrantedAccess;
};

但无论如何更好地使用SystemExtendedHandleInformationSystemHandleInformation使用SYSTEM_HANDLE_INFORMATION_EX

于 2017-11-06T14:02:00.073 回答