關鍵代碼
通過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(&34;); ltime=localtime(&header->ts.tv_sec); //將時間戳轉換為可讀字符 strftime( timestr, sizeof timestr, &34;, ltime); printf(&34;,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(&34;); start=ip_len+8; } else if(ip_hd->proto==6) { printf(&34;); 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(&34;); start=ip_len+23; } else printf(&34;); //printf(&34;,start); printf(&34;,header->caplen); printf(&34;, 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(&34;); for (int i=start; (i < header->caplen + 1 ) ; i++) { printf(&34;, pkt_data[i-1]); if ( (i % LINE_LEN) == 0) printf(&34;); } printf(&34;);}