1

我试图让 libpcap 读取 pcap 文件,让用户选择一个数据包并使用 libnet 在 c 中写入该数据包。

我完成了从文件部分的读取。Libpcap 将该数据包放入一个 const unsigned char 中。我以前使用过 libnet,但从未使用过 libnet 的高级功能。我会使用 libnet 的构建函数创建数据包,然后让它们继续运行。我意识到有一个函数,libnet_adv_write_link()它接受 libnet 上下文、指向要注入的数据包的指针(const uint8_t)和数据包的大小。我尝试传递从 libpcap 获得的“数据包”,它编译并执行没有错误。但是,我在wireshark中没有看到任何东西。

这是否是解决这个问题的正确方法,或者我应该从 libpcap 读取并根据 libpcap 读取的内容用 libnet 构建一个单独的数据包?

编辑:我相信我在一定程度上解决了这个问题。我用 libpcap 读取了数据包。将第 16 个字节之后的所有字节放入另一个 uchar 并将其写入线路。使用 libnet_adv_write_raw_ipv4(),用 LIBNET_RAW4_ADV 初始化 libnet。我相信,也许是因为驱动的原因,我对 ETH 层没有太多的权力。所以基本上我只是让它自动这样写,而新的 uchar 数据包就是原始数据包中 ETH 层之后剩下的任何东西。到目前为止工作正常。

4

2 回答 2

4

我是当前的 libnet 维护者。

您应该调用 libnet_write_link() 来写入数据包。如果你没有看到它,可能是你没有打开正确的设备,你没有权限(你检查了 libnet_write_link 我希望的返回值),也可能是注入的数据包无效。

如果您不需要构建数据包,听起来您应该使用 pcap 发送数据包,但请参阅http://www.tcpdump.org/manpages/pcap_inject.3pcap.html

此外,您的声明“Libpcap 将该数据包放入 const unsigned char”很奇怪。一个数据包不适合单个字符,pcap 所做的是,根据 API,返回指向数据包数据的指针。它值得包括一段代码,显示如何从数据中获取数据包,以及如何将其传递给 libnet。您可能没有正确使用指针。

于 2014-08-19T17:30:20.910 回答
0
  1. 如果您正在使用libpcap,为什么不使用libpcap发送数据包?不,它并不为人所知,但它确实有效。见功能pcap_sendpacket

  2. 返回的数据包libpcap只是一个字节数组。任何需要字节数组(包括以太网帧)的东西都应该可以工作。但是请注意,您的操作系统和/或硬件可能会阻止您发送源 MAC 地址不正确或格式错误的数据包。

于 2014-08-18T19:21:50.240 回答