C ++接收函数

时间:2011-07-16 07:59:57

标签: c++ windows detours

我正在从我的服务器(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);

2 个答案:

答案 0 :(得分:1)

我的通灵能力告诉我你的服务器代码正在使用异步或重叠的I / O.

您在启动时观察到的WSARecvFrom调用是“已发布”的缓冲区。当数据实际到达时,将调用指定为WSARecvFrom的最后一个参数的回调函数。

您可能想要做的是挂钩WSARecvFrom并将lpCompletionRoutine参数替换为您自己的回调函数。它在你自己的回调函数中,你将记录/发出你想要观察的数据(然后调用应用程序所期望的真实回调函数)。并且服务器代码可以针对WSARecvFrom的不同调用使用不同的回调函数 - 所以请小心谨慎。

服务器代码也完全有可能没有设置回调函数。可能正在使用IOCP或只是轮询重叠的结构。 YMMV。

答案 1 :(得分:1)

来自an answer of mine

  

套接字使用了很多不同的功能。也许插件没有使用名为recv的函数。我能想到recvfromrecvmsgWSARecvWSARecvFromWSARecvMsgReadFile,{{1} }。

     

然后,插件可能正在执行具有重叠I / O的请求(可能由完成例程或完成端口复杂化),在这种情况下,数据不会在例如期间存储。 ReadFileEx函数调用,但稍后会发生。挂钩那些将更具挑战性。