0

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

2 回答 2

1

我的超能力告诉我,您的服务器代码正在使用异步或重叠 I/O。

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

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

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

于 2011-07-16T11:25:36.933 回答
1

我的一个答案

套接字使用了许多不同的功能。也许插件没有使用名为recv. 在我的脑海中,recvfrom我能想到,,,,,,,,。recvmsgWSARecvWSARecvFromWSARecvMsgReadFileReadFileEx

然后,插件可能会使用重叠的 I/O 进行请求(可能会因完成例程或完成端口而变得复杂),在这种情况下,数据不会在 egReadFile函数调用期间存储,而是在稍后的某个时间存储。钩住这些将更具挑战性。

于 2011-07-16T14:13:13.260 回答