sixsevenths/ViewHandles

GitHub: sixsevenths/ViewHandles

ViewHandles 是一个轻量级C++工具,用于按进程ID查看Windows系统中打开的句柄,帮助分析资源占用和进程行为。

Stars: 0 | Forks: 0

# 查看 Handles ViewHandles 是一个轻量级的 C++ 工具,用于按进程ID(PID)转储 Windows 系统中打开的句柄。 这些句柄可能包括: - 文件 - 注册表项 - 互斥体 - 信号量 - 等等 ## NtQuerySystemInformation 此工具通过调用未文档化的 `NtQuerySystemInformation` 函数实现功能,其中 `SystemInformationClass` 参数设置为 16(即 `SystemHandleInformation`)。 ``` __kernel_entry NTSTATUS NtQuerySystemInformation( [in] SYSTEM_INFORMATION_CLASS SystemInformationClass, [in, out] PVOID SystemInformation, [in] ULONG SystemInformationLength, [out, optional] PULONG ReturnLength ); ``` 该函数返回一个 `SYSTEM_HANDLE_INFORMATION` 结构体,其中包含已检索到的句柄数量以及一个 `SYSTEM_HANDLE_TABLE_ENTRY_INFO` 数组。 ``` struct SYSTEM_HANDLE_INFORMATION { ULONG NumberOfHandles; SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1]; }; ``` ``` struct SYSTEM_HANDLE_TABLE_ENTRY_INFO { USHORT UniqueProcessId; USHORT CreatorBackTraceIndex; UCHAR ObjectTypeIndex; UCHAR HandleAttributes; USHORT HandleValue; PVOID Object; ULONG GrantedAccess; }; ``` `UniqueProcessId` 标识拥有该返回句柄的进程,而 `HandleValue` 则指代该句柄在其所属进程内的具体值。 ## OpenProcess 与 DuplicateHandle 一旦我们列出了句柄及其各自的拥有进程,在使用 `NtQueryObject` 获取句柄信息之前,必须先复制该句柄。而要调用 `DuplicateHandle`,我们首先需要获得拥有该句柄的进程的句柄。 为此,我们使用 `SYSTEM_HANDLE_TABLE_ENTRY_INFO` 实例的 `UniqueProcessId` 属性来打开对应进程,并将该进程的句柄以及 `HandleValue` 属性一并传递给 `DuplicateHandle`。 ## NtQueryObject 借助一个已复制的句柄,我们可以调用 `NtQueryObject` 并使用 `ObjectNameInformation` 和 `ObjectTypeInformation` 这两个对象信息类,分别检索对象的名称(可能是文件或注册表项的绝对路径)和对象的类型(如文件、注册表项等)。 ``` __kernel_entry NTSYSCALLAPI NTSTATUS NtQueryObject( [in, optional] HANDLE Handle, [in] OBJECT_INFORMATION_CLASS ObjectInformationClass, [out, optional] PVOID ObjectInformation, [in] ULONG ObjectInformationLength, [out, optional] PULONG ReturnLength ); ```
标签:C++编程, NtQuerySystemInformation, PID管理, Windows系统工具, Wireshark, 互斥体, 句柄查看, 对象枚举, 文件句柄, 无线安全, 注册表句柄, 端点可见性, 系统API, 系统信息查询, 系统编程