C语言嗅探器带报告

关键代码
通过C语言,实现了一个网络的嗅探器的基本功能。可以做到能检测计算机中的所有网卡,实现了网卡的选择并打开混杂模式。监听网络中所有的数据包,并解析出数据包是使用的协议为哪种,以及每种协议首部的各种字段,如源IP地址、目的IP地址、源端口、目的端口、源MAC地址、目的MAC地址、数据包的长度等。同时能解析出数据包数据部分的内容,并尽可能的以可读的方式输出。此外,还可以选择要监听的数据包协议的类型,在监听的过程中可以检测到 ping 命令等。
下载链接:https://download.csdn.net/download/RONNIE_Zz/12652059

在这里插入图片描述

在这里插入图片描述
void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{ //回调函数,当收到每一个数据包时会被libpcap所调用
    if(header->caplen>400) return;
    struct tm *ltime;
    char timestr[16];
    ip_header * ip_hd;
    udp_header * udp_hd;
    tcp_header * tcp_hd;
    ethe_header * ethe_hd;
    int ip_len,tcp_len,start;
    u_short sport,dport;

    printf("\n");
    ltime=localtime(&header->ts.tv_sec); //将时间戳转换为可读字符 
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
    printf("时间:%s\n",timestr);

    ethe_hd = (ethe_header *)pkt_data;
    ip_hd = (ip_header *)(pkt_data + 14);
    ip_len = (ip_hd ->ver_ihl & 0xf) * 4; //ip首部长度 
    udp_hd = (udp_header *)((u_char *)ip_hd + ip_len);
    sport = ntohs(udp_hd->sport);
    dport = ntohs(udp_hd->dport);
    if(ip_hd->proto==17)
    {
        printf("协议:UDP");   
        start=ip_len+8; 
    }
    else if(ip_hd->proto==6)
    {
        printf("协议:TCP");
        tcp_hd = (tcp_header *)((u_char *)ip_hd + ip_len);
        tcp_len=ntohs(tcp_hd->sum)>>12;
        start=ip_len+tcp_len*4;
    }
    else if(ip_hd->proto==1)
    {
        printf("协议:ICMP");
        start=ip_len+23;
    }
    else printf("协议:其他");
    //printf("start=%d\n",start);
    printf("                      数据报的长度:%d\n",header->caplen);
    printf("源IP地址: %d.%d.%d.%d:%d      目的IP地址:%d.%d.%d.%d:%d\n源端口:%d                     目的端口:%d\n源物理地址: %x-%x-%x-%x-%x-%x   目的物理地址:%x-%x-%x-%x-%x-%x\n",
          ip_hd->saddr.b1, ip_hd->saddr.b2, ip_hd->saddr.b3, ip_hd->saddr.b4, 
                   ip_hd->daddr.b1, ip_hd->daddr.b2, ip_hd->daddr.b3, ip_hd->daddr.b4, sport, dport,
                   ethe_hd->mac_source_address.b1, ethe_hd->mac_source_address.b2, ethe_hd->mac_source_address.b3,
                   ethe_hd->mac_source_address.b4, ethe_hd->mac_source_address.b5, ethe_hd->mac_source_address.b6,
                   ethe_hd->mac_dest_address.b1, ethe_hd->mac_dest_address.b2, ethe_hd->mac_dest_address.b3,
                   ethe_hd->mac_dest_address.b4, ethe_hd->mac_dest_address.b5, ethe_hd->mac_dest_address.b6);
    //输出数据部分
    printf("数据部分内容为:\n");
    for (int i=start; (i < header->caplen + 1 ) ; i++)
    {
        printf("%.2x ", pkt_data[i-1]);
        if ( (i % LINE_LEN) == 0) printf("\n");
    }
    printf("\n\n");
}

你可能感兴趣的:(C语言嗅探器带报告)