1

ScaPy でいくつかのプロトコルを作成していますが、len フィールドがどのように機能するかを理解するのが困難です。http://trac.secdev.org/scapy/wiki/LengthFieldsを読んだ後、私はそれほど啓発されていません。

明らかに、「lenfield」(フィールドの長さを保持する) と「varfield」(実際の可変長フィールドを含む) と呼ばれるものがあります。ただし、varfield にできるフィールドは、PacketLenField、StrFixedLenField、および StrLenField だけのようです。残りのフィールドはどこですか?可変長の BitField または XBitField を使用できないのはなぜですか?

たとえば、私は持っています:

BitFieldLenField('lenfield', None, 8, length_of='varfield')

これは、長さ 8 を正しく返します (この場合に必要なフィールドは、8 オクテット/4 16 進数のペアです)。これまでのところすべて順調です。ただし、そのフィールドを取得しようとすると、「A\x81\x11\x11P 3」のようなものを返す StrLenField が唯一のオプションのようです

それで、私の質問は次のとおりです。そのフィールドをパケット内の実際の16進数として戻すにはどうすればよいですか? 組み込みフィールドに何か不足していますか、それとも XBitLenField のようなものを作成する必要がありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

3

この答えはScapy2.2.0に関するものです。

LenFieldsは通常、次のようにペアで機能します。

FieldLenField("len", None, length_of="data")
StrLenField("data", "", length_from=lambda pkt:pkt.len)

とが2つのフィールドlength_ofをリンクする方法に注目してください。length_fromこの値は、パケットを送信するときにフィールドlength_ofを計算する方法をScapyに指示します(デフォルト値は、自動的に計算される必要があることを示すために、に注意してください)。この値は、パケット分析するときにフィールドに入力するバイト数をScapyに指示します。"len"Nonelength_from"data"

LenField単独で使用できるという特殊なフィールドがあります。デフォルト値は、None自動的に計算される必要があることを意味していることに再度注意してください。Scapyを送信"len"すると、現在のレイヤーに続くバイト数として単純に計算されます。

LenField("len", None)

長さフィールドが導入されたので、Pythonを使用しての出力をStrLenField16進数にエンコードできます。

# In layer definition
BitFieldLenField("lenfield", None, 8, length_of="varfield")
StrLenField("varfield", "", length_from=lambda pkt:pkt.lenfield)

# In main script
print(pck[mylayer].varfield.encode("hex"))    # Replace "mylayer" with the name of your new layer
于 2012-05-16T15:01:56.200 に答える
2

たとえば、StrLenField のように Fields オブジェクトを書き換えることができます。

# String to hex split by space
def str2hex(string):
    return ' '.join('%02x' % ord(b) for b in string)


class XStrLenField(scapy.fields.StrLenField):

    def i2repr(self, pkt, x):
        return str2hex(scapy.fields.StrLenField.i2m(self, pkt, x))

field_desc[] で XStrLenField を使用できるようになったら:

XStrLenField("rand", "", length_from=lambda x: x.len)
于 2012-07-31T13:07:56.373 に答える