Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WSARecv钩子:防止可执行文件接收数据包 我正在使用DC++来实现WiSoCK2函数的钩子,使用C++和DeNoRs。我的目标是修改从原始可执行文件到原始可执行文件的TCP通信量。在某个时刻,我需要停止某些数据包传递(这样原始的可执行文件根本不知道该数据包,但仍然保持连接)_C++_Sockets_Detours_Overlapped Io - Fatal编程技术网

WSARecv钩子:防止可执行文件接收数据包 我正在使用DC++来实现WiSoCK2函数的钩子,使用C++和DeNoRs。我的目标是修改从原始可执行文件到原始可执行文件的TCP通信量。在某个时刻,我需要停止某些数据包传递(这样原始的可执行文件根本不知道该数据包,但仍然保持连接)

WSARecv钩子:防止可执行文件接收数据包 我正在使用DC++来实现WiSoCK2函数的钩子,使用C++和DeNoRs。我的目标是修改从原始可执行文件到原始可执行文件的TCP通信量。在某个时刻,我需要停止某些数据包传递(这样原始的可执行文件根本不知道该数据包,但仍然保持连接),c++,sockets,detours,overlapped-io,C++,Sockets,Detours,Overlapped Io,有了WSASend钩子,就很清楚了(只需不调用原始WSASend并返回0)。 但我不知道如何使用WSAOoverlapped结构在WSARecv hook中实现它 我希望下面的代码演示我想要什么: __declspec(dllexport) int WINAPI WSARecv_hook(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOV

有了WSASend钩子,就很清楚了(只需不调用原始WSASend并返回0)。 但我不知道如何使用WSAOoverlapped结构在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;
}
\uuuu declspec(dllexport)int-WINAPI WSARecv\u钩子(套接字s、LPWSABUF lpBuffers、DWORD dwBufferCount、LPDWORD lpNumberOfBytesRecvd、LPDWORD lpFlags、lpwsaooverlapped lpOverlapped、lpwsaooverlapped\u完成例程lpCompletionRoutine)
{
//接收真实数据
int ret=WSARecv_real(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
//在lpBuffers上循环并分析它
对于(int i=0;i
我如何假装什么也没发生,也没有收到数据包(比如假WSA_IO_未决)?有什么想法/想法吗


另外,据我所知,可执行文件没有使用完成例程(lpCompletionRoutine总是空的),只有重叠结构。

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

修改TCP流量的一个更简单的方法是只挂接
连接
函数系列,并使应用程序连接到您控制下执行实际流修改的透明代理

虽然应用程序可以在流中写入自己的端口号,以便远程端与数据包源地址进行比较,但实际上这不是问题,因为

  • 这也会破坏NAT-PAT网关,这在住宅互联网连接中非常常见
  • 您可以重写内容并发送代理地址,以便检查通过

  • 事实上,FTP代理必须执行此命令重写,因为它们为文件传输生成从属连接。但是大多数现代的应用程序都是为了与PAT兼容而编写的。

    Hmm。我想我写了一条评论,询问您在“丢弃”数据包时希望应用程序实际做什么?是否认为是超时,或者网络宕机了?不,我只是希望它继续等待其他数据包,就像什么都没有发生一样。请注意,
    packet\u应该被阻止
    无法工作,因为TCP不是面向消息的。您必须缓冲数据,直到您有足够的数据进行分析,然后可能只删除在单个调用中收到的部分数据。这也适用于阻止接收呼叫。@BenVoigt我熟悉我正在修改的协议(每个数据包/消息的前两个字节定义数据包/消息类型,每个数据包类型都有固定长度),所以这根本不是问题。无论如何,谢谢。@splattru:这是个问题,因为您假设头和负载一起到达一个缓冲区。这种假设在TCP中是错误的。这不是一个问题。如果您收到一条不想传递给原始程序的消息,则在再次调用
    WSARecv()
    时,会将原始请求挂起,从而使下一个传入数据包有机会完成请求。如果不小心,重新写入数据包内容以用代理的IP替换客户端的IP可能会很危险。仅对您熟悉的协议(如FTP)执行此操作。如果代理盲目更改与客户端IP相似的任意数据,则代理可能会损坏与IP无关的数据。一些代理已经证明了这个问题。@Remy:我很确定协议在这个问题上是已知的;否则,对流的修改就不会起作用。@Remy:谢谢你发现了打字错误,事实上,我在最后一段中确实打算使用“FTP”。