WSARecv Detour钩子密码

WSARecv Detour hook crypt

本文关键字:密码 Detour WSARecv      更新时间:2023-10-16

我正在为好友游戏服务器编写一个数据包加密。客户端使用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;
}

任何想法都将不胜感激。

需要考虑的一些事情。

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

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

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