2011-11-10 11 views
4

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 

+0

同じタイプのフィールドにFieldListField()を使用している場合、問題はそれ自身では現れません。 – Oleksiy

+0

'Packet'クラスを直接' fields_desc'に追加することも可能です – Oleksiy

+0

'RepeatingGroupedSequence'の代わりに' IP'クラスが使用されていれば十分です。 – Oleksiy

答えて

5

クラスRepeatingGroupedSequenceextract_paddingメソッドを上書きする必要が

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

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

関連する問題