2012-09-27 2 views
0

나는 http 요청과 응답을 모니터링하기 위해 pcap을 사용하고 있습니다. pcap_loop을 설정하고 콜백 함수에서 패킷을 가져 오지만 패킷 내용을 읽는 방법을 모르겠습니다. 이libpcap으로 패킷 데이터 읽기

200 \ 궁금 해서요 (205)

300 \ \ 내가 어떻게 할 수 후

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) 
{ 
    printf("%s\n", packet); 
} 

이 출력은 항상 좋아 a를 backslashe의 시리즈와 세 개의 숫자를 찾습니다 이 내 콜백 함수입니다 콘텐츠를 읽을 수 있도록 HTTP 요청 및 응답을 찾고 처리 할 수 ​​있습니까?

UPDATE :

내 목표는이 작업을 수행 할 수있는 적절하고 깔끔한 방법이 HTTP 요청과 응답을 읽을 수있다?

답변

4

출력이 ASCII 문자열이 아닌 원시 2 진 데이터이므로 printf는 처음 0 바이트까지만 출력합니다.

for (int i = 0; i < header->caplen; ++i) { 
    if (isascii(packet[i])) { 
     putchar(packet[i]); 
    } else { 
     putchar('.'); 
    } 
+0

고맙습니다.하지만 HTTP 콘텐츠를 분리 할 방법을 찾고 있습니다. –

2

는 libpcap의 모든 헤더를 포함, 당신에게 원시 패킷을 줄 것입니다 : 패킷에 읽기 가능한 모든 물건을 인쇄하려면, 같은 것을 사용합니다. 필요한 데이터를 추출해야 할 것입니다. 패킷을 나타내는 표준 구조체로 변환하여 전달하는 것이 좋습니다. 예 :

/* Start with the ether header */ 
ethernet = (struct ether_header *) packet; 

/* Do a couple of checks to see what packet type we have */ 
if (ntohs (ethernet->ether_type) == ETHERTYPE_IP) 
{ 
      // Cast it to an IP packet struct 
    ip_hdr = (struct ip*)(packet + sizeof(struct ether_header)); 

    //If TCP... 
    if(ip_hdr->ip_p == 6) 
    { 
       packet_info.tcp_hdr = *(struct tcphdr*)((char*)ip_hdr + sizeof(struct ip)); 
       // Work on extracting the actual data for HTTP stuff over here 
+0

시도했지만 작동하지 않았다. –