我开始为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?
答案 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
我希望有所帮助(无论如何,这都是我的两分钱。)