3

PythonでERF(endace)キャプチャファイルを解析する最良の方法は何ですか? Python 用の libpcap ラッパーを見つけましたが、lipcap が ERF 形式をサポートしているとは思いません。

ありがとう!

4

2 に答える 2

3

これは、パケットごとに dict を返す単純な ERF レコード パーサーです (まとめてハッキングしただけなので、十分にテストされていません。すべてのフラグ フィールドがデコードされるわけではありませんが、そうでないフィールドは広く適用されません)。

注意:

  • ERF レコード タイプ: 1 = HDLC、2 = イーサネット、3 = ATM、4 = 再構成された AAL5、ここでは処理されない追加ヘッダーを含む 5 ~ 7 個のマルチチャネル バリアント。
  • rlenwlen+len(header)スナップの長さが短すぎる場合よりも短くなる可能性があります。
  • インタースティシャル ロス カウンタは、入力キューがオーバーフローしたときに Dag パケット プロセッサによって記録された、このパケットと前にキャプチャされたパケットの間で失われたパケットの数です。
  • scapy を使用したくない場合は、2 つの scapy 行をコメントアウトしてください。

コード:

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
于 2012-11-21T21:40:42.740 に答える