【发布时间】:2021-08-15 20:29:08
【问题描述】:
我的 DLL 被注入到程序中,然后使用 Detours 挂钩到 connect、send、recv 和 closesocket 函数。关键是要阻止程序连接到某个服务器,而是直接与我的 DLL 通信。
我的recv 函数使用无限循环,只是等待任何数据发送到程序。当closesocket 被调用时,循环被打破,一切正常。
但是有一个用 C# 编写的程序在我关闭它时就会挂起。它的错误日志说:
SocketException: 不允许发送或接收数据的请求,因为套接字未连接并且(在使用 sendto 调用在数据报套接字上发送时)未提供地址。
在 System.Net.Sockets.Socket.Disconnect (Boolean reuseSocket) [0x00000] in :0
这个异常是预料之中的,因为套接字从不连接任何东西。但是有什么解决方法吗? System.Net.Sockets.Socket.Disconnect 在后台调用了什么?我还需要挂钩什么功能来检测它?
我尝试连接到shutdown、setsockopt、WSACancelBlockingCall、WSACleanup、WSASend、WSASendDisconnect、WSASendMsg、WSASendTo、WSARecv、@987654@3 987654338@。他们都没有被调用。
【问题讨论】:
-
使用 cmd.exe >Netstat -a 查看连接状态。您可能会看到 Timed-Wait 状态,这意味着连接的两端都试图同时关闭。您可以使用诸如wireshark 或fiddler 之类的嗅探器来捕获连接。 A [FIN] 表示连接的一侧开始关闭连接。 TCP是可靠的,每个动作都从另一端得到一个ACK。当两端尝试同时关闭时,缺少 ACK,状态变为 Timed-Wait。
-
从来没有真正的联系。我的
connect函数只是保存SOCKET值并返回成功。它从不调用真正的connect。然后send、recv和closesocket比较该值以了解它是否是我的套接字。 -
网络接口的传输层正在断开连接。
-
很好。刚检查。在 netstat 中记录了我的连接,而在 WireShark 中没有任何内容。我不得不使用 RawCap 来捕获数据包,因为连接在环回接口上。
标签: c# c++ sockets winsock detours