Pyshark - tshark не может использовать плагин пользователя в 'decode_as' - PullRequest
2 голосов
/ 01 апреля 2019

Я использую Pyshark, который использует tshark для декодирования файла pcap, и у меня возникла проблема с использованием опции 'decode_as'.Я пытаюсь декодировать определенный порт UDP как протокол SOMEIP.Это добавленный мной диссектор, взятый из здесь .

Важно сказать, что как в Diskshark, так и в диссекторе и в опции decode_as работают идеально.

Это код, который я использую:

import pyshark

packets=pyshark.FileCapture(pcap_path, display_filter="udp")
packets.next() # Works fine

packets=pyshark.FileCapture(pcap_path, display_filter="udp", decode_as={"udp.port==50000":"someip"})
packets.next() # doesn't return a packet

Существует также игнорируемое исключение:

Exception ignored in: <function Capture.__del__ at 0x000001D9CE035268>
Traceback (most recent call last):
  File "C:\Users\SHIRM\AppData\Local\Continuum\anaconda3\lib\site-packages\pyshark\capture\capture.py", line 412, in __del__
    self.close()
  File "C:\Users\SHIRM\AppData\Local\Continuum\anaconda3\lib\site-packages\pyshark\capture\capture.py", line 403, in close
    self.eventloop.run_until_complete(self._close_async())
  File "C:\Users\SHIRM\AppData\Local\Continuum\anaconda3\lib\asyncio\base_events.py", line 573, in run_until_complete
    return future.result()
  File "C:\Users\SHIRM\AppData\Local\Continuum\anaconda3\lib\site-packages\pyshark\capture\capture.py", line 407, in _close_async
    await self._cleanup_subprocess(process)
  File "C:\Users\SHIRM\AppData\Local\Continuum\anaconda3\lib\site-packages\pyshark\capture\capture.py", line 400, in _cleanup_subprocess
    % process.returncode)
pyshark.capture.capture.TSharkCrashException: TShark seems to have crashed (retcode: 1). Try rerunning in debug mode [ capture_obj.set_debug() ] or try updating tshark.

Поскольку он рекомендует использовать режим отладки (packets.set_debug())и после его запуска я получаю:

tshark: Protocol "someip" isn't valid for layer type "udp.port"
tshark: Valid protocols for layer type "udp.port" are:
....

и затем длинный список протоколов, которых «someip» не находится в ... (но другой диссектор, который я добавил, и это dll, есть)

Есть идеи, что здесь не так?Причиной проблем является диссектор, или я что-то не так сделал?

Опять же - «декодировать как» работает отлично, когда выполняется вручную в Wireshark.enter image description here

Спасибо!


РЕДАКТИРОВАТЬ

Я нашел часть в коде Wireshark, которая вызывает эту ошибку: enter image description here

Итак, я читал о таблицах диссектора, и, похоже, проблем не должно быть, поскольку код lua для диссектора действительно добавляет "someip" в таблицу диссектора"udp.port":

    local udp_dissector_table = DissectorTable.get("udp.port")
    -- Register dissector to multiple ports
    for i,port in ipairs{30490,30491,30501,30502,30503,30504} do
        udp_dissector_table:add(port,p_someip)
        tcp_dissector_table:add(port,p_someip)
    end

Я также пытался использовать функцию dissectortable:add_for_decode_as(proto) (описанную в 11.6.2.11 здесь ):

    udp_dissector_table:add_for_decode_as(p_someip)

Ноэто не сработало :(

Любая идея будет оценена, спасибо

...