📄 entai.c
字号:
#include "pcap.h"#include <string.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];};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_souce_address; struct in_addr ip_destination_address;};struct udp_header_liuwentao{ 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("Window 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_liuwentao *udp_protocol; u_short source_port; u_short destination_port; u_short length; udp_protocol = (struct udp_header_liuwentao*)(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 server \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_souce_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"); printf("The %d packet is captured.\n", packet_number); printf("-------- Ehternet 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"); 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 ; pcap_loop(pcap_handle, 10, ethernet_protocol_packet_callback, NULL); pcap_close(pcap_handle); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -