PacketFu时间戳

时间:2013-10-30 01:44:09

标签: ruby libpcap

我无法弄清楚如何使用PacketFu时间戳结构。 (PacketFu docs - timestamp doc)我正在做

packets = PcapFile.read_packets "myCapture.pcap"

...但我不知道如何从结果中获取时间戳信息。 Unix纪元格式没问题。

我知道时间戳信息是libpcap的一部分,而不是实际的数据包,我已经确认(在Wireshark中)存在有用的时间戳信息。我想以编程方式提取它。


以下是我从Packetfu test code收集到的内容:

file = File.open("myCapture.pcap") {|f| f.read}
packets = PacketFu::PcapPackets.new.read file
packets.each { |p|
    t = p.timestamp
    puts t.sec.to_i.to_s + "." + t.usec.to_i.to_s
    packet = PacketFu::Packet.parse(p.data)
    # do stuff with packet...
}

可怕的未记录,并且可能会导致性能不得不读取整个文件而不是像PcapFile.read_packets 那样传递块,这比{{1}更令人惊讶} ... (这是一个轶事,而不是科学的结果。)


我会接受比上述更明显的答案。

此外,如果有足够代表的人可以创建PcapFile.read_packets代码,那就太棒了。

1 个答案:

答案 0 :(得分:1)

我有同样的问题。所以我扩展了PacketFu来解决它。我希望这会对你有所帮助。

require 'packetfu'

module PacketFu
  class Timestamp
    def to_f
      sec.to_i + (usec.to_i / 1000000.0)
    end
  end

  class PcapFile
    def self.read_packets_with_timestamp(fname, &block)
      count = 0
      packets = [] unless block
      read(fname) do |packet| 
        pkt = Packet.parse(packet.data.to_s)
        pkt.timestamp = packet.timestamp.to_f
        if block
          count += 1
          yield pkt
        else
          packets << pkt
        end
      end
      block ? count : packets
    end
  end

  class Packet
    attr_accessor :timestamp
  end
end

PacketFu::PcapFile.read_packets_with_timestamp('xxx.pcap') {|pkt|
  if pkt.is_ip? and pkt.is_tcp?
    puts "[#{pkt.timestamp}] #{pkt.ip_src_readable}(#{pkt.tcp_sport}) -> #{pkt.ip_dst_readable}(#{pkt.tcp_dport})"
  end
}