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
Я надеюсь, что это помогает (это мои два цента в любом случае).