libpcap

libpcap是开源库,主要完成数据包捕获功能

下面是自己的测试例子:

 

原理展示测试:

 

#include <pcap.h>
#define BUFSIZE 1024
int main()
{
        char error_content[PCAP_ERRBUF_SIZE];
        struct pcap_pkthdr protocol_header;
        pcap_t *pcap_handle;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "";
        const u_char *packet_content;
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;
        char *net_interface;
        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

        pcap_handle = pcap_open_live(net_interface,BUFSIZE,1,0,error_content);

        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        packet_content = pcap_next(pcap_handle,&protocol_header);

        printf("The capture data is: %s\n",packet_content);        
        printf("Capture a packet from : %s\n",net_interface);
        printf("The packet length is : %d\n",protocol_header.len);
        pcap_close(pcap_handle);

        return 0;
}


 

#include <pcap.h>
#include <arpa/inet.h>

typedef u_int32_t in_addr_t;

/*
struct in_addr
{
        in_addr_t s_addr;
};
*/
int main()
{
        char error_content[PCAP_ERRBUF_SIZE];
        struct in_addr net_ip_address;
        struct in_addr net_mask_address;
        char *net_interface;
        char *net_ip_string;
        char *net_mask_string;
        u_int32_t net_ip;
        u_int32_t net_mask;
        
        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

        printf("Network Interface is:%s\n",net_interface);
        net_ip_address.s_addr = net_ip;
        net_ip_string = inet_ntoa(net_ip_address);
        printf("Network IP Address is : %s\n",net_ip_string);
        net_mask_address.s_addr = net_mask;
        net_mask_string = inet_ntoa(net_mask_address);
        printf("Network Mask Address is: %s\n",net_mask_string);

        return 0;
}

 

#include "pcap.h"

void packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        static int packet_number = 1;
        printf("The %d packet is captured.\n",packet_number);
        printf("%s\n",argument);
        packet_number ++;
}

int main()
{
        pcap_t * pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "ip";
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;
        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        pcap_loop(pcap_handle,10,packet_callback,"This is argument!heihei!");

        pcap_close(pcap_handle);

        return 0;
}

 

 

以太网的捕获:

#include <pcap.h>
#include <time.h>

struct ether_header
{
        u_int8_t ether_dhost[6];
        u_int8_t ether_shost[6];
        u_int16_t ether_type;
};


