WSARecv Detour 钩子地穴

WSARecv Detour hook crypt

我正在为好友游戏服务器编写数据包加密。 客户端使用 ws2_32 recv/send 但服务器使用 WSARecv/WSASend.

我已经设法 encrypt/decrypt send/recv/WSASend,但 WSARecv 似乎不可能。 我用的方法和recv一样,但是好像不行

int WINAPI MyWSARecv(SOCKET socket, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
         LPWSABUF buffers = lpBuffers;
        int ret = pWSARecv(socket, buffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);

        cryptPacket(buffers->buf, buffers->len);
        lpBuffers = buffers;
        return ret;
}

如有任何想法,我们将不胜感激。

一些需要考虑的事情。

在调用 cryptPacket 函数之前,您实际上并没有检查 pWASRecv 中的 return 值。在可以对绕行挂钩如何与套接字代码进行任何其他假设之前,您需要先从该修复开始。如果调用指示错误,则可能没有很好地定义 buffers->len 将是什么或那些缓冲区中将是什么。

此外,您可能假设套接字已初始化为同步。如果套接字是为重叠 I/O 初始化的,那么 lpOverlappedlpCompletionRoutine 参数就变得非常相关。您可能需要挂钩完成例程或 WSAGetOverlappedResult 以实际拦截套接字数据。

最后,我可以建议另一种方法。而不是尝试 "detour" 套接字 API 调用,运行 一个 "proxy socket"。也就是说,在创建服务器套接字时(通过调用 "socket"),您可以将其更改为侦听不同的端口。然后你创建一个单独的监听套接字来监听原始端口。当传入连接进入您的套接字时,您将单独 "proxy" 连接到游戏服务器正在侦听的实际端口。您可以有一个专用线程,它只在客户端套接字上调用 sendrecv,根据需要 encrypts/decrypts 数据。