1

我无法弄清楚如何使用 PacketFu 时间戳结构。(PacketFu 文档-时间戳文档)我在做

packets = PcapFile.read_packets "myCapture.pcap"

...但我不知道如何从结果中获取时间戳信息。Unix 纪元格式就可以了。

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


这是我从Packetfu 测试代码中收集到的内容:

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_packetsPcapFile.read_packets???具有惊人的性能。(这是一个轶事,而不是科学的结果。)


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

此外,如果有足够代表的人可以创建packetfu标签,那就太好了。

4

1 回答 1

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
}
于 2013-11-01T02:19:08.470 回答