int main()
{
        char error_content[PCAP_ERRBUF_SIZE];
        pcap_t *pcap_handle;
        const u_char *packet_content;
        u_char *mac_string;
        u_short ethernet_type;
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;
        char *net_interface;
        struct pcap_pkthdr protocol_header;
        struct ether_header *ethernet_protocol;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "ip";

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,
                        &bpf_filter,
                        bpf_filter_string,
                        0,
                        net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return ;
        packet_content = pcap_next(pcap_handle,&protocol_header);

        printf("--------------------*****------------------\n");
        printf("Capture a Packet from net_interface: \n");
        printf(">>>    %s \n",net_interface);
        printf("Capture Time is: \n");
//        printf(">>>    %s\n",ctime((const time_t *)&protocol_header.ts.tv_sec));
        printf(">>>    %s\n",ctime((const time_t*)(&protocol_header.ts.tv_sec)));
        printf("Packet Length is:\n");
        printf(">>>    %d\n",protocol_header.len);
        ethernet_protocol = (struct ether_header *)packet_content;

        printf("Ethernet type is :\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf(">>>    %04x\n",ethernet_type);
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is : \n");
        mac_string = ethernet_protocol->ether_shost;
        printf(">>>    %02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                *(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));

        printf("Mac Destination Address is :\n");
        mac_string = ethernet_protocol->ether_dhost;
        printf(">>>    %02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));

        printf("------------------------*****--------------------------\n");

        pcap_close(pcap_handle);
        return 0;
}

 

#include <pcap.h>
#include <time.h>

struct ether_header
{
        u_int8_t  ether_dhost[6];
        u_int8_t  ether_shost[6];
        u_int16_t ether_type;
};

void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*
                packet_header,const u_char *packet_content)
{
        u_short ethernet_type;
        struct ether_header * ethernet_protocol;
        u_char *mac_string;
        char *net_interface = (char *)argument;

        printf("---------------------*****----------------------\n");
        printf("Capture a Packet from net_interface:\n");
        printf(">>>    %s\n",net_interface);
        printf("Capture Time is: \n");
        printf(">>>    %s\n",ctime((const time_t*)&packet_header->ts.tv_sec));
        printf("Packet length is:\n");
        printf(">>>    %d\n",packet_header->len);
        ethernet_protocol = (struct ether_header*)packet_content;
        printf("Ethernet type is :\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf(">>>    %04x\n",ethernet_type);

        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is :\n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        printf("Mac Destination Address is :\n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        printf("---------------------*****----------------------\n");
}


int main()
{
        char error_content[PCAP_ERRBUF_SIZE];
        pcap_t *pcap_handle;
        const u_char *packet_content;
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;
        u_char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "ip";

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return;

        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,net_interface);

        pcap_close(pcap_handle);

        return 0;
}


arp数据包捕获:

#include <pcap.h>
#include <time.h>
#include <string.h>
#include <arpa/inet.h>

struct ether_header
{
        u_int8_t  ether_dhost[6];
        u_int8_t  ether_shost[6];
        u_int16_t ether_type;
};

typedef u_int32_t in_addr_t;

/*
struct in_addr
{
        in_addr_t s_addr;
};*/

struct arp_header
{
        u_int16_t  arp_hardware_type;
        u_int16_t  arp_protocol_type;
        u_int8_t   arp_hardware_length;
        u_int8_t   arp_protocol_length;
        u_int16_t  arp_operation_code;
        u_int8_t   arp_source_ethernet_address[6];
        u_int8_t   arp_source_ip_address[4];
        u_int8_t   arp_destination_ethernet_address[6];
        u_int8_t   arp_destination_ip_address[4];
};

void arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*
                packet_header,const u_char *packet_content)
{
        struct arp_header *arp_protocol;
        u_short protocol_type;
        u_short hardware_type;
        u_short operation_code;
        u_char *mac_string;
        struct in_addr source_ip_address;
        struct in_addr destination_ip_address;
        u_char hardware_length;
        u_char protocol_length;

        printf("-------ARP Protocol (Netwrok Layer) -------\n");
        arp_protocol = (struct arp_header *)(packet_content+14);

        hardware_type = ntohs(arp_protocol->arp_hardware_type);
        protocol_type = ntohs(arp_protocol->arp_protocol_type);
        operation_code = ntohs(arp_protocol->arp_operation_code);
        hardware_length = arp_protocol->arp_hardware_length;
        protocol_length = arp_protocol->arp_protocol_length;

        printf("ARP Hardware Type: %d\n",hardware_type);
        printf("ARP Protocol Type: %d\n",protocol_type);
        printf("ARP Hardware Length:%d\n",hardware_length);
        printf("ARP Protocol Length:%d\n",protocol_length);
        printf("ARP Operation: %d\n",operation_code);

        switch(operation_code)
        {
                case 1:
                        printf("ARP Request Protocol\n");
                        break;
                case 2:
                        printf("ARP Reply Protocol\n");
                        break;
                case 3:
                        printf("RARP Request Protocol\n");
                        break;
                case 4:
                        printf("RARP Reply Protocol\n");
                        break;
                default:
                        break;
        }

        printf("Ethernet Source Address is : \n");
        mac_string = arp_protocol->arp_source_ethernet_address;;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        memcpy((void*)&source_ip_address,(void*)&arp_protocol->arp_source_ip_address,sizeof(struct in_addr));
        printf("Source IP Address:%s\n",inet_ntoa(source_ip_address));

        printf("Ethernet Destination Address is : \n");
        mac_string = arp_protocol->arp_destination_ethernet_address;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        memcpy((void*)&destination_ip_address,(void *)
                        &arp_protocol->arp_destination_ip_address,
                        sizeof(struct in_addr));
        printf("Destination IP Address: %s\n",
                        inet_ntoa(destination_ip_address));
}


void ethernet_protocol_packet_callback(u_char *argument,const struct
                pcap_pkthdr*packet_header,const u_char *packet_content)
{
        u_short ethernet_type;
        struct ether_header *ethernet_protocol;
        u_char *mac_string;
        static int packet_number = 1;
        printf("**************************************************\n");
        printf("The %d ARP packet is captured.\n",packet_number);
        printf("-------- Ethernet Protocol (Link Layer) --------\n");
        ethernet_protocol = (struct ether_header *)packet_content;
        printf("Ethernet type is:\n");
        ethernet_type = ntohs(ethernet_protocol -> ether_type);
        printf("%04x\n",ethernet_type);
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is : \n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        printf("Mac Destination Address is:\n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        
        switch(ethernet_type)
        {
                case 0x0806:
                        arp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }

        printf("****************************************************\n");
        packet_number ++;
}


int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "arp";
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,
                        &net_ip,
                        &net_mask,
                        error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return ;
        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);

        pcap_close(pcap_handle);

        return 0;
}

 

Ip数据包捕获:

#include "pcap.h"
#include <arpa/inet.h>

struct ether_header
{
        u_int8_t  ether_dhost[6];
        u_int8_t  ether_shost[6];
        u_int16_t ether_type;
};

/*
typedef u_int32_t in_addr_t;
struct in_addr
{
            in_addr_t s_addr;
};
*/

struct ip_header
{
#ifdef WORDS_BIGENDIAN
        u_int8_t        ip_version:4,ip_header_length:4;
#else
        u_int8_t        ip_header_length:4,ip_version:4;
#endif

        u_int8_t        ip_tos;
        u_int16_t        ip_length;
        u_int16_t        ip_id;
        u_int16_t        ip_off;
        u_int8_t        ip_ttl;
        u_int8_t        ip_protocol;
        u_int16_t        ip_checksum;
        struct in_addr  ip_source_address;
        struct in_addr  ip_destination_address;
};

void ip_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        struct ip_header *ip_protocol;
        u_int    header_length;
        u_int    offset;
        u_char  tos;
        u_int16_t    checksum;
        ip_protocol = (struct ip_header*)(packet_content+14);

        checksum = ntohs(ip_protocol->ip_checksum);
        header_length = ip_protocol->ip_header_length * 4;
        tos = ip_protocol->ip_tos;
        offset = ntohs(ip_protocol->ip_off);
        printf("---------------IP Protocol (Network Layer) ---------------\n");
        printf("IP Version:%d\n",ip_protocol->ip_version);
        printf("Header length:%d\n",header_length);
        printf("TOS: %d\n",tos);
        printf("Total length: %d\n",ntohs(ip_protocol->ip_length));
        printf("Identification:%d\n",ntohs(ip_protocol->ip_id));
        printf("Offset:%d\n",(offset & 0x1fff)*8);
        printf("TTL:%d\n",ip_protocol->ip_ttl);
        printf("Protocol:%d\n",ip_protocol->ip_protocol);

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        printf("The Transport Layer Protocol is TCP\n");
                        break;
                case 17:
                        printf("The Transport Layer Protocol is UDP\n");
                        break;
                case 1:
                        printf("The Transport Layer Protocol is ICMP\n");
                default:
                        break;
        }

        printf("Header checksum:%d\n",checksum);
        printf("Source address:%s\n",inet_ntoa(ip_protocol->ip_source_address));
        printf("Destination address:%s\n",inet_ntoa(ip_protocol->ip_destination_address));
}

void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        u_short ethernet_type;
        struct ether_header *ethernet_protocol;
        u_char *mac_string;
        static int packet_number = 1;

        printf("**********************************************************************\n");
        printf("The %d IP packet is captured.\n",packet_number);
        printf("------------------ Ethernet Protocol (Link Layer) --------------------\n");
        ethernet_protocol = (struct ether_header *)packet_content;

        printf("Ethernet type is:\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf("%04x\n",ethernet_type);
        
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is: \n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        printf("Mac Destination Address is:\n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        switch(ethernet_type)
        {
                case 0x0800:
                        ip_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }


        printf("*************************************************************************\n");
    
        packet_number ++;
}


int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "ip";

        bpf_u_int32   net_mask;
        bpf_u_int32   net_ip;


        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return -1;
        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);
        pcap_close(pcap_handle);

        return 0 ;
}

 

 

ICMP数据包(ping格式)捕获:

#include<pcap.h>
#include<arpa/inet.h>

struct ether_header
{
            u_int8_t    ether_dhost[6];
            u_int8_t    ether_shost[6];
            u_int16_t    ether_type;
};


struct ip_header
{
#if defined(WORDS_BIGENDIAN)
        u_int8_t    ip_version:4,ip_header_length:4;
#else
        u_int8_t    ip_header_length:4,ip_version:4;
#endif

        u_int8_t    ip_tos;
        u_int16_t    ip_length;
        u_int16_t    ip_id;
        u_int16_t    ip_off;
        u_int8_t    ip_ttl;
        u_int8_t    ip_protocol;
        u_int16_t    ip_checksum;

        struct in_addr    ip_source_address;
        struct in_addr  ip_destination_address;
};

struct icmp_header
{
        u_int8_t    icmp_type;
        u_int8_t    icmp_code;
        u_int16_t    icmp_checksum;
        u_int16_t    icmp_id;
        u_int16_t    icmp_sequence;
};

void  icmp_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        struct icmp_header *icmp_protocol;
        icmp_protocol = (struct icmp_header*)(packet_content+14+20);

        printf("----------------   ICMP Protocol  (Transport Layer)  ------------------\n");
        printf("ICMP Type:%d\n",icmp_protocol->icmp_type);

        switch(icmp_protocol->icmp_type)
        {
                case 8:
                        printf("ICMP Echo Request Protocol \n");
                        printf("ICMP Code:%d\n",icmp_protocol->icmp_code);
                        printf("Identifier:%d\n",icmp_protocol->icmp_id);
                        printf("Sequence Number:%d\n",icmp_protocol->icmp_sequence);

                        break;
                case 0:
                        printf("ICMP Echo Reply  Protocol\n");
                        printf("ICMP Code:%d\n",icmp_protocol->icmp_code);
                        printf("Identifier:%d\n",icmp_protocol->icmp_id);    
                        printf("Sequence Number:%d\n",icmp_protocol->icmp_sequence);

                        break;
                default:
                        break;
        }

        printf("ICMP Checksum:%d\n",ntohs(icmp_protocol->icmp_checksum));
}

void ip_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct ip_header *ip_protocol;
        u_int    header_length;
        u_int    offset;
        u_char    tos;
        u_int16_t    checksum;

        printf("----------------------  IP  Protocol   (Network Layer)  ---------------------\n");
        ip_protocol = (struct ip_header*)(packet_content+14);
        checksum = ntohs(ip_protocol->ip_checksum);
        header_length = ip_protocol->ip_header_length*4;
        tos = ip_protocol->ip_tos;
        offset = ntohs(ip_protocol->ip_off);
        
        printf("IP Version:%d\n",ip_protocol->ip_version);
        printf("Header length:%d\n",header_length);
        printf("TOS:%d\n",tos);
        printf("Total length:%d\n",ntohs(ip_protocol->ip_length));
        printf("Identification:%d\n",ntohs(ip_protocol->ip_id));
        printf("Offset:%d\n",(offset & 0x1fff) * 8);
        printf("TTL:%d\n",ip_protocol->ip_ttl);
        printf("Protocol:%d\n",ip_protocol->ip_protocol);

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        printf("The Transport Layer Protocol is TCP\n");
                        break;
                case 17:
                        printf("The Transport Layer Protocol is UDP\n");
                        break;
                case 1:
                        printf("The Transport Layer Protocol is ICMP\n");
                        break;
                default:
                        break;
        }

        printf("Header checksum:%d\n",checksum);
        printf("Source address:%s\n",inet_ntoa(ip_protocol->ip_source_address));
        printf("Destination address:%s\n",inet_ntoa(ip_protocol->ip_destination_address));

        switch(ip_protocol->ip_protocol)
        {
                case 1:
                        icmp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }
}


