Длина PacketListField в повторяющихся порциях - PullRequest
0 голосов
/ 31 октября 2018

как мой первый крупный проект, включающий библиотеку 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' |>>

Не могли бы вы дать мне подсказку, как обращаться с длиной фрагмента, чтобы все фрагменты читались и анализировались?

Спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

Вот несколько советов

  • Не указывайте функции length_from и count_from, если вы их не используете.
  • То, что вы делаете в HEP3Chunk - это хорошо, вы даже получили extract_padding право, которое все забывают
  • для HEP3, вы можете установить length_from=lambda pkt: pkt.total_length-6 (я не считаю комментируемое поле)
...