Scapy-图层的长度字段 [英] Scapy - layer's length field

查看:364
本文介绍了Scapy-图层的长度字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Scapy构建PTPv2协议. 该协议中的消息类型很少,因此我使用ConditionalField来描述不同的字段选项:

I'm trying to build PTPv2 protocol using Scapy. There are few message types in this protocol, so I use ConditionalField to describe the different fields options:

class PTPv2(Packet):
    name = "Precision Time Protocol V2"
    fields_desc = [
        # Header
        BitField('transportSpecific', 1, 4),
        BitEnumField('messageType', 0, 4, Message_Types),
        ByteField('versionPTP', 2),
        LenField('messageLength', None),
        ByteField('subdomainNumber', 0),
        ByteField('empty1', 0),
        XShortField('flags', 0),
        LongField('correction', 0),
        IntField('empty2', 0),
        XLongField('ClockIdentity', 0),
        XShortField('SourcePortId', 0),
        XShortField('sequenceId', 0),
        ByteField('control', 0),
        SignedByteField('logMessagePeriod', 0),

    # SYNC message, messageType=0
        ConditionalField(XBitField('TimestampSec', 0, 48),lambda pkt: pkt.messageType==0),
        ConditionalField(IntField('TimestampNanoSec', 0), lambda pkt: pkt.messageType == 0),

    # Follow up message, messageType=8
        ConditionalField(XBitField('preciseOriginTimestampSec', 0, 48), lambda pkt: pkt.messageType == 8),
        ConditionalField(IntField('preciseOriginTimestampNanoSec', 0), lambda pkt: pkt.messageType == 8)

     # Path delay resp follow up message, messageType=0xA
        ConditionalField(XBitField('responseOriginTimestampSec', 0, 48), lambda pkt: pkt.messageType == 0xA),
        ConditionalField(IntField('responseOriginTimestampNanoSec', 0), lambda pkt: pkt.messageType == 0xA),
        ConditionalField(XLongField('requestingSourcePortIdentity', 0), lambda pkt: pkt.messageType == 0xA),
        ConditionalField(XShortField('requestingSourcePortId', 0), lambda pkt: pkt.messageType == 0xA)

现在,我希望messageLength字段描述图层的长度,并根据现有字段自动进行计算. 它应该描述PTPv2层中所有字段的长度,从第一个(transportSpecific)开始.

Now, I want the messageLength field to describe the layer's length, and be calculated automatically, depending on the existing fields. It should describe the length of all fields in the PTPv2 layer, starting from the first one (transportSpecific).

我读到了关于PacketLenFieldFieldLenField的信息,但似乎它们都描述了一个字段的长度,而不是一组字段的长度(据我所知).

I read about PacketLenField and FieldLenField, but it seems they both describe the length of one field, not a group of fields (as far as I understand).

我还读过LenField(在代码中写为类型),但是它计算的是下一层的长度,而不是当前层的长度(因此,在这种情况下始终为0).

I also read about LenField (which is written as the type in the code), but it calculates the length of the next layers, not the current one (so in this case always gives 0).

任何想法我该如何解决?

Any idea how can I solve this?

谢谢!

推荐答案

这通常使用post_build回调在scapy中完成,因此:(您需要将其添加到数据包中)

This is usually done in scapy using the post_build callback, as so: (you need to add it to your packet)

(取自inet6.py)

(Taken from inet6.py)

def post_build(self, p, pay):
    # p += pay  # if you also want the payload to be taken into account
    if self.messageLength is None:
        tmp_len = len(p) # edit as you want
        p = p[:2] + struct.pack("!H", tmp_len) + p[4:]  # Adds length as short on bytes 3-4
    return p + pay # edit if previous is changed

然后可以相应地使用ByteField/ShortField ...代替LenField.

You can then use a ByteField/ShortField... accordingly instead of the LenField.

PacketLenField是当您使用PacketListFieldFieldLenField是用于FieldListField

PacketLenField is when you use a PacketListField and FieldLenField is for FieldListField

这篇关于Scapy-图层的长度字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