6

を使用して新しいパケット形式を指定しようとしていますscapy。パケットにはアイテムのリストがあり、アイテムは「グループ化されたフィールド」で構成されています。「グループ化されたフィールド」とは、異なるタイプのフィールドのサブシーケンスを意味します。私がscapyで知っている「グループ化されたフィールド」を作成する唯一の方法は、Packetクラスを使用し、FieldLenField/PacketListFieldを使用してシーケンスの長さとリストメンバーのタイプを参照することです。それは行く方法ですか?次のようになります。

from scapy.packet import Packet
from scapy.fields import *

class RepeatingGroupedSequence(Packet):
    name = "Simple group of two fields"

    fields_desc = [IntField('field1', 1), 
                   IntField('field2', 2)]

class TopLayer(Packet):
    name = "Storage for Repeating Sequence"

    fields_desc = [FieldLenField("length", None, count_of='rep_seq'),
                   PacketListField('rep_seq', None, RepeatingGroupedSequence, 
                                   count_from = lambda pkt: pkt.length),
                  ]

#Now here is the problem that I have with assembling PacketListField: 

#craft TopLayer packet
p = TopLayer()

#add two "repeated sequences"
p.rep_seq = [ RepeatingGroupedSequence(), RepeatingGroupedSequence() ]

#both sequences can observed
p.show()

#but the underlying structure of the repeated sequence is #Raw# at this stage
p.show2()

#length is 2
print p.rep_seq, 'length:', len(p.rep_seq)

#but the cloned packet has only one "repeated sequence", the rest is raw
clone = TopLayer(str(p))
clone.show()

#length is 1
print clone.rep_seq, 'length:', len(clone.rep_seq)

このアプローチの問題は、パケットが再構成されたときにグループ化の構造が保持されないことです。アセンブリでは、count フィールドが 2 であっても、 の 2 番目のインスタンスはRepeatedSequenceraw ボディとして扱われます。RepeatingSequences再アセンブリ時に構造が保持されるように、このように追加するにはどうすればよいでしょうか? Packetリストのストレージ タイプとして頼らずにフィールドをグループ化する方法はありますか?

4

1 に答える 1

8

クラスはメソッドRepeatingGroupedSequenceを上書きする必要がありますextract_padding

def extract_padding(self, s):
    return '', s

デフォルトでは、各サブパケットはすべてを独自のレイヤーに属するものとして扱います。

def extract_padding(self, s):
    return s, None

そして、これはグループ化の目的で使用されるものではありません。誰かがパディングとレイヤー分離の違いについて詳しく説明できますか?

于 2011-11-12T00:42:41.533 に答える