我使用Pyshark
它tshark
来解码 pcap 文件,但我在使用 'decode_as' 选项时遇到了问题。我正在尝试将特定的 UDP 端口解码为 SOMEIP 协议。这是我添加的一个解剖器,取自这里。
重要的是,解析器和“decode_as”选项都可以在 Wireshark 中完美运行。
这是我使用的代码:
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 中手动完成时,“解码为”工作正常。
谢谢!
编辑
所以我读到了解析器表,似乎应该没有问题,因为解析器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)
但它没有工作:(
任何想法将不胜感激,谢谢