我正在尝试让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层之后留下的任何内容。到目前为止工作正常。答案 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)
如果您使用libpcap
,为什么不使用libpcap
发送数据包?不,它并不为人所知,但是它确实有效。请参阅函数pcap_sendpacket
。
数据包libpcap
返回的只是一个字节数组。任何需要一个字节数组(包括以太网帧)的东西都应该有效。但请注意,您的操作系统和/或硬件可能会阻止您发送包含错误或格式错误的源MAC地址的数据包。