我无法弄清楚如何使用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...
}
可怕的未记录,并且可能会导致性能不得不读取整个文件而不是像那样传递块,这比{{1}更令人惊讶} ... (这是一个轶事,而不是科学的结果。)PcapFile.read_packets
我会接受比上述更明显的答案。
此外,如果有足够代表的人可以创建PcapFile.read_packets
代码,那就太棒了。
答案 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
}