void ethernet_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        u_short ethernet_type;
        struct ether_header *ethernet_protocol;
        u_char *mac_string;
        static int packet_number = 1;

        printf("******************************************************************************\n");
        printf("The %d ICMP packet is captured.\n",packet_number);
        printf("-------------------   Ethernet Protocol (Link Layer)   -----------------------\n");
        ethernet_protocol = (struct ether_header *)packet_content;

        printf("Ethernet type is:\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf("%04x\n",ethernet_type);
        
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is:\n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        printf("Mac Destination Address is: \n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        switch(ethernet_type)
        {
                case 0x0800:
                        ip_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }

        printf("******************************************************************************\n");

        packet_number ++;
}

int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct  bpf_program bpf_filter;
        char bpf_filter_string[] = "icmp";

        bpf_u_int32     net_mask;
        bpf_u_int32     net_ip;

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return -1;

        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);
        
        pcap_close(pcap_handle);

        return 0;
}

 

udp数据包捕获:

#include<pcap.h>
#include<arpa/inet.h>

struct ether_header
{
            u_int8_t    ether_dhost[6];
            u_int8_t    ether_shost[6];
            u_int16_t    ether_type;
};


struct ip_header
{
#if defined(WORDS_BIGENDIAN)
        u_int8_t    ip_version:4,ip_header_length:4;
#else
        u_int8_t    ip_header_length:4,ip_version:4;
#endif

        u_int8_t    ip_tos;
        u_int16_t    ip_length;
        u_int16_t    ip_id;
        u_int16_t    ip_off;
        u_int8_t    ip_ttl;
        u_int8_t    ip_protocol;
        u_int16_t    ip_checksum;

        struct in_addr    ip_source_address;
        struct in_addr  ip_destination_address;
};

struct udp_header
{
        u_int16_t    udp_source_port;
        u_int16_t    udp_destination_port;
        u_int16_t    udp_length;
        u_int16_t    udp_checksum;
};

void udp_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct udp_header * udp_protocol;
        u_short source_port;
        u_short destination_port;
        u_short length;

        udp_protocol = (struct udp_header*)(packet_content+14+20);
        source_port = ntohs(udp_protocol->udp_source_port);
        destination_port = ntohs(udp_protocol->udp_destination_port);
        length = ntohs(udp_protocol->udp_length);

        printf("------------------------  UDP  Protocol   (Transprot Layer) ------------------\n");
        printf("Source port:%d\n",source_port);
        printf("Destination port:%d\n",destination_port);

        switch(destination_port)
        {
                case 138:
                        printf("NETBIOS Datagram Service\n");
                        break;
                case 137:
                        printf("NETBIOS Name Service\n");
                        break;
                case 139:
                        printf("NETBIOS session  service\n");
                        break;
                case 53:
                        printf("name-domain service\n");
                        break;
                default:
                        break;
        }

        printf("Length:%d\n",length);
        printf("Checksum:%d\n",ntohs(udp_protocol->udp_checksum));
}


void ip_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct ip_header *ip_protocol;
        u_int    header_length;
        u_int    offset;
        u_char    tos;
        u_int16_t    checksum;

        printf("----------------------  IP  Protocol   (Network Layer)  ---------------------\n");
        ip_protocol = (struct ip_header*)(packet_content+14);
        checksum = ntohs(ip_protocol->ip_checksum);
        header_length = ip_protocol->ip_header_length*4;
        tos = ip_protocol->ip_tos;
        offset = ntohs(ip_protocol->ip_off);
        
        printf("IP Version:%d\n",ip_protocol->ip_version);
        printf("Header length:%d\n",header_length);
        printf("TOS:%d\n",tos);
        printf("Total length:%d\n",ntohs(ip_protocol->ip_length));
        printf("Identification:%d\n",ntohs(ip_protocol->ip_id));
        printf("Offset:%d\n",(offset & 0x1fff) * 8);
        printf("TTL:%d\n",ip_protocol->ip_ttl);
        printf("Protocol:%d\n",ip_protocol->ip_protocol);

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        printf("The Transport Layer Protocol is TCP\n");
                        break;
                case 17:
                        printf("The Transport Layer Protocol is UDP\n");
                        break;
                case 1:
                        printf("The Transport Layer Protocol is ICMP\n");
                        break;
                default:
                        break;
        }

        printf("Header checksum:%d\n",checksum);
        printf("Source address:%s\n",inet_ntoa(ip_protocol->ip_source_address));
        printf("Destination address:%s\n",inet_ntoa(ip_protocol->ip_destination_address));

        switch(ip_protocol->ip_protocol)
        {
                case 17:
                        udp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }
}


