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, 系统信息查询, 系统编程