繁体   English   中英

Libnet与原始套接字进行数据包注入

[英]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系统的知识或意图。

我的问题是:

  1. 在用于GNU / Linux的数据包注入库上使用RAW / PACKET套接字是否谨慎,安全?
  2. 如果我决定停止使用libnet,您是否知道一些有关在GNU / Linux发行版之间使用RAW / PACKET套接字进行可移植性的问题?
  3. RAW / PACKET套接字接口在将来的内核版本中可能会更改吗?

非常感谢你 :-)

关于开源的美丽之处在于您实际上可以浏览源代码,因此我已经检查了: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM