如何在将数据发送到TCP套接字之前从ftp服务器/客户端获取数据

时间:2014-08-28 04:52:16

标签: c++

在我的程序中,我需要在将数据发送到TCP套接字之前从FTP服务器/客户端获取数据,在获取数据之后我必须将8字节的数据(将在有效负载的开头添加)附加到它然后将其恢复为tcp套接字。它甚至可能吗?我在网上搜索没有运气

1 个答案:

答案 0 :(得分:1)

正如Pragnesh建议的那样,使用cURL库。但是,使用cURL意味着它将创建数据包并通过套接字发送它。您可以尝试以下两种方法

  1. 第一个选项是修改cURL代码本身,以便在将数据包写入套接字之前修改它们。但这将涉及获得对FTP库的良好理解并重新编译整个代码。这是可能的,但不是一个简洁的方法。

  2. 第二种方法的工作原理如下 一个。允许库(cURL或任何其他库)创建协议数据包并将其写入套接字。但是,当您将FTP服务器IP传递给库时,传递假IP(这是一个临时IP并将在以后更换),例如10.1.1.5。

    湾创建一个虚拟设备(TUN设备是标准Linux发行版的一部分),并将FTP协议数据包写入IP层的虚拟设备。为此添加一个新的路由表条目,该条目表示对于具有目标IP作为伪造IP的数据包(在本例中为10.1.1.5),目标设备应该是您的TUN设备。因此,每当FTP协议数据包到达目标IP为10.1.1.5的IP层时,它将被写入虚拟设备,而不是被发送出机器。

    ℃。在您的应用程序中,使用read()命令侦听虚拟设备。写入虚拟设备的所有数据包都在应用程序中接收。收到的数据包是通过IP上的TCP" FTP"包。这意味着它将拥有FTP协议数据包,TCP标头和IP标头。

    d。现在,你可以使用你想要的这个数据包做任何事情。在您的情况下,只需在缓冲区中获得正确的偏移量(IP和TCP标头的大小是固定的)并添加您的数据。修改数据包后,您将不得不更改两个IP地址。此IP数据包中的源IP地址是虚拟设备IP地址,而不是您的eth0地址。所以用你的eth0地址替换这个源IP。 pakcet中的目标IP地址是虚假IP。再次使用正确的FTP服务器IP替换此地址。

    即完成后重新计算IP和TCP标头校验和。 (这些是标准算法,很容易找到)。在此之后,最后一件事是使用write()命令在虚拟设备上再次写入数据包。一旦你这样做,数据包将被注入IP层,这次将离开机器。您必须设置IP转发标志并禁用rp-filter设置。

  3. 希望这会有所帮助。