void ethernet_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        u_short ethernet_type;
        struct ether_header *ethernet_protocol;
        u_char *mac_string;
        static int packet_number = 1;

        printf("******************************************************************************\n");
        printf("The %d UDP packet is captured.\n",packet_number);
        printf("-------------------   Ethernet Protocol (Link Layer)   -----------------------\n");
        ethernet_protocol = (struct ether_header *)packet_content;

        printf("Ethernet type is:\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf("%04x\n",ethernet_type);
        
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is:\n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        printf("Mac Destination Address is: \n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        switch(ethernet_type)
        {
                case 0x0800:
                        ip_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }

        printf("******************************************************************************\n");

        packet_number ++;
}

int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct  bpf_program bpf_filter;
        char bpf_filter_string[] = "udp";

        bpf_u_int32     net_mask;
        bpf_u_int32     net_ip;

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return -1;

        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);
        
        pcap_close(pcap_handle);

        return 0;
}

 

tcp数据包捕获:

#include <pcap.h>
#include<arpa/inet.h>


struct ether_header
{
        u_int8_t    ether_dhost[6];
        u_int8_t    ether_shost[6];
        u_int16_t    ether_type;
};

struct ip_header
{
#ifdef  WORDS_BIGENDIAN
        u_int8_t    ip_version:4,ip_header_length:4;
#else
        u_int8_t    ip_header_length:4,ip_version:4;
#endif

        u_int8_t    ip_tos_shuaifaliu;
        u_int16_t    ip_length;
        u_int16_t    ip_id;
        u_int16_t    ip_off;
        u_int8_t    ip_ttl;
        u_int8_t    ip_protocol;
        u_int16_t    ip_checksum;
        struct in_addr ip_source_address;
        struct in_addr ip_destination_address;
};


struct tcp_header
{
        u_int16_t    tcp_source_port;
        u_int16_t    tcp_destination_port;
        u_int32_t    tcp_acknowledgement;
        u_int32_t    tcp_ack;

#ifdef WORDS_BIGENDIAN
        u_int8_t    tcp_offset:4,tcp_reserved:4;
#else
        u_int8_t    tcp_reserved:4,tcp_offset:4;
#endif
        u_int8_t    tcp_flags;
        u_int16_t    tcp_windows;
        u_int16_t    tcp_checksum;
        u_int16_t    tcp_urgent_pointer;
};


void tcp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        struct tcp_header *tcp_protocol;
        u_char flags;
        int header_length;
        u_short  source_port;
        u_short  destination_port;
        u_short windows;
        u_short urgent_pointer;
        u_int    sequence;
        u_int    acknowledgement;
        u_int16_t    checksum;

        tcp_protocol = (struct tcp_header*)(packet_content+14+20);

        source_port = ntohs(tcp_protocol->tcp_source_port);
        destination_port = ntohs(tcp_protocol->tcp_destination_port);
        header_length = tcp_protocol->tcp_offset * 4;
        sequence = ntohl(tcp_protocol->tcp_acknowledgement);
        acknowledgement = ntohl(tcp_protocol->tcp_ack);
        windows = ntohl(tcp_protocol->tcp_windows);
        urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer);
        flags = tcp_protocol->tcp_flags;
        checksum = ntohs(tcp_protocol->tcp_checksum);

        printf("----------------------  TCP Protocol (Transport Layer) ------------------\n");
        printf("Source Port:%d\n",source_port);
        printf("Destination Port:%d\n",destination_port);
        
        switch(destination_port)
        {
                case 80:
                        printf("HTTP protocol\n");
                        break;
                case 21:
                        printf("FTP  protocol\n");
                        break;
                case 23:
                        printf("TELNET protocol\n");
                        break;
                case 25:
                        printf("SMTP protocol\n");
                        break;
                case 110:
                        printf("POP3 protocol\n");
                        break;
                default:
                        break;
        }

        printf("Sequence Number:%u\n",sequence);
        printf("Acknowledgement Number:%u\n",acknowledgement);
        printf("Header Length:%d\n",header_length);
        printf("Reserved:%d\n",tcp_protocol->tcp_reserved);
        printf("Flags:");

        if(flags & 0x08)
                printf("PSH ");
        if(flags & 0x10)
                printf("ACK ");
        if(flags & 0x02)
                printf("SYN ");
        if(flags & 0x20)
                printf("URG ");
        if(flags & 0x01)
                printf("FIN ");
        if(flags & 0x04)
                printf("RST ");

        printf("\n");
        printf("Windows Size:%d\n",windows);
        printf("Checksum:%d\n",checksum);
        printf("Urgent pointer:%d\n",urgent_pointer);
}

