Scapy-图层的长度字段 [英] Scapy - layer's length field
问题描述
我正在尝试使用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
).
我读到了关于PacketLenField
和FieldLenField
的信息,但似乎它们都描述了一个字段的长度,而不是一组字段的长度(据我所知).
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
是当您使用PacketListField
而FieldLenField
是用于FieldListField
PacketLenField
is when you use a PacketListField
and FieldLenField
is for FieldListField
这篇关于Scapy-图层的长度字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!