1

我需要更有经验的网络程序员关于 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 套接字接口可能会在未来的内核版本中发生变化?

非常感谢 :-)

4

1 回答 1

1

开源的美妙之处在于您实际上可以浏览源代码,所以我检查了: 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 dist 上运行,也可能在 windows 上运行。我不知道 libcraft 是否可以移植到 Windows,但它应该可以在任何 linux dist 上运行。如果没有,您可以为库做出贡献并使其可移植。

3) 我无法回答有关未来的问题。再说一遍,这是 POSIX 标准,现在很多年都没有太大变化,将来可能会改变。我不是先知,但我认为在不久的将来它不会改变。

盖伊

于 2012-06-02T11:42:33.857 回答