2017-01-25 22 views
2

의 모든 목적지에 대한 I는 IEEE 802.15.4 패킷에 대한 해부학자를 만들기 시작하고 있습니다. TI cc2531 동글과 파이썬 스크립트 ccsniffpip을 사용하여 Wireshark에 데이터를 가져 왔습니다. 지금까지는 패킷이 원시 802.15.4 패킷으로 잘 보일 정도로 좋았습니다. 내 문제는 내 사용자 지정 프로토콜을 사용하여 페이로드를 해부하는 것입니다. Wireshark는 포트가 패킷 유형이 무엇인지를 암시하기 위해 802.15.4 대상이 중요하다는 가정하에 설계되었습니다. 15.4에서는 종종 그렇지 않습니다. 15.4의 경우 대상은 IP 주소와 유사합니다. 15.4 패킷을 모두 디코드하고 싶습니다. 제 경우에는 패킷 유형을 나타내는 데이터의 첫 번째 바이트가있는 15.4 패킷의 "데이터"섹션 안에 숨어있는 프로토콜이 있습니다. 나는 간단한 루아 디시 터를 만들어 문제를 해결하고 간단한 나무를 만들지 만, 내가 말할 수있는 것처럼, 나는 GUI로 직접 들어가서 각각에 대해 "MyProtocol"로 디코드하도록 프로그램에 지시해야한다. 마스터 15.4 장치에 의해 할당되는 새로운 목적지 주소. 내 dissector 15.4 모든 대상 주소에 난잡하게 만들기 위해 내 필요. 나는 dissector_add for_decode_as이 루아 ("Wireshark-commits: [Wireshark-commits] master 016769d: Expose dissector_add_for_decode_as() to Lua")에 노출 좋아 메모를했습니다,하지만 난 15.4 루아에서 사용하는 방법에 대한 예제를 찾을 수 없습니다.와이어 샤크 802.15.4 해부학자 루아

은 또한 어떤 높은 수준의 아키텍처 제안을 주시면 감사하겠습니다. 필자가 작성한 간단한 해부학자는 하단 데이터 창에서 특정 데이터를 강조 표시하지 못하는 것 같아서 Wireshark를 올바른 방식으로 사용하지 않는다고 가정합니다.

는 참고로 나는이주의 SO 관련하여 시작되었다 : Wireshark Lua Dissector for IEEE 802.15.4 - DissectorTable name?

답변

1

NB : 내가 정말를 해결하기 위해 다른 방법으로에 대한 길을 질문 대답하지만, 제공하지 않는 발행물.

나는 몇 년 전 매우 비슷한 문제가 있었다. 우리는 802.15.4 MAC 레이어를 직접 사용하는 제품을 개발 중이었고 사용자 정의 페이로드를 분석하는 도구가 필요했습니다.

원래 나는 ccsniffpiper을 사용 (및 도구 난에서 그것을 내장), 나는 와이어 샤크에로드 LUA에 dissectors을 썼다. 그러나이 과정은 여러 가지 이유로 느리고 지루하다는 것을 알았습니다. LUA 디시터를 사용하는 것이 까다 롭고 wireshark에로드하는 것이 항상 간단하지 않았으며 Python을 사용하는 것이 더 빠릅니다.

대신, 주변 pyCCSniffer 포장 및 파이썬에서 내 사용자 지정 해부를 제공 '명령 줄'도구를 개발!

나는 코드 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) 

그리고 : 우리 ACMEPacketHandler의'handleSniffedPacket '방법 그리고

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) 

우리는 이런 일이 있었다 우리는 특정 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 

나는 그것이 (내 두 센트 어쨌든) 도움이되기를 바랍니다.