gpt4 book ai didi

C++ 获取程序打开套接字的句柄

转载 作者:IT老高 更新时间:2023-10-28 23:00:59 26 4
gpt4 key购买 nike

如何获取程序创建的套接字的套接字 ID(句柄)?

我知道我可以通过 GetTcpTable() 获取所有程序中所有打开的套接字,但它有两个问题:

  1. 它显示所有程序套接字
  2. 它不返回套接字的 ID(句柄)

最佳答案

正如雷米所说,这不是微不足道的。您必须为系统中的每个进程调用 OpenProcessPROCESS_DUP_HANDLE。您可能还需要 PROCESS_QUERY_INFORMATIONPROCESS_VM_READ,但我从来不需要它(我见过使用它的其他代码)。

对于每个进程,您可以使用 NtQuerySystemInformation(信息类为 SystemHandleInformation)访问施主进程的句柄表。最后,您调用 DuplicateHandle 以使进程的句柄也成为您的句柄。

在枚举施主进程的句柄表时,您必须过滤句柄类型。对于您复制的每个句柄,使用 ObjectTypeInformation 调用 NtQueryObject。如果类型是套接字,则将其保持打开状态并将其放入列表中。否则,关闭它并继续。

要执行比较,代码如下所示。类型以 UNICODE_STRING 形式返回:

// info was returned from NtQueryObject, ObjectTypeInformation
POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)(LPVOID)info;

wstring type( pObjectTypeInfo->Name.Buffer, pObjectTypeInfo->Name.Length );
if( 0 != wcscmp( L"Socket", type.c_str() ) ) { /* Not a Socket */ }

如果没有 Socket 类型(我不记得了),您应该尝试获取与句柄关联的名称(它仍然是 UNICODE_STRING),并查找 \\设备\\Tcp。这一次,您将使用相同的句柄,但使用 ObjectNameInformation 调用 NtQueryObject:

// info was returned from NtQueryObject, ObjectNameInformation
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)(LPVOID)info;

wstring name( pObjectNameInfo->Name.Buffer, pObjectNameInfo->Name.Length );
if( name.substr(0, 11) == "\\Device\\Tcp" ) ) { /* It's a TCP Socket */ }

几年前我和另一个人也做过类似的事情。我们使用互斥锁和事件来替代 Sockets,从他们的用户态 UI 程序(与 IPC 的特权组件共享句柄)中崩溃特权防病毒组件。见 Old Dogs and New Tricks: Do You Know Where Your Handles Are? .

关于C++ 获取程序打开套接字的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com