Lua 中所有目的地的 Wireshark 802.15.4 Dissector
Wireshark 802.15.4 Dissector for all Destinations in Lua
我开始为 IEEE 802.15.4 数据包创建一个 Dissector。我正在使用 TI cc2531 加密狗和 python 脚本 ccsniffpip 将数据导入 Wireshark。到目前为止,我可以将数据包视为原始 802.15.4 数据包就好了。我的问题是使用我的自定义协议剖析有效载荷。似乎 Wireshark 的设计假设 802.15.4 目标地址在端口旨在暗示数据包类型的意义上很重要。对于 15.4,情况通常并非如此。对于 15.4,目的地更类似于 IP 地址。我想解码我看到的每 15.4 个数据包。在我的例子中,我将我的协议隐藏在 15.4 数据包的 "data" 部分中,数据的第一个字节指示数据包类型。我可以毫无问题地创建一个简单的 Lua 解剖器来遍历事物并构建一些简单的树,但据我所知,我必须手动进入 GUI 并告诉程序解码为 "MyProtocol" 对于每个由主 15.4 设备分配的新目标地址。我需要让我的解析器混杂所有 15.4 个目标地址。我喜欢 dissector_add for_decode_as 暴露于 Lua ( "Wireshark-commits: [Wireshark-commits] master 016769d: Expose dissector_add_for_decode_as() to Lua") 的笔记,但我找不到任何关于如何在 [=24= 中使用它的示例] 为 15.4。
此外,我们将不胜感激任何高级架构建议。我编写的简单解析器似乎无法突出显示底部数据窗格中的特定数据,因此我假设我没有以正确的方式使用 Wireshark。
仅供参考,我开始使用这个相关的 SO 注意:Wireshark Lua Dissector for IEEE 802.15.4 - DissectorTable name?
注意:我并没有真正回答你的问题,但提供了一个途径不同的方法解决问题。
几年前我遇到过非常相似的问题。我们正在构建一个直接使用 802.15.4 MAC 层的产品,我们需要一个工具来剖析我们的自定义有效负载。
最初我使用 ccsniffpiper(以及我构建它的工具),并在 LUA 中编写了解析器,我将其加载到 Wireshark 中。然而,我发现这个过程缓慢而乏味,原因有很多(做 LUA 解剖器很棘手,将它们加载到 wireshark 并不总是直截了当的,使用 Python 总体上更快) .
相反,我开发了一个围绕 pyCCSniffer 的 'command line' 工具,并在 python!
中提供了我的自定义剖析
我快速阅读了 pyCCSniffer 代码,现在认为它有点混乱...但我认为它对解决您的问题可能非常方便。因此,我将更详细地解释我们如何使用它。
我们公司有一个自定义 'PacketHandler' class(例如 "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)
然后在我们的 ACMEPacketHandler 的 'handleSniffedPacket' 方法中,我们有这样的东西:
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
希望对您有所帮助(无论如何这是我的两分钱)。
我开始为 IEEE 802.15.4 数据包创建一个 Dissector。我正在使用 TI cc2531 加密狗和 python 脚本 ccsniffpip 将数据导入 Wireshark。到目前为止,我可以将数据包视为原始 802.15.4 数据包就好了。我的问题是使用我的自定义协议剖析有效载荷。似乎 Wireshark 的设计假设 802.15.4 目标地址在端口旨在暗示数据包类型的意义上很重要。对于 15.4,情况通常并非如此。对于 15.4,目的地更类似于 IP 地址。我想解码我看到的每 15.4 个数据包。在我的例子中,我将我的协议隐藏在 15.4 数据包的 "data" 部分中,数据的第一个字节指示数据包类型。我可以毫无问题地创建一个简单的 Lua 解剖器来遍历事物并构建一些简单的树,但据我所知,我必须手动进入 GUI 并告诉程序解码为 "MyProtocol" 对于每个由主 15.4 设备分配的新目标地址。我需要让我的解析器混杂所有 15.4 个目标地址。我喜欢 dissector_add for_decode_as 暴露于 Lua ( "Wireshark-commits: [Wireshark-commits] master 016769d: Expose dissector_add_for_decode_as() to Lua") 的笔记,但我找不到任何关于如何在 [=24= 中使用它的示例] 为 15.4。
此外,我们将不胜感激任何高级架构建议。我编写的简单解析器似乎无法突出显示底部数据窗格中的特定数据,因此我假设我没有以正确的方式使用 Wireshark。
仅供参考,我开始使用这个相关的 SO 注意:Wireshark Lua Dissector for IEEE 802.15.4 - DissectorTable name?
注意:我并没有真正回答你的问题,但提供了一个途径不同的方法解决问题。
几年前我遇到过非常相似的问题。我们正在构建一个直接使用 802.15.4 MAC 层的产品,我们需要一个工具来剖析我们的自定义有效负载。
最初我使用 ccsniffpiper(以及我构建它的工具),并在 LUA 中编写了解析器,我将其加载到 Wireshark 中。然而,我发现这个过程缓慢而乏味,原因有很多(做 LUA 解剖器很棘手,将它们加载到 wireshark 并不总是直截了当的,使用 Python 总体上更快) .
相反,我开发了一个围绕 pyCCSniffer 的 'command line' 工具,并在 python!
中提供了我的自定义剖析我快速阅读了 pyCCSniffer 代码,现在认为它有点混乱...但我认为它对解决您的问题可能非常方便。因此,我将更详细地解释我们如何使用它。
我们公司有一个自定义 'PacketHandler' class(例如 "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)
然后在我们的 ACMEPacketHandler 的 'handleSniffedPacket' 方法中,我们有这样的东西:
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
希望对您有所帮助(无论如何这是我的两分钱)。