2011-07-27 5 views
1

私は、ポート80上のデータを分析するために使用される次のCコードを持っている:C libpcap:ヘッダー/パケットの内容を確認するにはどうすればよいですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <pcap.h> 
#include <event.h> 


void callback(u_char *useless,const struct pcap_pkthdr* header,const u_char* packet){ 
    //How do I look inside the packet and the header???? 
    static int count = 1; 
    fprintf(stdout,"%d, ",count); 
    fflush(stdout); 
    count++; 
} 
int main(void) { 
    pcap_t *handle;     /* Session handle */ 
    char dev[] = "eth0";   /* Device to sniff on */ 
    char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */ 
    struct bpf_program fp;   /* The compiled filter expression */ 
    char filter_exp[] = "port 80"; /* The filter expression */ 
    bpf_u_int32 mask;    /* The netmask of our sniffing device */ 
    bpf_u_int32 net;    /* The IP of our sniffing device */ 

    if(pcap_lookupnet(dev,&net,&mask,errbuf)==-1){ 
     fprintf(stderr, "Can't get netmask for device %s\n", dev); 
     net = 0; 
     mask = 0; 
    } 
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); 
    if (handle == NULL) { 
     fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); 
     return(2); 
    } 
    if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { 
     fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
     return(2); 
    } 
    if (pcap_setfilter(handle, &fp) == -1) { 
     fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
     return(2); 
    } 

    /*Actual sniffing*/ 
    pcap_loop(handle,-1,callback,NULL); 

    return 0; 
} 

私は送信元と送信先のアドレスを取得するには、ヘッダーの中を見しようとしています。ペイロードを取得するためにパケットを調べようとしています。これをどうやってやりますか?私はオンラインでAPIを見つけることができないようです。

事前に感謝し、あなたのcallback機能で

答えて

1

、あなたがこの(Linux上で、イーサネット上のTCP/IPを想定)のようなものかもしれない:

#include <netinet/ip.h> 
#include <netinet/tcp.h> 

const uint16_t ETHER_TYPE_IP = 0x0800; 
const size_t ETHER_TYPE_OFFSET = 12; 
const size_t ETHER_IP_OFFSET = 14; 
const uint8_t IP_PROTO_TCP = 0x06; 

uint16_t ether_type = ntohs(*((const uint16_t*) (packet + ETHER_TYPE_OFFSET))); 

if (ether_type == ETHER_TYPE_IP) { 
    const struct ip* ip_header = (const struct ip*) (packet + ETHER_IP_OFFSET); 

    const unsigned char* ip_data = ((const unsigned char*) ip_header) + (ip_header->ip_hl << 2); 
    uint16_t ip_data_len = ntohs(ip_header->ip_len) - (ip_header->ip_hl << 2); 

    if (ip_header->ip_p == IP_PROTO_TCP) { 
     const struct tcphdr* tcp_header = (const struct tcphdr*) ip_data; 

     const unsigned char* data = ((const unsigned char*) tcp_header) + (tcp_header->doff << 2); 
     uint16_t data_len = ip_data_len - (tcp_header->doff << 2); 

     /* do something with the data here ... */ 
    } 
} 
関連する問題