2011-01-30 4 views
0
00000 45 00 02 87 8a 97 40 00 40 06 af d7 7f 00 00 01 [email protected]@....... 
00016 7f 00 00 01 e0 56 00 50 0d 46 70 a8 0c e2 41 70 .....V.P.Fp...Ap 
00032 80 18 01 01 b9 70 00 00 01 01 08 0a 00 64 fa 32 .....p.......d.2 

Wireshark/tcpdump/my code가 덤프 파일에 저장된 TCP 패킷의 일부를 나타내는 방식입니다. 세 번째 줄의 첫 번째 값인 80은 32 바이트의 올바른 TCP 데이터 오프셋 또는 8 개의 32 비트 (4 바이트) 단어입니다.부호없는 포인터에서 int로 4 비트 값 읽기 : TCP 데이터 오프셋 읽기가 손상됨

그러나 (내 코드에서) 구조체 tcp_hdr이이 페이로드 (IP 헤더 오프셋 등 포함)에 생성되면 my_tcphdr->doff의 결과는 6 (24 바이트와 동일)입니다.

구조에서 이러한 데이터를 읽는 것이 어떻게 든 건강에 충분하지 않다고 가정합니다.

(올바른 것으로 알려진) 포인터가 주어진이 4 비트 (0xF0?) 값을 일부 int로 어떻게 읽을 수 있습니까? unsigned char *doff = tcp_payload+MAGIC_16?

답변

3

바이트를 추출하고 오른쪽으로 4 자리 이동합니다.

struct tcp_hdr이 "작동하지 않는 이유"에 따라 게시해야합니다. 아마도 잘못된 엔디안을 사용하고 있거나 구조체가 패딩되어 온 라인 형식과 일치하지 않을 수 있습니다.

관련 문제