【问题标题】:C++ receive functionsC++ 接收函数
【发布时间】:2011-07-16 07:59:56
【问题描述】:

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

【问题讨论】:

  • 如果是你的服务器和你的代码,为什么还要使用Detours?您大概可以修改您的服务器代码以记录/发送您在真正的 API 调用返回后收到的数据。

标签: c++ windows detours


【解决方案1】:

来自an answer of mine

套接字有很多不同的功能。可能插件没有使用名为recv 的函数。我脑海中浮现出recvfromrecvmsgWSARecvWSARecvFromWSARecvMsgReadFileReadFileEx

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这些回调每次只会被调用一次......必须再次调用接收函数才能继续接收数据,即使在重叠模式下也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多