Udp WSArecFrom挂钩:lpOverlapped不唯一?

Udp WSArecFrom挂钩:lpOverlapped不唯一?,udp,hook,winsock,intercept,Udp,Hook,Winsock,Intercept,我一直试图在UDP数据包到达应用程序逻辑之前拦截它们。更准确地说,该应用程序使用的是DirectPlay服务器,并且没有源代码。 因此,我发现DirectPlay使用异步IO,方法是发布多个WSARecvFrom,然后让一些workerthreads使用WaitForSingleObject等待,最后使用WSAGetOverlappedResult检索IO状态 当WSARecvFrom返回时,lpBuffers当然还没有填充数据,因为操作仍处于挂起状态,稍后将完成 因此,我获取数据的想法是将lp

我一直试图在UDP数据包到达应用程序逻辑之前拦截它们。更准确地说,该应用程序使用的是DirectPlay服务器,并且没有源代码。 因此,我发现DirectPlay使用异步IO,方法是发布多个WSARecvFrom,然后让一些workerthreads使用WaitForSingleObject等待,最后使用WSAGetOverlappedResult检索IO状态

当WSARecvFrom返回时,lpBuffers当然还没有填充数据,因为操作仍处于挂起状态,稍后将完成

因此,我获取数据的想法是将lpOverlapped/lpBuffers对保存在std::map中,用于每个WSARecvFrom调用,然后,如果IO操作完成(在WSAGetOverlappedResult中),我将通过查找映射中的lpOverlapped来获取相应的(现在已填充的)lpBuffers

然而,这似乎有一个大问题:DirectPlay有时使用相同的lpOverlapped地址多次调用WSARECV,甚至使用相同的lpOverlapped->hEvent或lpBuffers地址,也针对相同的套接字(此时这些操作均未完成,因此它们都处于挂起状态)。我无法理解为什么会发生这种情况,文档清楚地说:“如果多个I/O操作同时未完成,那么每个操作都必须引用一个单独的WSAOoverlapped结构。” 因此,我无法正确检索lpBuffers,因为当调用WSageToOverlappedResult时,我不知道lpOverlapped对应的WSArecFrom,因为调用了多个WSArecFrom,每个WSArecFrom都具有相同的lpOverlapped!这怎么可能?有人知道DirectPlay是如何处理这个问题的吗?有没有其他方法可以拦截(并最终丢弃)UDP数据包?(我不想使用驱动程序)

(我尝试这样做有一个很好的理由:有人使用DirectPlay向游戏服务器发送被利用的UDP数据包,这会“混淆”DirectPlay逻辑,基本上会关闭服务器。因此,我必须在特定UDP数据包到达DirectPlay之前过滤掉它们)

很高兴得到任何提示


非常感谢

你确定这些数据包扰乱了DirectPlay而不是游戏服务器的逻辑吗?我认为如果可能的话,挂接服务器数据包调度器可能更容易,因为您不必担心网络方面的问题。“lpCompletionRoutine”呢?设置好了吗?也许你可以在那里钓。是的,我确定。一个特定的UDP数据包发送到DirectPlay,并发生DPN_MSGID_TERMINATE_会话。可悲的是,它很容易被利用。。。所以我需要一个winsock钩子,但为什么相同的lpOverlapped用于多个挂起的WSarecvFrom?这毫无意义。。。没有使用完成例程。嗯。。真奇怪。我知道_OVL结构用于将I/O请求排队发送给驱动程序,因此,是的,对于发出的每个I/O请求,都需要不同的_OVL。我假设您已经锁定了对std::map的访问?是的,锁定了,但是我现在只记录了WSARecvFrom参数,以查看dpnet如何调用它。我发现实际上是IDirectPlay8Client::EnumHosts导致了重复调用(服务器使用本地虚拟客户端/播放器,不知道为什么)。在服务器启动时,调用6x12 WSARecvFrom,6个不同的套接字,所有值都是唯一的。到目前为止一切都很好。但是,在一个新套接字上也创建了一个客户机,在EnumHosts()之后调用48x WSARecvFrom,但每调用12次,它就会再次使用相同的参数,因此,在这48个调用中,lpBuffers->buf是4x相同的,并且lpBuffers->buf是4x相同的…我现在使用一个解决方案,它似乎工作得很好:在服务器::主机和客户端::枚举主机之间的时间内,收集std::set中调用的套接字WSARecvFrom。然后,在随后调用WSARecvFrom时,我可以忽略集合中不存在的任何套接字(即IDirectPlay8Server不使用的套接字(如前所述,重复的lpOverlapped似乎只出现在IDirectPlay8Client使用的套接字中))。