我正在尝试让libpcap读取pcap文件,让用户选择一个数据包并使用libnet在c中写入该数据包。
我完成了从文件部分的读取。Libpcap 将该数据包放入一个常量无符号字符中。我以前使用过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 使用 LIBNET_RAW4_ADV 初始化。我相信,也许是因为驱动程序,我对ETH层没有太多权力。所以基本上我只是让它以这种方式自动写入,新的 uchar 数据包只是原始数据包中 ETH 层之后剩下的任何东西。到目前为止工作正常。
我是当前的libnet维护者。
您应该调用 libnet_write_link(( 来写入数据包。如果您没有看到它,则可能是您没有打开正确的设备,您缺少权限(您希望您检查了libnet_write_link的返回值(,并且也可能是注入的数据包无效。
如果您不需要构建数据包,听起来您应该使用 pcap 来发送数据包,但是,请参阅 http://www.tcpdump.org/manpages/pcap_inject.3pcap.html
此外,您的陈述"Libpcap 将该数据包放入常量无符号字符中"很奇怪。数据包不适合单个字符,pcap 的作用是根据 API 将指针返回到数据包数据中。值得包括一段代码,显示如何从数据中获取数据包,以及如何将其传递给libnet。您可能没有正确使用指针。
-
如果您使用的是
libpcap
,为什么不使用libpcap
来发送数据包?不,它并不为人所知,但是是的,它确实有效。请参阅函数pcap_sendpacket
。 -
libpcap
返回的数据包只是一个字节数组。任何需要字节数组(包括以太网帧(的东西都应该工作。但是,请注意,您的操作系统和/或硬件可能会阻止您发送源 MAC 地址不正确或格式错误的数据包。