【问题标题】:How does System.Net.Sockets.Socket.Disconnect disconnect from the socket?System.Net.Sockets.Socket.Disconnect 如何断开与套接字的连接?
【发布时间】:2021-08-15 20:29:08
【问题描述】:

我的 DLL 被注入到程序中,然后使用 Detours 挂钩到 connectsendrecvclosesocket 函数。关键是要阻止程序连接到某个服务器,而是直接与我的 DLL 通信。

我的recv 函数使用无限循环,只是等待任何数据发送到程序。当closesocket 被调用时,循环被打破,一切正常。

但是有一个用 C# 编写的程序在我关闭它时就会挂起。它的错误日志说:

SocketException: 不允许发送或接收数据的请求,因为套接字未连接并且(在使用 sendto 调用在数据报套接字上发送时)未提供地址。

在 System.Net.Sockets.Socket.Disconnect (Boolean reuseSocket) [0x00000] in :0

这个异常是预料之中的,因为套接字从不连接任何东西。但是有什么解决方法吗? System.Net.Sockets.Socket.Disconnect 在后台调用了什么?我还需要挂钩什么功能来检测它?

我尝试连接到shutdownsetsockoptWSACancelBlockingCallWSACleanupWSASendWSASendDisconnectWSASendMsgWSASendToWSARecv、@987654@3 987654338@。他们都没有被调用。

【问题讨论】:

  • 使用 cmd.exe >Netstat -a 查看连接状态。您可能会看到 Timed-Wait 状态,这意味着连接的两端都试图同时关闭。您可以使用诸如wireshark 或fiddler 之类的嗅探器来捕获连接。 A [FIN] 表示连接的一侧开始关闭连接。 TCP是可靠的,每个动作都从另一端得到一个ACK。当两端尝试同时关闭时,缺少 ACK,状态变为 Timed-Wait。
  • 从来没有真正的联系。我的connect 函数只是保存SOCKET 值并返回成功。它从不调用真正的connect。然后sendrecvclosesocket 比较该值以了解它是否是我的套接字。
  • 网络接口的传输层正在断开连接。
  • 很好。刚检查。在 netstat 中记录了我的连接,而在 WireShark 中没有任何内容。我不得不使用 RawCap 来捕获数据包,因为连接在环回接口上。

标签: c# c++ sockets winsock detours


【解决方案1】:

System.Net.Sockets.Socket.Disconnect 调用 DisconnectEx。正如评论所说:

注意DisconnectEx函数的函数指针必须在运行时通过SIO_GET_EXTENSION_FUNCTION_POINTER调用WSAIoctl函数来获取> 指定的操作码。传递给 WSAIoctl 函数的输入缓冲区必须包含 WSAID_DISCONNECTEX,这是一个全局唯一标识符 (GUID),其值标识 DisconnectEx 扩展函数。成功时,WSAIoctl 函数返回的输出包含一个指向 DisconnectEx 函数的指针。 WSAID_DISCONNECTEX GUID 在 Mswsock.h 头文件中定义。

所以,如果你想做我所做的,你必须:

  1. 挂钩WSAIoctl
  2. 检查dwIoControlCode是否为SIO_GET_EXTENSION_FUNCTION_POINTER
  3. 检查lpvInBuffer是否为WSAID_DISCONNECTEX
IsEqualGUID(*((GUID*)lpvInBuffer), WSAID_DISCONNECTEX)
  1. 将地址存储到真实的DisconnectEx某处
LPFN_DISCONNECTEX Real_DisconnectEx = NULL;
(...)
Real_DisconnectEx = *((LPFN_DISCONNECTEX*)lpvOutBuffer);
  1. 将地址返回给您的函数
*((LPFN_DISCONNECTEX*)lpvOutBuffer) = &Mine_DisconnectEx;

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多