我正在为朋友游戏服务器编写数据包加密。 客户端使用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;
}
任何想法都会受到赞赏。
答案 0 :(得分:0)
需要考虑的一些事情。
在调用pWASRecv
函数之前,您实际上并未检查cryptPacket
的返回值。在对绕行钩子如何使用套接字代码做出任何其他假设之前,您需要先从该修复开始。如果调用指示错误,则可能没有很好地定义buffers->len
将是什么或将在这些缓冲区中将是什么。
此外,您可能假设套接字已初始化为同步。如果套接字已针对重叠I / O进行初始化,则lpOverlapped
和lpCompletionRoutine
参数变得非常相关。您可能需要挂钩完成例程或WSAGetOverlappedResult
以实际拦截套接字数据。
最后,我可以建议另一种方法。而不是试图“绕道”套接字API调用,运行“代理套接字”。也就是说,当创建服务器套接字(通过调用“套接字”)时,您将其更改为在另一个端口上侦听。然后创建一个单独的侦听套接字,侦听原始端口。当传入连接进入您的套接字时,您将与游戏服务器正在侦听的实际端口建立单独的“代理”连接。您可以拥有一个专用线程,只需在客户端套接字上调用send
和recv
,即可根据需要加密/解密数据。