scapy
を使用して新しいパケットフォーマットを指定しようとしています。パケットにはアイテムのリストがあり、アイテムは「グループ化されたフィールド」で構成されています。 「グループ化されたフィールド」とは、異なるタイプのフィールドのサブシーケンスを意味します。私がscapyで知っている "グループ化されたフィールド"を作る唯一の方法は、Packet
クラスを使用し、FieldLenField
/PacketListField
を使用してシーケンスの長さとリストメンバーのタイプを参照することです。それは行く方法ですか?このようなもの:Scapy:複雑なフィールドグループで新しいプロトコルを追加する
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)
このアプローチの問題点は、パケットが再組み立てされたときに、グループ化の構造が保存されていないということです。アセンブリ時には、RepeatedSequence
の2番目のインスタンスは、カウントフィールドが2の場合でも、元のボディとして扱われます。このようにRepeatingSequences
を追加すると、再アセンブリ時に構造が保持されますか?リストの格納タイプとしてPacket
に頼らずにFieldsをグループ化する方法はありますか?各サブパケットはすなわち、それ自身の層に属するものとしてすべてを扱い、デフォルトで
def extract_padding(self, s):
return '', s
:
同じタイプのフィールドにFieldListField()を使用している場合、問題はそれ自身では現れません。 – Oleksiy
'Packet'クラスを直接' fields_desc'に追加することも可能です – Oleksiy
'RepeatingGroupedSequence'の代わりに' IP'クラスが使用されていれば十分です。 – Oleksiy