Wirehark 802.15.4 Lua中所有目的地的解剖器

时间:2017-01-25 00:10:52

标签: wireshark zigbee wireshark-dissector

我开始为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包的一部分,数据的第一个字节表示包类型。我没有问题创建一个简单的Lua解剖器来遍历事物并构建一些简单的树,但是我可以告诉我,我必须手动进入GUI并告诉程序解码为" MyProtocol& #34;对于由主15.4设备分配的每个新目标地址。我需要让我的解剖器与所有15.4目的地址混杂。我喜欢说明dissector_add for_decode_as暴露给Lua("Wireshark-commits: [Wireshark-commits] master 016769d: Expose dissector_add_for_decode_as() to Lua"),但是我找不到任何关于如何在Lua中使用15.4的例子。

此外,任何高级架构建议都将受到高度赞赏。我写的简单解剖器似乎无法突出显示底部数据窗格中的特定数据,因此我假设我没有以正确的方式使用Wireshark。

仅供参考我开始使用这个相关的SO注释:Wireshark Lua Dissector for IEEE 802.15.4 - DissectorTable name?

1 个答案:

答案 0 :(得分:1)

NB: 没有真正回答你的问题 ,但提供了一种 不同方式的途径 来解决这个问题。

几年前我遇到了一个非常类似的问题。我们正在构建一个直接使用802.15.4 MAC层的产品,我们需要一个工具来剖析我们的自定义有效负载。

最初我使用了ccsniffpiper(以及我构建它的工具),并在LUA中编写了解剖器,我将其加载到Wireshark中。然而,我发现这个过程缓慢而乏味有很多原因(LUA解析器很棘手,将它们加载到wireshark并不总是直截了当,使用Python总体上更快)。

相反,我开发了一个命令行'包裹pyCCSniffer并在python中提供我自定义解剖的工具!

我快速阅读了pyCCSniffer代码,现在我觉得它有点混乱......但我认为这对你的问题来说非常方便。因此,我将更详细地解释我们如何使用它。

我们有一个自定义' PacketHandler'我们公司的类(例如" ACMEPacketHandler"),类似于pyCCSniffer.py文件中定义的类。我们在主要的'中注册了这个。我们脚本的方法:

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

我希望有所帮助(无论如何,这都是我的两分钱。)