#include #include #include #include #include #include #include #include #include #include #include #include #include /*ip version4 header 구조체 - ip.h 에 정의되어있다 */ struct ip *iph; /*ip version6 header 구조체 - ip6.h 에 정의되어있다 */ struct ip6_hdr *ip6h; /*패킷을 받아들여서 ip header를 strip 해주는 함수*/ void strip(FILE *ifp) { unsigned short type; struct ether_header *etherp; /* etherp 포인터변수에 헤더를 저장한다 */ etherp = (struct ether_header *)ifp; /* 이더넷 헤더 길이만큼 포인터를 이동시켜 ip 헤더를 가리키도록 한다 */ ifp += sizeof(struct ether_header); /* 프로토콜 타입을 알아낸다 */ type = ntohs(etherp->ether_type); /* 그리하여 만약 IPv4 패킷이라면 */ if (type == 0x0800) { /* IP 헤더 정보를 파싱하여 출력한다 */ iph = (struct ip *)ifp; printf("IP version4 Packet 의 정보입니다 \n"); printf("Version : %d\n", iph->ip_v); printf("Header Length : %d\n", iph->ip_hl); printf("Type of Service : %d\n", iph->ip_tos); printf("Total length of IP datagram : %d\n", iph->ip_len); printf("Identification : %d\n", ntohs(iph->ip_id)); printf("Flags : %d\n", iph->ip_off); printf("Time-to-Live : %d\n", iph->ip_ttl); printf("Protocol : %d\n", iph->ip_p); printf("Header Checksum : %d\n", iph->ip_sum); printf("Source Ip address : %d\n", inet_ntoa(iph->ip_src)); /* 우리가 흔히 쓰는 10진수 형식의 형태로 바꿔준다 */ printf("Destination IP address : %d\n", inet_ntoa(iph->ip_dst)); } /* 만약 IPv6 패킷이라면 */ else if (type == 0x86dd) { ip6h = (struct ip6_hdr *)ifp; printf("IP version6 Packet 의 정보입니다 \n"); printf("Version & Traffic Class : %d\n", ip6h->ip6_vfc); printf("Flow Label : %d\n", ip6h->ip6_flow); printf("Payload Length : %d\n", ip6h->ip6_plen); printf("Next Header : %d\n", ip6h->ip6_nxt); printf("Hop Limit : %d\n", ntohs(ip6h->ip6_hlim)); printf("Source Ip address : %d\n", inet_ntoa(ip6h->ip6_src)); /* 우리가 흔히 쓰는 10진수 형식의 형태로 바꿔준다 */ printf("Destination IP address : %d\n", inet_ntoa(ip6h->ip6_dst)); } else printf("This is not IP Packet \n"); } int main(int argc, char **argv) { FILE *ifp; if (argc != 2) /*인자수가 2개가 아닐 경우 에러메시지 출력 후 종료*/ { printf("오픈할 파일을 하나만 지정해주십시오 \n"); exit(1); } ifp = fopen(argv[1], "r"); /* 두번째 인자에서 지정한 파일이름을 오픈한다. 단 바이너리 모드로 연다. */ strip(ifp); /* 불러들인 파일을 strip 함수로 넘겨주어 parsing한다 */ fclose(ifp); return 0; }