netioapi.h의 #include <ntddndis.h> 이 부분을


#include "ntddndis.h" 로 바꾼다

'Programming > __etc' 카테고리의 다른 글

고수님들..  (0) 2011.12.15
옴니아 햅틱(진동) 프로그램  (0) 2010.04.05
패킷 만들기  (0) 2010.03.18
  1. #include "stdafx.h"
  2. #include <pcap.h>
  3. /* Ethernet Header Structure */
  4. #define  ETHER_ADDR_LEN 6
  5. typedefstruct ether_header {  
  6.     unsigned char   ether_dhost[ETHER_ADDR_LEN];  
  7.     unsigned char   ether_shost[ETHER_ADDR_LEN];  
  8.     unsigned short  ether_type;  
  9. } ETHER_HDR;  
  10. #define ETHERTYPE_IP            0x0800   /* IP Protocol */
  11. #define ETHERTYPE_ARP           0x0806   /* Address Resolution Protocol */
  12. #define ETHERTYPE_REVARP        0x8035   /* reverse Address Resolution Protocol */
  13. /* IP Header Structure */
  14. typedefstruct ip_hdr  
  15. {  
  16.     unsigned char  ip_header_len:4;  // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
  17.     unsigned char  ip_version   :4;  // 4-bit IPv4 version
  18.     unsigned char  ip_tos;           // IP type of service
  19.     unsigned short ip_total_length;  // Total length
  20.     unsigned short ip_id;            // Unique identifier 
  21.     unsigned char  ip_frag_offset   :5;        // Fragment offset field
  22.     unsigned char  ip_more_fragment :1;  
  23.     unsigned char  ip_dont_fragment :1;  
  24.     unsigned char  ip_reserved_zero :1;  
  25.     unsigned char  ip_frag_offset1;    //fragment offset
  26.     unsigned char  ip_ttl;           // Time to live
  27.     unsigned char  ip_protocol;      // Protocol(TCP,UDP etc)
  28.     unsigned short ip_checksum;      // IP checksum
  29.     unsigned int   ip_srcaddr;       // Source address
  30.     unsigned int   ip_destaddr;      // Source address
  31. } IPV4_HDR;  
  32. int _tmain(int argc, _TCHAR* argv[])  
  33. {  
  34.     pcap_if_t *alldevs;  
  35.     pcap_if_t *d;  
  36.     int inum;  
  37.     int i=0;  
  38.     pcap_t *fp;  
  39.     char errbuf[PCAP_ERRBUF_SIZE];  
  40.     unsigned char  packet[1500];  
  41.     /* Retrieve the device list on the local machine */
  42.     if (pcap_findalldevs(&alldevs, errbuf) == -1)  
  43.     {  
  44.         fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);  
  45.         exit(1);  
  46.     }  
  47.     /* Print the list */
  48.     for(d=alldevs; d; d=d->next)  
  49.     {  
  50.         printf("%d. %s", ++i, d->name);  
  51.         if (d->description)  
  52.             printf(" (%s)\n", d->description);  
  53.         else
  54.             printf(" (No description available)\n");  
  55.     }  
  56.     if(i==0)  
  57.     {  
  58.         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");  
  59.         return -1;  
  60.     }  
  61.     printf("Enter the interface number (1-%d):",i);  
  62.     scanf("%d", &inum);  
  63.     if(inum < 1 || inum > i)  
  64.     {  
  65.         printf("\nInterface number out of range.\n");  
  66.         /* Free the device list */
  67.         pcap_freealldevs(alldevs);  
  68.         return -1;  
  69.     }  
  70.     /* Jump to the selected adapter */
  71.     for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);  
  72.     /* Open the output device */
  73.     if ( (fp= pcap_open_live(d->name,            // name of the device
  74.         65536,                              // portion of the packet to capture (only the first 100 bytes)
  75.         0,  // promiscuous mode
  76.         1000,               // read timeout
  77.         errbuf              // error buffer
  78.         ) ) == NULL)  
  79.     {  
  80.         fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", argv[1]);  
  81.         return -1;  
  82.     }  
  83.     /**************************************************************************************************
  84.     **   윗 부분은 http://heestory.kr/220 을 참조하기 바람                                          **
  85.     **************************************************************************************************/
  86.     memset(packet, 0, sizeof(packet));      // 전송할 패킷을 저장할 버퍼의 초기화
  87.     ETHER_HDR eth;                          // Ethernet Header의 구성을 위한 구조체 선언
  88.     IPV4_HDR ip;                            // IP Header의 구성을 위한 구조체 선언
  89.     int length = 0;                         // 생성된 Packet의 Length를 
  90.     ////////////////////// 2계층인 Ethernet Header를 구성
  91.     // 지금은 테스트를 못해봐서 ... 확인하기는 힘들지만..
  92.     // 예전에 테스트 할 때.. ethernet header의 source mac address가
  93.     // 자신의 mac address와 다를 경우
  94.     // 전송이 막혔던 기억이 있음..(보안상?)
  95.     // 하지만 wireshark 같은 프로그램에서는 캡쳐됨....
  96.     eth.ether_dhost[0] = 0x00;  
  97.     eth.ether_dhost[1] = 0x01;  
  98.     eth.ether_dhost[2] = 0x02;  
  99.     eth.ether_dhost[3] = 0x03;  
  100.     eth.ether_dhost[4] = 0x04;  
  101.     eth.ether_dhost[5] = 0x05;  
  102.     eth.ether_shost[0] = 0x10;  
  103.     eth.ether_shost[1] = 0x11;  
  104.     eth.ether_shost[2] = 0x12;  
  105.     eth.ether_shost[3] = 0x13;  
  106.     eth.ether_shost[4] = 0x14;  
  107.     eth.ether_shost[5] = 0x15;  
  108.     eth.ether_type = htons(ETHERTYPE_IP);               // 3계층의 프로토콜을 지정..
  109.     memcpy(packet, eth, sizeof(eth));                 // 패킷 버퍼에 저장한다.
  110.     length += sizeof(eth);                            
  111.     memset(&ip,0x01,sizeof(ip));            // 귀찮아서 다 0x01로 채움...;;하하하..
  112.     ip.ip_header_len = sizeof(ip)/4;        // wireshark에서 안보여서 header length만 설정
  113.                                             // sizeof(ip)/4 인 이유는
  114.                                             // 1당 4 바이트를 의미하기 때문. 즉 20/4 = 5
  115.     memcpy(packet+length, &ip, sizeof(ip));  
  116.     length += sizeof(ip);  
  117.     if ( length < 64 ) {        // ethernet packet의 최소 size는 64 이다.
  118.         for( i = length ; i < 64 ;i++)  
  119.         {  
  120.             packet[i]=0;  
  121.         }  
  122.     }  
  123.     /**************************************************************************************************
  124.     **   실제 패킷을 전송하는 부분                                                                 **
  125.     **   같은 패킷을 두번 보낸다.(이유 없음..그냥!                                                 **
  126.     **************************************************************************************************/
  127.     /* Send down the packet */
  128.     if (pcap_sendpacket(fp, packet, length /* size */) != 0)  
  129.     {  
  130.         fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));  
  131.         return -1;  
  132.     }  
  133.     /* Send down the packet */
  134.     if (pcap_sendpacket(fp, packet, length /* size */) != 0)  
  135.     {  
  136.         fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));  
  137.         return -1;  
  138.     }  
  139.     return 0;  
  140. }  

'Programming > __etc' 카테고리의 다른 글

고수님들..  (0) 2011.12.15
옴니아 햅틱(진동) 프로그램  (0) 2010.04.05
C2146 구문오류  (0) 2010.03.18

+ Recent posts