2017-01-25 7 views
2

IEEE 802.15.4パケットのディセクタを作成し始めました。 TI cc2531ドングルとpythonスクリプトccsniffpipを使ってWiresharkにデータを取得しています。これまでのところ、私はパケットを生の802.15.4パケットとして見ることができます。私の問題は、カスタムプロトコルでペイロードを分析することです。 Wiresharkは、ポートがパケットタイプが何であるかをヒントすることが意図されているという意味で、802.15.4宛先が重要なアドレスであると仮定して設計されているようです。 15.4の場合はそうではないことがよくあります。 15.4では、宛先はIPアドレスに似ています。私は15.4パケットごとにデコードしたいと思う。私の場合、15.4パケットの "data"セクションの中に自分のプロトコルが隠れていて、パケットタイプを示すデータの最初のバイトがあります。単純なルーアディセクターを作成していくつかのシンプルなツリーを構築するのに問題はありませんが、私が知る限り、私は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")に公開されているのは気に入っていますが、Luaで15.4を使用する方法の例は見つかりません。Wireshark 802.15.4ルアのすべての宛先のディセクタ

また、どのような高水準アーキテクチャの提案も高く評価されます。私が書いた私の単純なディセクタは、下部のデータペインで特定のデータを強調表示できないようですので、Wiresharkを正しい方法で使用していないと仮定します。

FYI私はSOに注意してください関連本を使用して始まった:Wireshark Lua Dissector for IEEE 802.15.4 - DissectorTable name?

答えて

1

NB:は、私は本当にあなたの質問をを答えていないが、解決するために別の方法のための道を提供していますが問題。

私は数年前に非常に似た問題を抱えていました。私たちは802.15.4のMACレイヤを直接使用する製品を構築していました。カスタムペイロードを解読するツールが必要でした。

私はccsniffpiper(と私が作ったツール)を使って、私がWiresharkにロードしたLUAのディセプタを書きました。しかし、このプロセスはいくつかの理由で遅く退屈であることが分かりました(LUAディセクタを扱うのは難しく、wiresharkにロードすることは必ずしも簡単ではなく、Pythonを使用する方が全体的に高速でした)。

代わりに、私はpyCCSnifferを包み込み、私のカスタム解説をPythonで解説した「コマンドライン」ツールを開発しました!

私はpyCCSnifferコードを読んですぐに読んでいましたが、今はちょっと混沌と思っています...しかし、あなたの問題では非常に便利だと思います。そこで私がどのように使ったかをもう少し詳しく説明します。

pyCCSniffer.pyファイルで定義されているようなカスタムの「PacketHandler」クラス(例:「ACMEPacketHandler」)がありました。そして、我々は我々のスクリプトの「メイン」の方法でこれを登録:「ACMEFrameFactoryで

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) 

そして:

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」メソッドでは、我々はこのようなものを持っていました特定の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 

私は助けて(とにかく私の2セントです)。

関連する問題