Wireshark 802.15.4 Dissector для всех направлений в Луа

Я начинаю создавать Dissector для пакета IEEE 802.15.4. Я использую ключ TI cc2531 и сценарий python ccsniffpip для получения данных в Wireshark. Пока все хорошо, что я могу видеть пакеты как необработанные пакеты 802.15.4 просто отлично. Моя проблема заключается в том, чтобы проанализировать полезную нагрузку с помощью моего пользовательского протокола. Кажется, что Wireshark спроектирован исходя из того, что адреса назначения 802.15.4 значимы в том смысле, что порты предназначены для намека на тип пакета. Для 15,4 это часто просто не так. Для 15.4 назначение больше похоже на IP-адрес. Я хочу декодировать каждый пакет 15,4, который я вижу. В моем случае мой протокол скрыт в разделе "данные" из 15,4 пакетов, причем первый байт данных указывает тип пакета. У меня нет проблем с созданием простого диссектора Lua, который бы разбирался с вещами и строил некоторые простые деревья, но, насколько я могу судить, я должен вручную войти в GUI и сказать программе "Декодировать как"MyProtocol"для каждого новый адрес назначения, который назначается главным устройством 15.4. Мне нужно, чтобы мой разборщик был разнородным по всем 15.4 адресам назначения. Мне нравятся заметки, в которых Дистрибьютор for_decode_as был выставлен на Lua ( "Wireshark-commits: [Wireshark-commits] master 016769d: Позволяет распространять распространяющее_дистектор_add_for_decode_as() для Lua"), но я не могу найти примеров того, как использовать его в Lua для 15.4.

Также будут приветствоваться любые предложения архитектуры высокого уровня. Мой простой диссектор, который я написал, кажется, не в состоянии выделить конкретные данные в нижней области данных, поэтому я предполагаю, что я не использую Wireshark правильным образом.

К вашему сведению, я начал использовать эту связанную заметку SO: Wireshark Lua Dissector для IEEE 802.15.4 - Имя DissectorTable?

1 ответ

Решение

NB: Я на самом деле не отвечаю на ваш вопрос, но предоставляю альтернативный способ решения проблемы.

У меня была очень похожая проблема несколько лет назад. Мы создавали продукт, который напрямую использовал MAC-уровень 802.15.4, и нам требовался инструмент для анализа наших пользовательских данных.

Первоначально я использовал ccsniffpiper (и инструменты, из которых я его построил) и писал диссекторы в LUA, которые я загружал в Wireshark. Тем не менее, я обнаружил, что этот процесс был медленным и утомительным по ряду причин (работа с диссекторами LUA была сложной, загрузка их в wireshark не всегда была простой, а использование Python в целом было быстрее).

Вместо этого я разработал инструмент "командной строки", который обернулся вокруг pyCCSniffer и предоставил мой собственный анализ в python!

Я быстро прочитал код pyCCSniffer и теперь думаю, что это немного хаотично... но я думаю, что это может быть весьма полезно для вашей проблемы. Таким образом, я объясню, как мы использовали это немного подробнее.

У нас был собственный класс 'PacketHandler' для нашей компании (например, "ACMEPacketHandler"), подобный тому, который определен в файле pyCCSniffer.py. И мы зарегистрировали это в методе 'main' нашего скрипта:

def main():
    packetHandler = ACMEPacketHandler()
    packetHandler.enable()

    # Create a list of handlers to dispatch to
    # NB: handlers must have a "handleSniffedPacket" method
    handlers = [packetHandler]
    def handlerDispatcher(timestamp, macPDU):
        if len(macPDU) > 0:
            packet = SniffedPacket(macPDU, timestamp)
            for handler in handlers:
                handler.handleSniffedPacket(packet)

    snifferDev = CC2531EMK(handlerDispatcher, args.channel)

Затем в методе handleSniffedPacket нашего ACMEPacketHandler у нас было что-то вроде этого:

class ACMEPacketHandler:
    ...
    def handleSniffedPacket(self, sniffedPacket):
        ...check errors etc...

        # parse as 802.15.4 frame
        frame = ieee.IEEE15dot4FrameFactory.parse(sniffedPacket)

        # parse contents of frames to our custom representation
        our_frame = ACMEFrameFactory.parse(frame)

        print(our_frame)

И затем в ACMEFrameFactory у нас была логика для анализа необходимой нам информации из конкретных кадров 802.15.4:

class ACMEFrameFactory(object):
    @staticmethod
    def parse(ieee15dot4Frame):

        if noe ieee15dot4Frame.fcf.frametype is ieee.FrameType.DATA:
            return ieee15dot4Frame # we only use payloads in DATA frames
        byteStream = ieee15dot4Frame.msdu

        offset = 0
        fmt = "<B"
        (packet_type,) = ieee.checkAndUnpack(fmt, byteStream, offset, (0, 0))

        if packet_type == 1:
            return WilyCoyotePlotFrame(...)
        if packet_type == 2:
            return RoadRunnerMeepMeepFrame(...)

        # unknown packet_type
        return ieee15dot4Frame

Я надеюсь, что это помогает (это мои два цента в любом случае).

Другие вопросы по тегам