我正在从我的服务器(C ++)挂钩一些函数。我想挂钩某些功能,能够转储数据包,一些客户端发送(连接/断开包)。我已经连接了函数recv / recvfrom和WSARecv / WSARecvFrom。只调用WSARecvFrom函数(很多次),但仅在服务器启动时调用。我需要挂钩哪些函数来查找远程机器的连接/断开包?我注意到,在服务器上播放时,4个接收函数永远不会被调用!为什么呢?
示例:
typedef int (WINAPI *def_recv)(SOCKET s, char* buf, int len, int flags);
def_recv Real_recv;
int WINAPI custom_recv(SOCKET s, char* buf, int len, int flags) {
Log("recv ...");
return Real_recv(s, buf, len, flags);
}
Real_recv = (def_recv)DetourFunction((PBYTE)(DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll"), "recv"),(PBYTE)&custom_recv);
答案 0 :(得分:1)
我的通灵能力告诉我你的服务器代码正在使用异步或重叠的I / O.
您在启动时观察到的WSARecvFrom
调用是“已发布”的缓冲区。当数据实际到达时,将调用指定为WSARecvFrom
的最后一个参数的回调函数。
您可能想要做的是挂钩WSARecvFrom
并将lpCompletionRoutine
参数替换为您自己的回调函数。它在你自己的回调函数中,你将记录/发出你想要观察的数据(然后调用应用程序所期望的真实回调函数)。并且服务器代码可以针对WSARecvFrom
的不同调用使用不同的回调函数 - 所以请小心谨慎。
服务器代码也完全有可能没有设置回调函数。可能正在使用IOCP或只是轮询重叠的结构。 YMMV。
答案 1 :(得分:1)
套接字使用了很多不同的功能。也许插件没有使用名为
recv
的函数。我能想到recvfrom
,recvmsg
,WSARecv
,WSARecvFrom
,WSARecvMsg
,ReadFile
,{{1} }。然后,插件可能正在执行具有重叠I / O的请求(可能由完成例程或完成端口复杂化),在这种情况下,数据不会在例如期间存储。
ReadFileEx
函数调用,但稍后会发生。挂钩那些将更具挑战性。