sockets - 编写一个程序来形成自己的IP数据包需要什么?

标签 sockets networking linux-kernel packet

我正在尝试编写自己的数据包制作软件,并且理想情况下我希望在没有任何外部库的情况下完成它,除了在操作系统上构建的库之外......

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

我的问题是我想对发送的实际数据包有更多的控制。 (防止操作系统指纹识别并进行渗透测试)

最好从哪里开始。现在假设我们处于 Linux 环境中。

最佳答案

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

原始套接字传统上是许多人用来制作用户定义的协议(protocol)/数据包和注入(inject)测试的选择。

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

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

  1. 确保用于制作您自己的数据包的进程已启用 CAP_NET_RAW
  2. 打开原始套接字(使用 SOCK_RAW)
  3. 创建所需的数据包(如果您使用 TCP/IP 进行构建,请确保填写适当的校验和,否则数据包将在下一个节点中丢弃)
  4. 确保通过setsockopt设置IP_HDRINCL,以便内核知道 header 的存在并且不会插入自己的 header 。 (这还可以确保在 IP 校验和设置为零的情况下填充 IP 校验和。)
  5. 通过sendto发送数据

但是,请注意,虽然除了 IP_HDRINCL 存在的情况之外,Linux 不会填充任何 header 填充(即使在这里,它也只会填充为 0 的选择性字段),但不同的操作系统会以不同的方式操作。因此,通常原始套接字的使用会降低可移植性的可行性。

关于sockets - 编写一个程序来形成自己的IP数据包需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678567/

相关文章:

java - 在 CIDR 网络 block 中查找免费前缀

linux-kernel - 如何从 kobject 获取设备

java - 管理客户端套接字池

c++ - 使用Boost ASIO处理无套接字的TCP

Java 安卓 OutputStreamWriter IOException

c++ - 如何枚举所有可用的网络接口(interface)?

c - 为什么在许多驱动程序上,函数的返回值是用变量处理的?

c - 在软中断和进程上下文之间共享数据

javascript - 无法让 socket.io 在服务器上工作,同时在本地运行良好

objective-c - 在 GNUstep 中进行 IP 网络的标准方法是什么?