Advertisement
kaspyx

Untitled

Mar 30th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.49 KB | None | 0 0
  1. #include "pcap.h"
  2.  
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5.  
  6. #pragma comment (lib, "wpcap.lib")
  7. #pragma comment (lib, "ws2_32.lib" )
  8.  
  9. #define FILTER_RULE "host 165.246.12.215 and port 7778"
  10.  
  11. struct ether_addr
  12. {
  13.     unsigned char ether_addr_octet[6];
  14. };
  15.  
  16. struct ether_header
  17. {
  18.     struct  ether_addr ether_dhost;
  19.     struct  ether_addr ether_shost;
  20.     unsigned short ether_type;
  21. };
  22.  
  23. struct ip_header
  24. {
  25.     unsigned char ip_header_len:4;
  26.     unsigned char ip_version:4;
  27.     unsigned char ip_tos;
  28.     unsigned short ip_total_length;
  29.     unsigned short ip_id;
  30.     unsigned char ip_frag_offset:5;
  31.     unsigned char ip_more_fragment:1;
  32.     unsigned char ip_dont_fragment:1;
  33.     unsigned char ip_reserved_zero:1;
  34.     unsigned char ip_frag_offset1;
  35.     unsigned char ip_ttl;
  36.     unsigned char ip_protocol;
  37.     unsigned short ip_checksum;
  38.     struct in_addr ip_srcaddr;
  39.     struct in_addr ip_destaddr;
  40. };
  41.  
  42.  
  43. struct tcp_header
  44. {
  45.     unsigned short source_port;
  46.     unsigned short dest_port;
  47.     unsigned int sequence;
  48.     unsigned int acknowledge;
  49.     unsigned char ns:1;
  50.     unsigned char reserved_part1:3;
  51.     unsigned char data_offset:4;
  52.     unsigned char fin:1;
  53.     unsigned char syn:1;
  54.     unsigned char rst:1;
  55.     unsigned char psh:1;
  56.     unsigned char ack:1;
  57.     unsigned char urg:1;
  58.     unsigned char ecn:1;
  59.     unsigned char cwr:1;
  60.     unsigned short window;
  61.     unsigned short checksum;
  62.     unsigned short urgent_pointer;
  63. };
  64.  
  65. void print_ether_header(const unsigned char *data);
  66. int print_ip_header(const unsigned char *data);
  67. int print_tcp_header(const unsigned char *data);
  68. void print_data(const unsigned char *data);
  69.  
  70. int main(){
  71.     pcap_if_t *alldevs=NULL;
  72.         char errbuf[PCAP_ERRBUF_SIZE];
  73.  
  74.     int offset=0;
  75.    
  76.     // find all network adapters
  77.     if (pcap_findalldevs(&alldevs, errbuf)==-1){
  78.         printf("dev find failed\n");
  79.         return -1;
  80.     }
  81.     if (alldevs==NULL){
  82.         printf("no devs found\n");
  83.         return -1;
  84.     }
  85.     // print them
  86.     pcap_if_t *d; int i;
  87.     for(d=alldevs,i=0; d!=NULL; d=d->next){
  88.         printf("%d-th dev: %s ", ++i, d->name);
  89.         if (d->description)
  90.             printf(" (%s)\n", d->description);
  91.         else
  92.             printf(" (No description available)\n");
  93.     }
  94.  
  95.     int inum;
  96.  
  97.     printf("enter the interface number: ");
  98.     scanf("%d", &inum);
  99.     for(d=alldevs, i=0; i<inum-1; d=d->next, i++); // jump to the i-th dev
  100.  
  101.     // open
  102.     pcap_t  *fp;
  103.     if ((fp = pcap_open_live(d->name,      // name of the device
  104.                65536,                   // capture size
  105.                1,  // promiscuous mode
  106.                20,                    // read timeout
  107.                errbuf
  108.                ))==NULL){
  109.         printf("pcap open failed\n");
  110.         pcap_freealldevs(alldevs);
  111.         return -1;
  112.     }
  113.  
  114.     printf("pcap open successful\n");
  115.  
  116.     struct bpf_program  fcode;
  117.     if (pcap_compile(fp,  // pcap handle
  118.                 &fcode,  // compiled rule
  119.                 FILTER_RULE,  // filter rule
  120.                 1,            // optimize
  121.                 NULL) < 0){
  122.         printf("pcap compile failed\n");
  123.         pcap_freealldevs(alldevs);
  124.         return -1;
  125.     }
  126.     if (pcap_setfilter(fp, &fcode) <0 ){
  127.         printf("pcap compile failed\n");
  128.         pcap_freealldevs(alldevs);
  129.         return -1;
  130.     }
  131.  
  132.     pcap_freealldevs(alldevs); // we don't need this anymore
  133.  
  134.     struct pcap_pkthdr *header;
  135.    
  136.     const unsigned char *pkt_data;
  137.         int res;
  138.    
  139.         while((res=pcap_next_ex(fp, &header,&pkt_data))>=0){
  140.             if (res==0) continue;
  141.  
  142.         print_ether_header(pkt_data);
  143.         pkt_data = pkt_data + 14;   // raw_pkt_data의 14번지까지 이더넷
  144.         offset = print_ip_header(pkt_data);
  145.         pkt_data = pkt_data + offset;       // ip_header의 길이만큼 오프셋
  146.         offset = print_tcp_header(pkt_data);
  147.         pkt_data = pkt_data + offset;       //print_tcp_header *4 데이터 위치로 오프셋
  148.         print_data(pkt_data);
  149.         }
  150.  
  151.  
  152.     return 0;
  153.  
  154. }
  155.  
  156. void print_ether_header(const unsigned char *data)
  157. {
  158.     struct  ether_header *eh;       // 이더넷 헤더 구조체
  159.     unsigned short ether_type;         
  160.     eh = (struct ether_header *)data;   // 받아온 로우 데이터를 이더넷 헤더구조체 형태로 사용
  161.     ether_type=ntohs(eh->ether_type);   // 숫자는 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿔야함
  162.    
  163.     if (ether_type!=0x0800)
  164.     {
  165.         printf("ether type wrong\n");
  166.         return ;
  167.     }
  168.     // 이더넷 헤더 출력
  169.     printf("\n============ETHERNET HEADER==========\n");
  170.     printf("Dst MAC Addr [%02x:%02x:%02x:%02x:%02x:%02x]\n", // 6 byte for dest
  171.             eh->ether_dhost.ether_addr_octet[0],
  172.             eh->ether_dhost.ether_addr_octet[1],
  173.             eh->ether_dhost.ether_addr_octet[2],
  174.             eh->ether_dhost.ether_addr_octet[3],
  175.             eh->ether_dhost.ether_addr_octet[4],
  176.             eh->ether_dhost.ether_addr_octet[5]);
  177.     printf("Src MAC Addr [%02x:%02x:%02x:%02x:%02x:%02x]\n", // 6 byte for src
  178.             eh->ether_shost.ether_addr_octet[0],
  179.             eh->ether_shost.ether_addr_octet[1],
  180.             eh->ether_shost.ether_addr_octet[2],
  181.             eh->ether_shost.ether_addr_octet[3],
  182.             eh->ether_shost.ether_addr_octet[4],
  183.             eh->ether_shost.ether_addr_octet[5]);
  184. }
  185.  
  186. int print_ip_header(const unsigned char *data)
  187. {
  188.     struct  ip_header *ih;     
  189.     ih = (struct ip_header *)data;  // 마찬가지로 ip_header의 구조체 형태로 변환
  190.  
  191.     printf("\n============IP HEADER============\n");
  192.     printf("IPv%d ver \n", ih->ip_version);
  193.     // Total packet length (Headers + data)
  194.     printf("Packet Length : %d\n", ntohs(ih->ip_total_length)+14);
  195.     printf("TTL : %d\n", ih->ip_ttl);
  196.     if(ih->ip_protocol == 0x06)
  197.     {
  198.         printf("Protocol : TCP\n");
  199.     }
  200.     printf("Src IP Addr : %s\n", inet_ntoa(ih->ip_srcaddr) );
  201.     printf("Dst IP Addr : %s\n", inet_ntoa(ih->ip_destaddr) );
  202.    
  203.     // return to ip header size
  204.     return ih->ip_header_len*4;
  205. }
  206.  
  207. int print_tcp_header(const unsigned char *data)
  208. {
  209.     struct  tcp_header *th;
  210.     th = (struct tcp_header *)data;
  211.  
  212.     printf("\n============TCP HEADER============\n");
  213.     printf("Src Port Num : %d\n", ntohs(th->source_port) );
  214.     printf("Dest Port Num : %d\n", ntohs(th->dest_port) );
  215.     printf("Flag :");
  216.     if(ntohs(th->cwr))
  217.     {
  218.         printf(" CWR ");
  219.     }
  220.     if(ntohs(th->ecn))
  221.     {
  222.         printf(" ENC ");
  223.     }
  224.     if(ntohs(th->urg))
  225.     {
  226.         printf(" URG ");
  227.     }
  228.     if(ntohs(th->ack))
  229.     {
  230.         printf(" ACK ");
  231.     }
  232.     if(ntohs(th->psh))
  233.     {
  234.         printf(" PUSH ");
  235.     }
  236.     if(ntohs(th->rst))
  237.     {
  238.         printf(" RST ");
  239.     }
  240.     if(ntohs(th->syn))
  241.     {
  242.         printf(" SYN ");
  243.     }
  244.     if(ntohs(th->fin))
  245.     {
  246.         printf(" FIN ");
  247.     }
  248.    
  249.     printf("\n");
  250.  
  251.     // return to tcp header size
  252.     return th->data_offset*4;
  253. }
  254.  
  255. void print_data(const unsigned char *data)
  256. {
  257.     printf("\n============DATA============\n");
  258.     printf("%s\n", data);
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement