1

我需要更有经验的网络程序员对GNU/Linux系统上有关数据包注入的一些意见/建议。我正在开发一个用于数据包注入和嗅探的开源C++库。图书馆是libcrafter。在页面上有几个例子来看看图书馆是如何工作的。Libnet vs Raw Sockets用于数据包注入

我有一个困境,并希望你的想法。目前,图书馆“提供”两种方式在网上写封包。首先,数据包被构建:

pck.Send("eth0"); 

2)或使用RawSocketSend()函数(这是一个 “实验”:

Packet pck = IP()/UDP()/DNS(); 

1),然后与发送()函数所发送函数,我用于基准测试但可用于用户):

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 /包插座?
  2. 如果我决定停止使用libnet,你知道一些我应该考虑的有关GNU/Linux发行版之间RAW/PACKET套接字可移植性的问题吗?
  3. 未来版本的内核中RAW/PACKET套接字接口可能会改变吗?

非常感谢你:-)

回答

1

开源美丽的事情是,你实际上可以浏览源代码,所以我检查: http://code.google.com/p/libcrafter/source/browse/libcrafter/crafter/Packet.cpp

,看到包::发送效率不高:它会执行太多系统调用(每次将设备名称与实际接口匹配),并调用libnet函数,我猜测每次都会打开一个套接字并发送数据包。无论如何,发送数据包的开销太大。

发送它原始,我没有看到功能代码,但我想它只是使用send()。如果我是你,如果我对sendRawPacket()函数不满意,我只是使用行套接字发送它,我已经看到该包提供了getRawBuffer()函数。

有关原始插座的更多信息: http://www.tenouk.com/Module43a.html并尝试谷歌。

对于你的问题:

1)我不明白什么叫“安全”呢?一般的答案是“是的,仔细”

2)关于portabilty,使用原始套接字是POSIX标准的一部分,所以它可以在任何linux dist上运行,也可能在windows上运行。我不知道libcraft是否可以移植到windows,但它应该在任何linux dist上运行。如果没有,你可以贡献给图书馆,并使其便携。

3)我无法回答关于未来的问题。再一次,POSIX标准在很多年里没有多少变化,未来可能会改变。我不是先知,但我不认为它在不久的将来会改变。

盖伊

+0

谢谢你的答案,我不知道这个问题是否清楚,但我是libcrafter的开发者,而不是用户。我想要做的是改变发送函数的下一个版本,以写入原始套接字而不是使用libnet,出于性能的原因...我的开发系统是Ubuntu,而“安全”我的意思是如果我可以安全地假设在ubuntu中运行良好的东西(字节排序,使用setsockopt时的行为等)将在其他发行版中这样做。正如你所说,如果其他系统符合POSIX标准,一切都应该没问题,对吧? – LarryPel

+0

是的,因为以上所有都是系统调用,所以实际的过程是在内核级完成的。由于它支持POSIX,所以不应该改变。 无论如何,你可以随时检查其他分区。在虚拟机中 - 检查Linux KVM –