是否可以用libnet写一个由libpcap读取的数据包?在c?

时间:2014-08-18 13:34:59

标签: c libpcap packet-capture libnet packet-injection

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

我从文件部分读完了。 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层之后留下的任何内容。到目前为止工作正常。

2 个答案:

答案 0 :(得分:4)

我是当前的libnet维护者。

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

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

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

答案 1 :(得分:0)

  1. 如果您使用libpcap,为什么不使用libpcap发送数据包?不,它并不为人所知,但是它确实有效。请参阅函数pcap_sendpacket

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