如何在 Windows 上使用重叠套接字调试数据包处理

逆向工程 视窗 登录 联网
2021-06-19 13:42:40

这个问题非常复杂,所以我不想遇到不必要的细节。

我有一个网络应用程序,它通过 UDP 一次与多个客户端进行通信。我没有写过,也没有办法得到源代码。它的作者已经放弃了它,所以我不能指望他身边的任何形式的支持。该服务器应用程序包含一个错误,允许任何人通过发送特定格式错误的数据包来使其崩溃。我需要自己开发某种修复程序。

我正在尝试使用 IDA Free、x64dbg 和其他一些工具来分析程序。但是我无法找到正在处理接收到的数据包的代码。首先,我查找了 API 调用并找到了对WSARecvFromMSDN 的文档)的调用并为其设置了断点。但是检查我发现的参数,它使用重叠的套接字。在这里学到了一些关于这个模型的知识根据那篇文章,接收操作是异步执行的,稍后完成,有两种方法可以在程序完成时通知程序。

  1. 通过指向函数 lpCompletionRoutine 的指针,该函数在数据准备好时被调用
  2. 通过一个 HANDLE 到一个事件对象,即在数据准备好时设置

但是在我的应用程序中 lpCompletionRoutine 和 lpOverlapped.hEvent 都是 NULL。然而该函数总是返回 -1 并且 WSAGetLastError() 是 3E5 (WSA_IO_PENDING)。 WSARecvFrom 调用

如果 lpCompletionRoutine 和 lpOverlapped.hEvent 都是 NULL,应用程序如何知道何时处理接收到的数据,更重要的是,我如何找到处理这些数据的代码?

编辑:我试过搜索 API call WSAGetOverlappedResult,没有。我还尝试在该缓冲区上设置硬件断点,但直到异常 ACCESS_VIOLATION 才中断,其中数据已在缓冲区中并正在处理。

我需要找到处理的开始,但中间有相当多的代码。

1个回答

所以问题是,网络应用程序使用的是GetQueuedCompletionStatus而不是WSAGetOverlappedResult解释如下:https://support.microsoft.com/cs-cz/help/181611/socket-overlapped-io-versus-blocking-nonblocking-mode我只是不知何故错过了这篇文章。

如果你问我是如何发现它的,那么我不得不以艰难的方式去做。我从导致 ACCESS_VIOLATION 的指令开始,然后我使用堆栈上的返回地址在代码流中倒退,试图跟踪格式错误的数据的来源。不幸的是,崩溃发生在数据包处理之外的其他线程中,所以我还必须使用硬件内存断点来查找这些数据从哪里复制等等。

然而,一个谜团仍未解决,那就是:为什么不将硬件断点直接放在传递给 WSARecvFrom 的缓冲区中,暂停我的程序?当代码到达 GetQueuedCompletionStatus 时,数据显然在那里,但它通过了我的断点并没有中断地执行此操作。