Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于数据包注入的Libnet与原始套接字_C++_Network Programming_Raw Sockets_Libnet_Packet Injection - Fatal编程技术网

C++ 用于数据包注入的Libnet与原始套接字

C++ 用于数据包注入的Libnet与原始套接字,c++,network-programming,raw-sockets,libnet,packet-injection,C++,Network Programming,Raw Sockets,Libnet,Packet Injection,我需要更多经验丰富的网络程序员就GNU/Linux系统上的数据包注入提供意见/建议。我正在研究一个用于封包注入和嗅探的开放源码C++库。图书馆在建。在页面上有几个例子可以看到这个库是如何工作的 我左右为难,希望你能考虑一下。目前,图书馆“提供”两种在网上写数据包的方法。首先,构建包: Packet pck = IP()/UDP()/DNS(); 1) 然后通过Send()函数发送: pck.Send("eth0"); 2) 或者使用RawSocketSend()函数(这是一个“实验性”函数,

我需要更多经验丰富的网络程序员就GNU/Linux系统上的数据包注入提供意见/建议。我正在研究一个用于封包注入和嗅探的开放源码C++库。图书馆在建。在页面上有几个例子可以看到这个库是如何工作的

我左右为难,希望你能考虑一下。目前,图书馆“提供”两种在网上写数据包的方法。首先,构建包:

Packet pck = IP()/UDP()/DNS();
1) 然后通过Send()函数发送:

pck.Send("eth0");
2) 或者使用RawSocketSend()函数(这是一个“实验性”函数,我正在使用它进行基准测试,但用户可以使用它):

其中sd是套接字描述符。如果数据包具有链路层协议(如以太网),则sd应为数据包套接字描述符。如果不是,则应该是原始套接字描述符

发送数据包的标准且有文档记录的方法是使用send()方法。目前,Send()方法用于在线路上写入数据包

问题是Send()函数比RawSocketSend()慢得多。。。我经常需要做很多棘手和烦人的事情来调整libcrafter处理协议字段的方式,以正确使用libnet_build*函数(这会导致性能下降)。每次我实现一个协议时,我都要看一看libnet文档,这使得开发过程非常繁琐和缓慢。因此,我想停止使用libnet进行数据包注入,直接在Send()函数中使用原始/数据包套接字

Libcrafter旨在以透明的方式为用户处理所有繁琐的数据包制作工作(校验和计算、字节排序、报头长度等)。在最流行的GNU/Linux系统(Ubuntu、Fedora、Debian)上,使用原始/数据包套接字(RawSocketSend函数),一切都可以正常工作

我使用libnet的唯一原因是可移植性问题。但我不知道也不打算将libcrafter移植到其他系统,而不是GNU/Linux系统

我的问题是:

  • 在GNU/Linux包注入库上使用原始/包套接字是否谨慎且安全
  • 如果我决定停止使用libnet,您知道关于GNU/Linux发行版之间原始/数据包套接字的可移植性,我应该考虑的一些问题吗
  • 在内核的未来版本中,原始/数据包套接字接口可能会更改

  • 非常感谢:-)

    开源的好处在于您可以浏览源代码,所以我检查了:

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

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

    有关原始套接字的详细信息: 试试谷歌

    对于您的问题:

    1) 我不明白你说的“安全”是什么意思?一般的回答是“是的,小心”

    2) 关于可移植性,使用原始套接字是POSIX标准的一部分,因此它可以在任何linux地区工作,也可能在windows上工作。我不知道libcraft是否可以移植到windows,但它应该在任何linux区域上运行。如果不能,您可以对库做出贡献并使其可移植

    3) 我不能回答关于未来的问题。同样,POSIX标准多年来没有太大变化,将来可能会发生变化。我不是先知,但我不认为在不久的将来它会改变


    Guy

    开源的美妙之处在于,您可以浏览源代码,因此我检查了:

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

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

    有关原始套接字的详细信息: 试试谷歌

    对于您的问题:

    1) 我不明白你说的“安全”是什么意思?一般的回答是“是的,小心”

    2) 关于可移植性,使用原始套接字是POSIX标准的一部分,因此它可以在任何linux地区工作,也可能在windows上工作。我不知道libcraft是否可以移植到windows,但它应该在任何linux区域上运行。如果不能,您可以对库做出贡献并使其可移植

    3) 我不能回答关于未来的问题。同样,POSIX标准多年来没有太大变化,将来可能会发生变化。我不是先知,但我不认为在不久的将来它会改变


    盖伊

    谢谢你的回答,我不知道这个问题是否清楚,但我是libcrafter的开发者,不是用户。出于性能原因,我想做的是将下一版本的Send函数改为在原始套接字上写入,而不是使用libnet。。。我的开发系统是Ubuntu,我所说的“安全”是指,如果我能安全地假设Ubuntu中运行良好的东西(字节排序、使用setsockopt时的行为等)在其他发行版中也会运行良好。正如您所说,如果另一个系统兼容POSIX,那么一切都应该正常,对吗?是的,因为上面所有的都是系统调用,实际的过程是在内核级别完成的。因为它支持POSIX,所以不应该更改它。无论如何,你可以
    pck.RawSocketSend(sd);