Scapy - добавить поле с типом, зависящим от другого поля - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь добавить поле в пакет с типом, который зависит от другого значения поля. Одним из этих «типов» является строка переменной длины, с дополнительным атрибутом «len», если это применимо.

Рассмотрим следующий пример:

from scapy.all import *


class TestPacket(Packet):
        fields_desc=[ 
                  ShortField("index", 0),
                  ByteEnumField("type", 0 , { 1: "String", 2: "Integer" }),
                  ConditionalField(FieldLenField("len", None, length_of="data"), lambda x: x.type==1),
                  ConditionalField(StrLenField("data", "", length_from=lambda pkt:pkt.len), lambda x: x.type==7 or x.type==11),
                  ConditionalField(IntField("data", 1), lambda pkt: pkt.type==2)]


p = TestPacket(index=12, type=1, data="My Sample String")
p.show2()

p = TestPacket(index=13, type=2, data=5)
p.show2()

Проблема в том, что «len» всегда установлен в 4 (длина IntField, так как это последнее условное поле «data»).

Каков наилучший способ для достижения этой функциональности? Условные поля с разными именами? Хранение необработанных байтов в виде строки переменной длины, независимо от типа?

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете использовать MultipleTypeField. См. https://scapy.readthedocs.io/en/latest/api/scapy.fields.html#scapy .fields.MultipleTypeField

Например:

class DebugPacket(Packet):
    fields_desc = [
        ByteEnumField("atyp", 0x1, {0x1: "IPv4", 0x3: "DNS", 0x4: "IPv6"}),
        MultipleTypeField(
            [
                # IPv4
                (IPField("addr", "0.0.0.0"), lambda pkt: pkt.atyp == 0x1),
                # DNS
                (DNSStrField("addr", ""), lambda pkt: pkt.atyp == 0x3),
                # IPv6
                (IP6Field("addr", "::"), lambda pkt: pkt.atyp == 0x4),
            ],
            StrField("addr", "")  # By default
        ),
    ]

Это позволяет вам иметь одно и то же поле, имеющее несколько типов в зависимости от условия

...