gpt4 book ai didi

c - 如何处理 Hook 的 WSARecv

转载 作者:行者123 更新时间:2023-12-03 11:51:12 25 4
gpt4 key购买 nike

我正在做一个涉及 Hook WSARecv 的项目.我知道如何 Hook 这个函数,我的意思是它就像 Hook 另一个函数一样。无论如何,困难的部分是当WSARecv用于执行重叠操作。这个想法是,当应用程序接收到数据以拦截该数据并可以对其进行修改时,我正在为此使用管道。 native DLL 将所有数据通过隧道传输到托管“服务器”。这会处理输入等并将其返回到 native DLL。这适用于 WSASend , sendrecv .然而,困难的部分是应用程序使用重叠套接字时。

所以我需要先接收到的数据才能处理它,这是困难的部分。我该怎么做这样的事情?我想到了这一点,但它们似乎都一团糟:

WSARecv使用 WSAOverlapped 调用:
创建一个新线程,使用 WaitForSingleObject并通过 hEvent WSAOverlapped 结构。当事件发出信号时,将数据处理到托管服务器并将数据传递给程序。

WSARecv使用完成例程调用:
创建一个新线程,用lpOperationCompleted修改对原函数的调用到一个新功能。使用SleepEx将线程置于警报状态。当 OperationCompleted 被调用时,处理数据并将数据传回程序。

我可以发布我的代码,但我没有写,因为这似乎是一个糟糕的解决方案。所以没有真正的意义。

我想不出更好的解决方案,这似乎很可怕,因为当应用程序调用 WSARecv很多(例如,使用重叠套接字来处理大量客户端的大型服务器)它为每个调用创建一个新线程,这似乎是个坏主意。

那么我该怎么做呢?

最佳答案

无需为每个重叠的 IO 调用创建线程。

当使用重叠操作时,它们要么具有关联的事件(您可以放心地忽略)、完成例程,要么与 I/O 完成端口关联。

要处理前两种情况,您应该同时 Hook WSARecv() WSAGetOverlappedResult() .

如果您需要处理最后一个,您还需要 Hook GetQueuedCompletionStatus()

现在,当您接到 WSARecv() 的电话时,对于事件情况,你没有做任何特别的事情(除了可能保存一些与 lpOverlapped 相关的信息,例如缓冲区),并处理 WSAGetOverlappedResult() 中的数据(应用程序必须调用它来获取成功/错误和传输的字节。)

如果存在完成例程,请保存 lpOverlappedlpCompletionRoutine , 并将您自己的完成例程传递给真正的 WSARecv() .

您的例程应该处理数据并调用原始完成例程。

要处理 I/O 完成端口情况,请使用 WSARecv()保存 lpOverlapped和缓冲区等,在 GetQueuedCompletionStatus() ,调用原始,如果返回的重叠结构匹配,则处理数据。

您还应该注意,重叠的操作可能会立即完成,在这种情况下,不会发出事件信号,不会调用完成例程,并且(IIRC)IOCP 上没有完成排队。

关于c - 如何处理 Hook 的 WSARecv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com