这个问题非常复杂,所以我不想遇到不必要的细节。
我有一个网络应用程序,它通过 UDP 一次与多个客户端进行通信。我没有写过,也没有办法得到源代码。它的作者已经放弃了它,所以我不能指望他身边的任何形式的支持。该服务器应用程序包含一个错误,允许任何人通过发送特定格式错误的数据包来使其崩溃。我需要自己开发某种修复程序。
我正在尝试使用 IDA Free、x64dbg 和其他一些工具来分析程序。但是我无法找到正在处理接收到的数据包的代码。首先,我查找了 API 调用并找到了对WSARecvFrom(MSDN 的文档)的调用并为其设置了断点。但是检查我发现的参数,它使用重叠的套接字。我在这里学到了一些关于这个模型的知识。根据那篇文章,接收操作是异步执行的,稍后完成,有两种方法可以在程序完成时通知程序。
- 通过指向函数 lpCompletionRoutine 的指针,该函数在数据准备好时被调用
- 通过一个 HANDLE 到一个事件对象,即在数据准备好时设置
但是在我的应用程序中 lpCompletionRoutine 和 lpOverlapped.hEvent 都是 NULL。然而该函数总是返回 -1 并且 WSAGetLastError() 是 3E5 (WSA_IO_PENDING)。

如果 lpCompletionRoutine 和 lpOverlapped.hEvent 都是 NULL,应用程序如何知道何时处理接收到的数据,更重要的是,我如何找到处理这些数据的代码?
编辑:我试过搜索 API call WSAGetOverlappedResult,没有。我还尝试在该缓冲区上设置硬件断点,但直到异常 ACCESS_VIOLATION 才中断,其中数据已在缓冲区中并正在处理。
我需要找到处理的开始,但中间有相当多的代码。