PythonでERF(endace)キャプチャファイルを解析する最良の方法は何ですか? Python 用の libpcap ラッパーを見つけましたが、lipcap が ERF 形式をサポートしているとは思いません。
ありがとう!
PythonでERF(endace)キャプチャファイルを解析する最良の方法は何ですか? Python 用の libpcap ラッパーを見つけましたが、lipcap が ERF 形式をサポートしているとは思いません。
ありがとう!
これは、パケットごとに dict を返す単純な ERF レコード パーサーです (まとめてハッキングしただけなので、十分にテストされていません。すべてのフラグ フィールドがデコードされるわけではありませんが、そうでないフィールドは広く適用されません)。
注意:
rlen
wlen+len(header)
スナップの長さが短すぎる場合よりも短くなる可能性があります。コード:
import scapy.layers.all as sl
def erf_records( f ):
"""
Generator which parses ERF records from file-like ``f``
"""
while True:
# The ERF header is fixed length 16 bytes
hdr = f.read( 16 )
if hdr:
rec = {}
# The timestamp is in Intel byte-order
rec['ts'] = struct.unpack( '<Q', hdr[:8] )[0]
# The rest is in network byte-order
rec.update( zip( ('type', # ERF record type
'flags', # Raw flags bit field
'rlen', # Length of entire record
'lctr', # Interstitial loss counter
'wlen'), # Length of packet on wire
struct.unpack( '>BBHHH', hdr[8:] ) ) )
rec['iface'] = rec['flags'] & 0x03
rec['rx_err'] = rec['flags'] & 0x10 != 0
rec['pkt'] = f.read( rec['rlen'] - 16 )
if rec['type'] == 2:
# ERF Ethernet has an extra two bytes of pad between ERF header
# and beginning of MAC header so that IP-layer data are DWORD
# aligned. From memory, none of the other types have pad.
rec['pkt'] = rec['pkt'][2:]
rec['pkt'] = sl.Ether( rec['pkt'] )
yield rec
else:
return