void ip_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct ip_header *ip_protocol;
        u_int    header_length;
        u_int    offset;
        u_char    tos;
        u_int16_t    checksum;

        printf("---------------  IP   Protocol   (Nework  Layer)  ----------------\n");
        ip_protocol = (struct ip_header*)(packet_content +14);

        checksum = ntohs(ip_protocol->ip_checksum);
        header_length = ip_protocol->ip_header_length*4;
        tos = ip_protocol->ip_tos_shuaifaliu;
        offset = ntohs(ip_protocol->ip_off);
        
        printf("IP Version: %d\n",ip_protocol->ip_version);
        printf("Header length:%d\n",header_length);
        printf("TOS:%d\n",tos);
        printf("Total length:%d\n",ntohs(ip_protocol->ip_length));
        printf("Identification:%d\n",ntohs(ip_protocol->ip_id));
        printf("Offset:%d\n",(offset & 0x1fff) * 8);
        printf("TTL:%d\n",ip_protocol->ip_ttl);
        printf("Protocol: %d\n",ip_protocol->ip_protocol);

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        printf("The Transport Layer Protocol is TCP\n");
                        break;
                case 17:
                        printf("The Transport Layer Protocol is UDP\n");
                        break;
                case 1:
                        printf("The Transport Layer Protocol is ICMP\n");
                        break;
                default:
                        break;
        }

        printf("Header checksum:%d\n",checksum);
        printf("Source address:%s\n",inet_ntoa(ip_protocol->ip_source_address));
        printf("Destination address:%s\n",inet_ntoa(ip_protocol->ip_destination_address));

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        tcp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }
}


void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        u_short ethernet_type;
        struct ether_header *ethernet_protocol;
        u_char * mac_string;
        static int packet_number = 1;
    
        printf("***************************************************************\n");
        printf("The %d TCP packet is captured.\n",packet_number);
        printf("-----------  Ethernet Protocol (Link Layer)  ------------------\n");
        ethernet_protocol = (struct ether_header*)packet_content;
        printf("Ethernet type is:\n");
        ethernet_type = ntohs(ethernet_protocol->ether_type);
        printf("%04x\n",ethernet_type);
        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The newwork layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is:\n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        printf("Mac Destination Address is:\n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        switch(ethernet_type)
        {
                case 0x0800:
                        ip_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }
        printf("***********************************************************************************\n");

        packet_number ++;
}

int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "tcp";

        bpf_u_int32    net_mask;
        bpf_u_int32    net_ip;
        

        net_interface = pcap_lookupdev(error_content);
        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);
        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return -1;

        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);

        pcap_close(pcap_handle);

        return 0;
}

 

 

一个简单的捕获程序:(icmp,tcp,udp,ip,arp)

#include <pcap.h>
#include <arpa/inet.h>
#include <string.h>


struct ether_header
{
        u_int8_t    ether_dhost[6];
        u_int8_t    ether_shost[6];
        u_int16_t    ether_type;
};

struct arp_header
{
        u_int16_t    arp_hardware_type;
        u_int16_t    arp_protocol_type;
        u_int8_t    arp_hardware_length;
        u_int8_t    arp_protocol_length;
        u_int16_t    arp_operation_code;
        u_int8_t    arp_source_ethernet_address[6];
        u_int8_t    arp_source_ip_address[4];
        u_int8_t    arp_destination_ethernet_address[6];
        u_int8_t    arp_destination_ip_address[4];
};

struct ip_header
{
#if defined(WORDS_BIGENDIAN)
        u_int8_t    ip_version:4,ip_header_length:4;
#else
        u_int8_t    ip_header_length:4,ip_version:4;
#endif

        u_int8_t    ip_tos;
        u_int16_t    ip_length;
        u_int16_t    ip_id;
        u_int16_t    ip_off;
        u_int8_t    ip_ttl;
        u_int8_t    ip_protocol;
        u_int16_t    ip_checksum;
        struct in_addr    ip_source_address;
        struct in_addr  ip_destination_address;
};


struct udp_header
{
        u_int16_t    udp_source_port;
        u_int16_t    udp_destination_port;
        u_int16_t    udp_length;
        u_int16_t    udp_checksum;
};

struct tcp_header
{
        u_int16_t    tcp_source_port;
        u_int16_t    tcp_destination_port;
        u_int32_t    tcp_acknowledgement;
        u_int32_t    tcp_ack;
        
#ifdef    WORDS_BIGENDIAN
        u_int8_t    tcp_offset:4,tcp_reserved:4;
#else
        u_int8_t    tcp_reserved:4,tcp_offset:4;
#endif

        u_int8_t    tcp_flags;
        u_int16_t    tcp_windows;
        u_int16_t    tcp_checksum;
        u_int16_t    tcp_urgent_pointer;
};


struct icmp_header
{
        u_int8_t    icmp_type;
        u_int8_t    icmp_code;
        u_int16_t    icmp_checksum;
        u_int16_t    icmp_id;
        u_int16_t    icmp_sequence;
};

void tcp_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct tcp_header *tcp_protocol;
        u_char flags;
        int header_length;
        u_short source_port;
        u_short destination_port;
        u_short windows;
        u_short urgent_pointer;
        u_int    sequence;
        u_int    acknowledgement;
        u_int16_t    checksum;

        tcp_protocol = (struct tcp_header*)(packet_content+14+20);
        source_port = ntohs(tcp_protocol->tcp_source_port);
        destination_port = ntohs(tcp_protocol->tcp_destination_port);
        header_length = tcp_protocol->tcp_offset*4;
        sequence = ntohl(tcp_protocol->tcp_acknowledgement);
        acknowledgement = ntohl(tcp_protocol->tcp_ack);
        windows = ntohs(tcp_protocol->tcp_windows);
        urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer);
        flags = tcp_protocol->tcp_flags;
        checksum = ntohs(tcp_protocol->tcp_checksum);
        printf("----------------  TCP Protocol  (Transport Layer)  ------------------\n");

        printf("Source Port: %d\n",source_port);
        printf("Destination Port: %d\n",destination_port);

        switch(destination_port)
        {
                case 80:
                        printf("HTTP protocol\n");
                        break;
                case 21:
                        printf("FTP  protocol\n");
                        break;
                case 23:
                        printf("TELNET protocol\n");
                        break;
                case 25:
                        printf("SMTP  protocol\n");
                        break;
                case 110:
                        printf("POP3 protocol\n");
                        break;
                default:
                        break;
        }

        printf("Sequence Number:%u\n",sequence);
        printf("Acknowledgement Number:%u\n",acknowledgement);
        printf("Header Length:%d\n",header_length);
        printf("Reserved: %d\n",tcp_protocol->tcp_reserved);
        printf("Flags: ");

        if(flags & 0x08)
                printf("PSH ");
        if(flags & 0x10)
                printf("ACK ");
        if(flags & 0x02)
                printf("SYN ");
        if(flags & 0x20)
                printf("URG ");
        if(flags & 0x01)
                printf("FIN ");
        if(flags & 0x04)
                printf("RST ");

        printf("\n");
        printf("Windows Size: %d\n",windows);
        printf("Checksum: %d\n",checksum);
        printf("Urgent pointer: %d\n",urgent_pointer);
}


void udp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        struct udp_header *udp_protocol;
        u_short source_port;
        u_short destination_port;
        u_short    length;

        udp_protocol = (struct udp_header *)(packet_content+14+20);
        source_port = ntohs(udp_protocol->udp_source_port);
        destination_port = ntohs(udp_protocol->udp_destination_port);
        length = ntohs(udp_protocol -> udp_length);

        printf("-------------------   UDP Protocol (Transport Layer)  ----------------------\n");

        printf("Source port: %d\n",source_port);
        printf("Destination port: %d\n",destination_port);

        switch(destination_port)
        {
                case 138:
                        printf("NETBIOS Datagram Service\n");
                        break;
                case 137:
                        printf("NETBIOS Name Service\n");
                        break;
                case 139:
                        printf("NETBIOS session service\n");
                        break;
                case 53:
                        printf("name-domain service \n");
                        break;
                default:
                        break;
        }

        printf("Length: %d\n",length);
        printf("Checksum: %d\n",ntohs(udp_protocol->udp_checksum));
}

void icmp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char *packet_content)
{
        struct icmp_header *icmp_protocol;
        icmp_protocol = (struct icmp_header *)(packet_content + 14 + 20);

        printf("------------------- ICMP Protocol  (Transport Layer) ---------------------\n");
        printf("ICMP Type: %d\n",icmp_protocol->icmp_type);

        switch(icmp_protocol->icmp_type)
        {
                case 8:
                        printf("ICMP Echo Request Protocol \n");
                        printf("ICMP Code: %d\n",icmp_protocol->icmp_code);
                        printf("Identifier: %d\n",icmp_protocol->icmp_id);
                        printf("Sequence Number: %d\n",icmp_protocol->icmp_sequence);

                        break;
                case 0:

                        printf("ICMP Echo Reply Protocol \n");
                        printf("ICMP Code: %d\n",icmp_protocol->icmp_code);
                        printf("Identifier: %d\n",icmp_protocol->icmp_id);
                        printf("Sequence Number: %d\n",icmp_protocol->icmp_sequence);

                        break;
                default:
                        break;
        }

        printf("ICMP Checksum: %d\n",ntohs(icmp_protocol->icmp_checksum));
}


void arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct arp_header *arp_protocol;
        u_short    protocol_type;
        u_short    hardware_type;
        u_short    operation_code;
        u_char    *mac_string;
        struct in_addr source_ip_address;
        struct in_addr destination_ip_address;

        u_char hardware_length;
        u_char protocol_length;

        printf("--------------------   ARP  Protocol (Network Layer)   --------------------\n");

        arp_protocol = (struct arp_header *)(packet_content+14);

        hardware_type = ntohs(arp_protocol->arp_hardware_type);
        protocol_type = ntohs(arp_protocol->arp_protocol_type);
        operation_code = ntohs(arp_protocol->arp_operation_code);
        hardware_length = arp_protocol->arp_hardware_length;
        protocol_length = arp_protocol->arp_protocol_length;

        printf("ARP Hardware Type: %d\n",hardware_type);
        printf("ARP Protocol Type: %d\n",protocol_type);
        printf("ARP Hardware Length: %d\n",hardware_length);
        printf("ARP Protocol Length: %d\n",protocol_length);
        printf("ARP Operation: %d\n",operation_code);

        switch(operation_code)
        {
                case 1:
                        printf("ARP Request Protocol\n");
                        break;
                case 2:
                        printf("ARP Reply Protocol\n");
                        break;
                case 3:
                        printf("RARP Request Protocol\n");
                        break;
                case 4:
                        printf("RARP Reply Protocol\n");
                        break;
                default:
                        break;
        }

        printf("Ethernet Source Address is :\n");
        mac_string = arp_protocol->arp_source_ethernet_address;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));
        memcpy((void*)&source_ip_address,(void*)&arp_protocol->arp_source_ip_address,sizeof(struct in_addr));
        printf("Source IP Address: %s\n",inet_ntoa(source_ip_address));
        printf("Ethernet Destination Address is: \n");
        mac_string = arp_protocol->arp_destination_ethernet_address;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        memcpy((void *)&destination_ip_address,(void*)&arp_protocol->arp_destination_ip_address,sizeof(struct in_addr));
        printf("Destination IP Address: %s\n",inet_ntoa(destination_ip_address));
}


