2010-05-06 1 views
0

가능한 중복 : 나는 들어오는 모든 패킷을 얻을 수 this article을 바탕으로 winpcap을 사용하여 HTTP 패킷의 uri를 얻으려면 어떻게해야합니까?


How to hijack all local http request and extract the url using c?

.

/* Callback function invoked by libpcap for every incoming packet */ 
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) 
{ 
    struct tm *ltime; 
    char timestr[16]; 
    ip_header *ih; 
    udp_header *uh; 
    u_int ip_len; 
    u_short sport,dport; 
    time_t local_tv_sec; 

    /* convert the timestamp to readable format */ 
    local_tv_sec = header->ts.tv_sec; 
    ltime=localtime(&local_tv_sec); 
    strftime(timestr, sizeof timestr, "%H:%M:%S", ltime); 

    /* print timestamp and length of the packet */ 
    printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len); 

    /* retireve the position of the ip header */ 
    ih = (ip_header *) (pkt_data + 
     14); //length of ethernet header 

    /* retireve the position of the udp header */ 
    ip_len = (ih->ver_ihl & 0xf) * 4; 
    uh = (udp_header *) ((u_char*)ih + ip_len); 

    /* convert from network byte order to host byte order */ 
    sport = ntohs(uh->sport); 
    dport = ntohs(uh->dport); 

    /* print ip addresses and udp ports */ 
    printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n", 
     ih->saddr.byte1, 
     ih->saddr.byte2, 
     ih->saddr.byte3, 
     ih->saddr.byte4, 
     sport, 
     ih->daddr.byte1, 
     ih->daddr.byte2, 
     ih->daddr.byte3, 
     ih->daddr.byte4, 
     dport); 
} 

하지만 어떻게 packet_handler에서 URI 정보를 추출합니까?

+0

내 대답보기 [여기] (http://stackoverflow.com/questions/2703238/how-to-hijack-all-local-http-request-and-extract-the-url-using-c/2768724# 2768724). – brickner

답변

0

모든 패킷에 URI가있는 것은 아닙니다.

http 요청에서 URI는 연결 시작 부분에 매우 가까이 전송되지만 후속 패킷은 더 큰 요청의 조각 일뿐입니다.

요청되는 URI (및 모든 데이터)를 찾으려면 pkt_data을 찾으십시오.

+0

@ abelenky,'pkt_data'를 어떻게 볼 수 있습니까? – Gtker

+0

pkt_data의 유형은 "const u_char *"입니다. 서명되지 않은 문자 배열을 검사하는 방법을 알고 있다고 가정해야합니다. 그 밖의 것이 없다면 printf를 시도하십시오. – abelenky

+0

시도해보십시오, 아니 ... – Gtker

1

당신은 최선의 예를 따르고 있지 않습니다. 게시 한 URL은 UDP 패킷을 처리하지만 HTTP는 TCP를 기반으로합니다.

+0

더 나은 예를 찾으십니까? – Gtker

+0

@klatchko가 지적 하듯이이 코드는 UDP 패킷을 처리하며 TCP를 통해 전달되는 HTTP를 쉽게 선택하지 않습니다. – abelenky

0

일반적으로 URI는 첫 번째 발신 TCP 패킷의 첫 번째 줄에 두 번째 단어가됩니다 (단어는 공백으로 구분되고 CR LF로 구분 된 줄로 정의됩니다) .

wireshark은 libpcap을 기반으로하며 오픈 소스이며이 기능을 잘 수행합니다.