【发布时间】:2013-04-22 03:26:29
【问题描述】:
如何获取程序创建的套接字的套接字 ID(句柄)?
我知道我可以通过GetTcpTable() 获取所有程序中所有打开的套接字,但它有两个问题:
- 它显示所有程序套接字
- 它不返回套接字的 ID(句柄)
【问题讨论】:
-
您可以枚举进程中的所有对象(PID 可以通过 GetExtendedTcpTable 和 TCP_TABLE_OWNER_PID_ALL 获得)并查找名为“Device\Tcp”的句柄(参见github.com/dzzie/SysAnalyzer/blob/master/source/sysanalyzer/… 或powerbasic.com/support/forums/Forum4/HTML/012185.html) .使用 Process Explorer 进行的快速扫描表明,这种命名方案在 Windows 8 上不再适用。你需要插座手柄做什么?也许还有其他不涉及劫持套接字句柄的方法来解决您的问题。
-
@DanielStelter 我只是想用他们的套接字发送数据包
-
@Shahriyar:您所要求的并非微不足道。为了让一个进程访问另一个进程的套接字,源进程必须在自己的套接字上调用
WSADuplicateSocket(),然后通过IPC将该信息传递给目标进程。然后目标将信息传递给WSASocket()以访问源的现有连接。除非您同时编写这两个应用程序,否则源应用程序不会为您调用WSADuplicateSocket(),因此您必须将自己的代码注入源进程,例如使用CreateRemoteThread(),才能调用WSADuplicateSocket()并取回信息. -
@RemyLebeau - 即使他设法使用 CreateRemoteThread 将代码注入另一个进程,他仍然没有套接字值可以传递给对 WSADuplicateSocket 的调用。
-
@selbie:这就是原始问题的全部目的 - 如何获取另一个进程的套接字句柄。 Daniel 回答说 - 枚举进程的内核对象以查找
Device\Tcp对象,直到找到所需的句柄。