void ip_protocol_packet_callback(u_char*argument,const struct pcap_pkthdr*packet_header,const u_char*packet_content)
{
        struct ip_header *ip_protocol;

        u_int    header_length;
        u_int    offset;
        u_char tos;
        u_int16_t    checksum;

        ip_protocol = (struct ip_header*)(packet_content+14);
        
        checksum = ntohs(ip_protocol->ip_checksum);
        header_length = ip_protocol->ip_header_length*4;
        tos = ip_protocol->ip_tos;
        offset = ntohs(ip_protocol->ip_off);

        printf("-----------------  IP  Protocol  (Network  Layer)  ------------------\n");
        printf("IP Version: %d\n",ip_protocol->ip_version);
        printf("Header length: %d\n",header_length);
        printf("TOS: %d\n",tos);
        printf("Total length: %d\n",ntohs(ip_protocol->ip_length));
        printf("Identification: %d\n",ntohs(ip_protocol->ip_id));
        printf("Offset: %d\n",(offset & 0x1fff) * 8);
        printf("TTL: %d\n",ip_protocol->ip_ttl);
        printf("Protocol: %d\n",ip_protocol->ip_protocol);

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        printf("The Transport Layer Protocol is TCP\n");
                        break;
                case 17:
                        printf("The Transport Layer Protocol is UDP\n");
                        break;
                case 1:
                        printf("The Transport Layer Protocol is ICMP\n");
                        break;
                default:
                        break;
        }

        printf("Header checksum: %d\n",checksum);
        printf("Source address: %s\n",inet_ntoa(ip_protocol->ip_source_address));
        printf("Destination address: %s\n",inet_ntoa(ip_protocol->ip_destination_address));

        switch(ip_protocol->ip_protocol)
        {
                case 6:
                        tcp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                case 17:
                        udp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                case 1:
                        icmp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }
}




void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*packet_header,const u_char* packet_content)
{
        u_short ethernet_type;
        struct ether_header * ethernet_protocol;
        u_char *mac_string;

        static int packet_number = 1;

        printf("\n\n\n\n****************************************************************************************\n");
        
        printf("The %d packet is captured.\n",packet_number);
        printf("-------------------------  Ethernet Protocol  (Link Layer)  ----------------------------\n");
        
        ethernet_protocol = (struct ether_header *)packet_content;
        printf("Ethernet type is: \n");
        ethernet_type = ntohs(ethernet_protocol -> ether_type);
        printf("%04x\n",ethernet_type);

        switch(ethernet_type)
        {
                case 0x0800:
                        printf("The network layer is IP protocol\n");
                        break;
                case 0x0806:
                        printf("The network layer is ARP protocol\n");
                        break;
                case 0x8035:
                        printf("The network layer is RARP protocol\n");
                        break;
                default:
                        break;
        }

        printf("Mac Source Address is : \n");
        mac_string = ethernet_protocol->ether_shost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        printf("Mac Destination Address is: \n");
        mac_string = ethernet_protocol->ether_dhost;
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),
                        *(mac_string+2),*(mac_string+3),
                        *(mac_string+4),*(mac_string+5));

        switch(ethernet_type)
        {
                case 0x0806:
                        arp_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                case 0x0800:
                        ip_protocol_packet_callback(argument,packet_header,packet_content);
                        break;
                default:
                        break;
        }

        printf("****************************************************************************************\n\n\n\n");

        packet_number ++;
}



int main()
{
        pcap_t *pcap_handle;
        char error_content[PCAP_ERRBUF_SIZE];
        char *net_interface;
        struct bpf_program bpf_filter;
        char bpf_filter_string[] = "";
        bpf_u_int32 net_mask;
        bpf_u_int32 net_ip;

        net_interface = pcap_lookupdev(error_content);

        pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

        pcap_handle = pcap_open_live(net_interface,BUFSIZ,1,0,error_content);

        pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);

        pcap_setfilter(pcap_handle,&bpf_filter);

        if(pcap_datalink(pcap_handle) != DLT_EN10MB)
                return -1;

        pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);

        pcap_close(pcap_handle);

        return 0;
}

 

常用函数就那几个,过程基本上一样,原理差不多

 

posted @ 2013-08-30 17:09  lfsblack  阅读(1432)  评论(2编辑  收藏  举报