как мой первый крупный проект, включающий библиотеку Scapy, я пытаюсь реализовать диссектор протокола HEP3 / EEP3 ( specs ). Я борюсь с пониманием того, как я могу разбить куски (их может быть много в одном пакете HEP3). Я получил из документов и поисков Google, что для этого мне нужно использовать PacketListField, но я не понимаю, как получить длину чанков, чтобы scapy анализировал все чанки. Вот мой код, который у меня есть:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import scapy.all as sa
HEP_CHUNK_HEADER = 6
class HEP3Chunk(sa.Packet):
name = "HEP3Chunk"
fields_desc = [
sa.ShortField("chunk_vendor_id", 0),
sa.ShortField("chunk_type_id", 0),
sa.ShortField("chunk_length", 0),
sa.StrLenField("chunk_val", None, length_from=lambda pkt: pkt.chunk1_length - HEP_CHUNK_HEADER),
]
def extract_padding(self, s):
return "", s
class HEP3(sa.Packet):
name = "HEP3"
fields_desc = [
sa.StrFixedLenField("hep_proto_id", "HEP3", 4),
sa.ShortField("total_length", 0),
#sa.FieldLenField("flf", None, length_of="hep_chunk"),
sa.PacketListField("chunks", None, HEP3Chunk, count_from=lambda pkt: None, length_from=lambda pkt: None),
]
Результаты (с жестко закодированной длиной 7 байт) до сих пор:
<HEP3 hep_proto_id='HEP3' total_length=642 chunks=[<Raw load='\x00\x00\x00\x01\x00\x07\x02' |>] |<Raw load='\x00\x00\x00\x02\x00\x07\x11\x00\x00\x00\x07\x00\x08\x13\xc4\x00\x00\x00\x08\x00\x08\x13\xc4\x00\x00\x00\t\x00\n[\xd9\x97<\x00\x00\x00\n\x00\n\x00\x04\xc2\xc0\x00\x00\x00\x0b\x00\x07\x01\x00\x00\x00\x0c\x00\n\x00\x00\x04\xd2\x00\x00\x00\x03\x00\n\n\x02\x03\x0e\x00\x00\x00\x04\x00\n\n\x02\x00\xe8\x00\x00\x00\x0e\x00\tfoo\x00\x00\x00\x11\x00\x100-MhCMehI0\x00\x00\x00\x0f\x02\x0cREGISTER sip:10.2.0.232 SIP/2.0\r\nVia: SIP/2.0/UDP 10.2.3.14:5060;branch=z9hG4bK.ALC1d3n1M;rport\r\nFrom: <sip:3000@10.2.0.232>;tag=b92HFYQZe\r\nTo: sip:3000@10.2.0.232\r\nCSeq: 20 REGISTER\r\nCall-ID: 0-MhCMehI0\r\nMax-Forwards: 70\r\nSupported: replaces, outbound\r\nAccept: application/sdp\r\nAccept: text/plain\r\nAccept: application/vnd.gsma.rcs-ft-http+xml\r\nContact: <sip:3000@10.2.3.14;transport=udp>;+sip.instance="<urn:uuid:fddeaf99-e306-4b6f-b8dc-c779ac8988ac>"\r\nExpires: 3600\r\nUser-Agent: Linphone/3.12.0 (belle-sip/1.6.3)\r\n\r\n' |>>
Не могли бы вы дать мне подсказку, как обращаться с длиной фрагмента, чтобы все фрагменты читались и анализировались?
Спасибо.