2010-12-18 7 views
1

libpcap을 사용하여 http 패킷에 대한 스니퍼를 쓰고 있습니다. 때로는 http 페이로드의 내용을 인쇄 할 때 이상한 문자가 나타납니다. 무엇이 될 수 있는지 알고 있습니까?패킷에 이상한 문자가 있습니다.

* xNT : 3 P 번호의 1u`의 $ % s에 "@ {M

또는

~ TSE}>를 } /`▒Ay는

감사, 대한 대답.

헤더는 일반 텍스트 인 경우

문제는 내 코드 그래서.

어쨌든, 할 수있는 POST 요청은 base64로 코딩 되나요?

+0

트래픽은 http/ssl 트래픽입니까? –

+0

순수한 http, no ssl – cenos

답변

1

이것은 디스플레이 글꼴에 문자가없는 바이너리 데이터 일 가능성이 높습니다. HTTP는 반드시 텍스트를 전송할 필요는 없으며 클라이언트가 요청한 이미지 또는 기타 원시 바이너리 형식 일 수 있습니다. TCP 패키지의 나머지 부분을 보지 않고 말하기가 어렵습니다.

+0

아 좋아. 어쨌든, 모든 HTTP 헤더는 항상 일반 텍스트입니까? 또는 어떤 방법으로 인코딩 될 수 있습니까? thx – cenos

+0

HTTP 헤더는 절대적으로 항상 ASCII 인코딩의 일반 텍스트입니다. –

+2

그런데 바이너리 데이터는 이미지 또는 무언가 일 수도 있지만 gzip과 같은 전송 인코딩이있는 텍스트 일 ​​수도 있습니다. –

1

HTTP headerContent-Type은 페이로드 유형을 알려줍니다. HTTP 헤더는 또한 압축이 사용되는지 여부를 말해야합니다.

http://web-sniffer.net/로 얻거나 utils_http.c에서 Wireshark를

+0

예. wireshark를 사용하고 있었는데, 문제는 아마도 내 코드에 있습니다. (하지만 매우 이상합니다. – cenos

2

같은 것을 사용하는 것을 비교하면 다음과 같은 기능을 가지고 :

이것은 TCP 페이로드는 항상 시작 후 20 바이트를 시작한다는 가정을하고있다
static int handle_tcp(const struct tcphdr *tcp, int len) 
{ 
    char buf[PCAP_SNAPLEN]; 
    memcpy(buf, tcp + 1, len - sizeof(*tcp)); 
    DEBUG("DANY TCPDs tcp string: %s",buf); 
    if (0 == handle_http(buf, len - sizeof(*tcp))) 
    return 0; 
    return 1; 
} 

TCP 헤더 (항상 20이므로 sizeof(*tcp) == 20). 이것은 어떤 TCP 옵션도 고려하지 않습니다. 매우 일반적인 TCP 옵션을 사용하여 패킷을 수신하는 경우 handle_http()은 버퍼의 시작 부분에 바이너리 인코딩 된 TCP 옵션을 표시합니다. 이는 사용자가보고있는 것일 수 있습니다. 대신이 같은

시도 뭔가 :

static int handle_tcp(const struct tcphdr *tcp, int len) 
{ 
    char buf[PCAP_SNAPLEN]; 
    memcpy(buf, (void*)tcp + tcp->doff*4, len - tcp->doff*4); 
    DEBUG("DANY TCPDs tcp string: %s",buf); 
    if (0 == handle_http(buf, len - tcp->doff*4)) 
    return 0; 
    return 1; 
} 

또는 더 나은 아직, 난 당신이 지속적으로 버퍼의 사본 수십 당신은 기회가있을 때마다 제작하는 이유를 모르겠어요. 뭔가 빠뜨리지 않으면 포인터를 넘길 수 있습니다.

static int handle_tcp(const struct tcphdr *tcp, int len) { 
    return handle_http((void*)tcp + tcp->doff*4, len - tcp->doff*4); 
} 
관련 문제