2012-07-27 56 views
0

我正在编写一个程序来重建Snort捕获的TCP流。大部分我关于会话重建阅读这些示例之一:使用libpcap,有没有一种方法来确定从离线pcap文件捕获的数据包的文件偏移量?

  • 负载到内存中整个PCAP文件开始,因为硬件限制(而不是解决方案,事实上,一些捕获的文件是10 GB或
  • 缓存存储器中的每个数据包,当它通过捕获读取并丢弃不相关的数据包时,这提出了基本上相同的问题,因为读取整个文件到内存中

我目前的解决方案是写我自己的pcap文件分析器,因为格式很简单。我将每个数据包的偏移量保存在一个向量中,并在我通过它之后重新加载每个数据包。这和libpcap一样,一次只能将一个数据包传输到内存中;我只使用序号和标志进行排序,而不是分组数据。与libpcap不同,它明显较慢。使用libpcap处理570 MB的捕获需要大约0.9秒,而我的代码需要3.2秒。但是,我有能够在不重新加载整个捕获的情况下向后寻找的优势。

如果我坚持libpcap的速度问题,我想我可以做一个currentOffset变量初始值为24(pcap文件全局标题的大小),每次我推它到一个向量加载一个新的数据包,每增加一个数据包的大小+16(对于pcap记录头的大小),我都会调用pcap_next_ex。然后,无论何时我想读取一个单独的数据包,我都可以使用常规方法加载它,并寻求packetOffsets[packetNumber]

有没有更好的方法来做到这一点使用libpcap?

回答

0

自己解决了这个问题。

在我打电话给pcap_next_ex之前,我把ftell(pcap_file(myPcap))转换为vector<unsigned long>。之后根据需要手动解析数据包。

EZPZ。它只花了24小时以上的脑残...

相关问题