일부 프로토콜의 페이로드에 들어있는 데이터에 대해 루아 디시 터를 작성하려고합니다. 각 패킷에는 일부 직렬 데이터가 들어 있습니다. 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_SEGMENT
desegment_offset = 0
을 설정합니다 (I 이후 얼마나 많은 데이터가 남아 있는지 알 수 없음) nil
으로 돌아가서 aga 다음 패킷에
- 중간에 발견하는 경우 :
- 가 줄 바꿈의 오프셋 (offset)에
desegment_offset
을 설정, 그래서 다음 패킷 꼬리 데이터를 얻을 수 있습니다 - 설정
desegment_len = DESEGMENT_ONE_MORE_SEGMENT
(내가 알고하지 않기 때문에 데이터 양 - 가 마지막에 발견되면, 티 메틱 혼자 PARAMS 떠나 계속할
- 가 줄 바꿈의 오프셋 (offset)에
- 을 반환하지 않습니다) 왼쪽입니다 - 전체 라인이 나타나서 한 줄입니다 - 우리는, 오프셋 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
과 같은 경우에는 위의 방법이 작동하지 않는다는 것을 알고 있지만,이 질문에 대해 이렇게 배치하는 것이 더 간단하다고 생각합니다.