2016-07-28 3 views
2

일부 프로토콜의 페이로드에 들어있는 데이터에 대해 루아 디시 터를 작성하려고합니다. 각 패킷에는 일부 직렬 데이터가 들어 있습니다. CR- 구분 (0x0D/\r) 패킷으로 처리해야하지만 프로토콜 패킷과 반드시 ​​일치하지는 않습니다.Wireshark 루아 해부학자 재조합 - 이전 Tvb의 데이터와 함께 호출기가 호출되지 않음

파싱 할 데이터가 충분하지 않다는보고를하면, 해부 함수가 지난 시간의 왼쪽 데이터에서 호출되지 않는 문제가 있습니다. 예를 들어

는 I가 다음 프로토콜 패킷을 말한다 : 01 02 03 0D (최초 패킷) 11 12 13 21 22 23 24 0D (패킷 2, 패킷 3)

1: 01 02 03 0D 
2: 11 12 13 
3: 21 22 23 24 0D 

그럼 I 두 dissectable 서열을 갖는다.

이에 대한 나의 전략이다 : 찾을 수없는 경우

  • \r의 오프셋 (offset)를 찾고, 각 패킷하지만

    • 일 :
      • 설정 desegment_len = DESEGMENT_ONE_MORE_SEGMENTdesegment_offset = 0을 설정합니다 (I 이후 얼마나 많은 데이터가 남아 있는지 알 수 없음)
      • nil으로 돌아가서 aga 다음 패킷에
    • 중간에 발견하는 경우 :
      • 가 줄 바꿈의 오프셋 (offset)에 desegment_offset을 설정, 그래서 다음 패킷 꼬리 데이터를 얻을 수 있습니다
      • 설정 desegment_len = DESEGMENT_ONE_MORE_SEGMENT (내가 알고하지 않기 때문에 데이터 양
      • 가 마지막에 발견되면, 티 메틱 혼자 PARAMS 떠나 계속할
    • 을 반환하지 않습니다) 왼쪽입니다 - 전체 라인이 나타나서 한 줄입니다 - 우리는, 오프셋 0에서, 버퍼가 데이터의 전체 라인 반환하지 못한 경우에는

    예 분석 : 전술 한 예에서

    function myproto.dissector(tvbuf, pinfo, treeitem) 
    
        original_dissector:call(tvbuf, pinfo, treeitem) 
    
        local endOffset = 0 
    
        -- find out if we have any complete chunks 
        while endOffset < tvbuf:len() do 
    
         if tvbuf(endOffset, 1):uint() == 0x0D then 
          break 
         end 
    
         endOffset = endOffset + 1 
        end 
    
        -- didn't find a complete line in the payload 
        -- ask for more 
        if endOffset == tvbuf:len() then 
         pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT 
         pinfo.desegment_offset = 0 
         print(' Incomplete, ask for more') 
         return 
        end 
    
        -- have more than needed so set offset for next dissection 
        if tvbuf:len() - 1 > endOffset then 
         pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT 
         pinfo.desegment_offset = offset 
         print(' Too much, leave some for later') 
        end 
    
        print("Whole line dissector:", tvbuf:len()) 
    end 
    

    을 (페이로드 (4)를 길이 , 3, 5), 나는 이전 패킷의 왼쪽 데이터를 포함하는 마지막 호출과 함께 실제로 4, 3, 8을 예상했을 때 tvbuf 길이가 4, 3, 5 인이 절체기를 얻습니다.

    두 번째 패킷의 "incomplete, return"브랜치에 충돌하지만 세 번째 패킷은 절대로 변경되지 않습니다.

    이런 일이 일어나지 않습니다. 내가 뭘 잘못하고있는 걸까요?

    사이드 노트 : 한 줄에 복수 \r과 같은 경우에는 위의 방법이 작동하지 않는다는 것을 알고 있지만,이 질문에 대해 이렇게 배치하는 것이 더 간단하다고 생각합니다.

  • 답변

    2

    desegment_offsetdesegment_length을 통한 재구성 기능은 상위 프로토콜에 따라 다릅니다. 나는 당신의 직렬 프로토콜이 USB를 통해 실행되고 USB 프로토콜이 USB가 정상적으로 패킷/메시지 기반이기 때문에 리 어셈블리를 구현하지 않는다고 생각한다.

    Wireshark는 리 어셈블리 API를 루아 디 시커 (아직 현재 개발 버전 v2.3.0rc0에 적용 가능)에 노출시키지 않으므로 사용자의 경우 Reassembly API를 사용하지 마십시오. 루아를 사용하면 유감스럽게도 이전 데이터를 직접 추적 할 수있는 해부학자를위한 변수를 만들어야합니다.