[英]Libnet vs Raw Sockets for packet injection
对于GNU / Linux系统上的数据包注入,我需要更多有经验的网络程序员的意见/建议。 我正在开发一个开放源C ++库,用于数据包注入和嗅探。 图书馆是libcrafter 。 在页面上,有一些示例可以查看库的工作方式。
我有一个难题,请多多关照。 当前,库“提供”两种方式在网上写数据包。 首先,构造数据包:
Packet pck = IP()/UDP()/DNS();
1),然后使用Send()函数发送:
pck.Send("eth0");
2)或使用RawSocketSend()函数(这是我用于基准测试但对用户可用的“实验”函数):
pck.RawSocketSend(sd);
其中sd是套接字描述符。 如果数据包具有链路层协议(例如以太网),则sd应该是PACKET套接字描述符。 如果不是,则应为RAW套接字描述符。
发送数据包的标准方法是使用Send()方法。 当前,Send()方法使用libnet在网络上写入数据包。
事实是,Send()函数远比RawSocketSend()慢...我经常需要做很多棘手而烦人的事情,以适应libcrafter处理协议字段以正确使用libnet_build *的方式功能(导致性能下降)。 每次实施协议时,我都必须查看libnet文档,并使开发过程非常繁琐且缓慢。 因此,我当时想停止使用libnet进行数据包注入,而直接在Send()函数中使用RAW / PACKET套接字。
Libcrafter旨在以透明的方式处理用户处理包制作的所有繁琐工作(校验和计算,字节排序,标头长度等)。 使用RAW / PACKET套接字(RawSocketSend函数),在大多数流行的GNU / Linux系统(Ubuntu,Fedora,Debian)上,一切都可以正常工作。
我使用libnet的唯一原因是可移植性问题。 但是我不具备将libcrafter移植到其他系统而不是GNU / Linux系统的知识或意图。
我的问题是:
非常感谢你 :-)
关于开源的美丽之处在于您实际上可以浏览源代码,因此我已经检查了: http : //code.google.com/p/libcrafter/source/browse/libcrafter/crafter/Packet.cpp
并发现Packet :: send效率不高:它执行过多的系统调用(每次都将设备名称与实际接口匹配)并调用libnet函数,我猜每次都打开一个套接字并发送数据包。 无论如何,发送数据包的开销太大。
原始发送它,我没有看到功能代码,但我猜它只是使用send()
。 如果我是您,如果对sendRawPacket()函数不满意,我只是使用行套接字发送它,我已经看到该数据包提供了getRawBuffer()
函数。
有关原始套接字的更多信息: http : //www.tenouk.com/Module43a.html并尝试使用google。
对您的问题:
1)我不明白您所说的“安全”是什么意思? 普遍的回答是“是的,请小心”
2)关于可移植性,使用原始套接字是POSIX标准的一部分,因此它可以在任何linux发行版(也可能在Windows上)上运行。 我不知道libcraft是否可以移植到Windows,但是它应该可以在任何Linux发行版上运行。 如果没有,您可以为库做出贡献并使其可移植。
3)我无法回答关于未来的问题。 再次,它是POSIX标准,现在已经很多年没有太大变化,将来可能会更改。 我不是先知,但我认为不久的将来它不会改变。
盖伊
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.