编写程序以形成自己的IP数据包需要什么?

时间:2014-10-31 15:47:54

标签: sockets networking linux-kernel packet

我正在尝试编写自己的数据包制作软件,理想情况下,除了在操作系统上构建的内容外,我希望不使用任何外部库...

通常我们可以使用这样的教程创建套接字和网络编程...... http://www.linuxhowtos.org/C_C++/socket.htm

我的问题是,我希望能够更好地控制发送的实际数据包。 (防止操作系统指纹识别并进行渗透测试)

哪里是最好的起点。我们现在假设我们处于Linux环境中。

2 个答案:

答案 0 :(得分:2)

最佳起点可能是man 7 rawman 7 packet。创建原始数据包应该很简单;但你必须自己实现CRC生成(TCP必需,UDP可选)和路由( - >正确的接口)。

答案 1 :(得分:2)

有几种方法可以实现这一目标。它可以通过原始套接字或直接访问网络适配器内核模式驱动程序来完成。

传统上,原始套接字已被许多人选择用于制作用户定义的协议/数据包&用于注射试验。

对于使用原始套接字,您需要选择一个提供原始套接字访问和使用的系统。

原始套接字编程的典型步骤如下:

  1. 确保用于制作您自己的数据包的过程已启用CAP_NET_RAW
  2. 打开原始套接字(使用SOCK_RAW)
  3. 创建您想要的数据包(如果您使用TCP / IP进行构建,请确保填写相应的校验和,否则数据包将在下一个节点中删除)
  4. 确保通过setsockopt设置IP_HDRINCL,以便内核知道标头的存在,并且不插入自己的标头。 (如果设置为零,这也可以确保填充IP校验和。)
  5. 通过sendto发送数据
  6. 但请注意,虽然linux没有填写任何标题填充,但IP_HDRINCL存在的情况除外(即使在这里,它只会填充0的选择性字段),不同的操作系统将以不同的方式运行。因此,通常原始套接字的使用会降低可移植性的可行性。