WSARecv Detour hook crypt

时间:2015-04-21 11:10:31

标签: c++ sockets encryption hook detours

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

我设法加密/解密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;
}

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

需要考虑的一些事情。

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

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

最后,我可以建议另一种方法。而不是试图“绕道”套接字API调用,运行“代理套接字”。也就是说,当创建服务器套接字(通过调用“套接字”)时,您将其更改为在另一个端口上侦听。然后创建一个单独的侦听套接字,侦听原始端口。当传入连接进入您的套接字时,您将与游戏服务器正在侦听的实际端口建立单独的“代理”连接。您可以拥有一个专用线程,只需在客户端套接字上调用sendrecv,即可根据需要加密/解密数据。