c++ - WSARecv Hook : prevent packet from being recieved by the executable

标签 c++ sockets detours overlapped-io

我正在使用 C++ 和弯路处理 Hook winsock2 函数的 dll。我的目标是修改进出原始可执行文件的 TCP 流量。在某些时候,我需要停止某些数据包的传递(这样原始可执行文件根本不知道该数据包,但仍保持连接)。

有了 WSASend 钩子(Hook),就很清楚了(你只是不调用原始的 WSASend 并返回 0)。 但是我不知道如何使用 WSAOVERLAPPED 结构在 WSARecv 钩子(Hook)中实现它。

我希望下面的代码能说明我想要什么:

__declspec(dllexport) int WINAPI WSARecv_hook(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
    // Recieve real data
    int ret = WSARecv_real(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);

    // Loop over lpBuffers and analyze it
    for(int i=0; i < dwBufferCount; i++)
    {
        // analyze it
        if(packet_should_be_blocked(lpBuffers[i].buf, lpBuffers[i].len))
        {
            // Do or return what?
        } else {
            // Otherwise, just process as usual
        }
    }
    return ret;
}

我如何假装什么​​都没发生,也没有收到任何数据包(比如假的 WSA_IO_PENDING)?有什么想法吗?

附言据我所知,可执行文件不使用完成例程(lpCompletionRoutine 始终为 NULL),仅使用重叠结构。

最佳答案

主要障碍是重叠操作意味着在调用函数以挂起状态退出后在后台执行。如果调用者要求 WSARecv() 执行重叠读取,它期望数据到达后台,您将无法直接验证钩子(Hook)中的数据,因为它有还没有收到。您将必须使用您自己的私有(private) WSAOVERLAPPED 来执行您自己的重叠读取,使用线程或完成回调来检测读取何时完成,以便您随后可以分析数据。如果数据可接受,则将其复制到调用者的缓冲区中并向调用者的 WSAOVERLAPPED 发出信号。否则,发布另一个读取并等待该数据到达,根据需要重复,直到您最终收到一些您想要提供给调用者的数据。

关于c++ - WSARecv Hook : prevent packet from being recieved by the executable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171373/

相关文章:

sockets - 父子进程,socket关闭

C++ 接收函数

c++ - 绕道钩住 CreateFile 函数触发堆栈溢出

c++ - 在 mp4 容器中保存视频时 FPS 太高

c++ - 将 C++ 代码桥接到我的 swift 代码中。 XCode 中哪种文件扩展名适用于哪种基于 c 的语言?

c++ - cvExtractSURF 抛出异常,cvCreateSeq 中输入数组 ( ) 的大小不正确

java - codenameone 顺序套接字写/读

node.js - 当向 Node.js tcp 套接字发送多条消息时,它们会作为一条消息流式传输

c++ - 如何获取 ConnectEx() 指针

c++ - 有没有办法在不编写实际文件的情况下将 CString 发送到 CFile?