winpcap developer's packs 인 WpdPack를 다운 받으면 그 안에 샘플들이 많이 있어서....
이런걸 정리할 필요가 있을까 싶지만;;ㅋㅋㅋ 그냥...-;
* 자신의 프로젝트에 winpcap을 사용하고자 할 때 설정 방법은 http://www.winpcap.org/docs/docs_40_2/html/group__wpcapsamps.html 이 페이지를 참조하면 됩니다-..
코드에 주석을 달아놨으니......다른 설명은 패수-ㅋ
바로 코드 보도록 하겠습니다.
아아악!!!!!!!!!!!!! 좁다.ㅠ.ㅠ
아래 그림은 wireshark에서 캡쳐한 패킷의 모습입니다.
이런걸 정리할 필요가 있을까 싶지만;;ㅋㅋㅋ 그냥...-;
* 자신의 프로젝트에 winpcap을 사용하고자 할 때 설정 방법은 http://www.winpcap.org/docs/docs_40_2/html/group__wpcapsamps.html 이 페이지를 참조하면 됩니다-..
코드에 주석을 달아놨으니......다른 설명은 패수-ㅋ
바로 코드 보도록 하겠습니다.
- #include "stdafx.h"
- #include <pcap.h>
- /* Ethernet Header Structure */
- #define ETHER_ADDR_LEN 6
- typedef struct ether_header {
- unsigned char ether_dhost[ETHER_ADDR_LEN];
- unsigned char ether_shost[ETHER_ADDR_LEN];
- unsigned short ether_type;
- } ETHER_HDR;
- #define ETHERTYPE_IP 0x0800 /* IP Protocol */
- #define ETHERTYPE_ARP 0x0806 /* Address Resolution Protocol */
- #define ETHERTYPE_REVARP 0x8035 /* reverse Address Resolution Protocol */
- /* IP Header Structure */
- typedef struct ip_hdr
- {
- unsigned char ip_header_len:4; // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
- unsigned char ip_version :4; // 4-bit IPv4 version
- unsigned char ip_tos; // IP type of service
- unsigned short ip_total_length; // Total length
- unsigned short ip_id; // Unique identifier
- unsigned char ip_frag_offset :5; // Fragment offset field
- unsigned char ip_more_fragment :1;
- unsigned char ip_dont_fragment :1;
- unsigned char ip_reserved_zero :1;
- unsigned char ip_frag_offset1; //fragment offset
- unsigned char ip_ttl; // Time to live
- unsigned char ip_protocol; // Protocol(TCP,UDP etc)
- unsigned short ip_checksum; // IP checksum
- unsigned int ip_srcaddr; // Source address
- unsigned int ip_destaddr; // Source address
- } IPV4_HDR;
- int _tmain(int argc, _TCHAR* argv[])
- {
- pcap_if_t *alldevs;
- pcap_if_t *d;
- int inum;
- int i=0;
- pcap_t *fp;
- char errbuf[PCAP_ERRBUF_SIZE];
- unsigned char packet[1500];
- /* Retrieve the device list on the local machine */
- if (pcap_findalldevs(&alldevs, errbuf) == -1)
- {
- fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
- exit(1);
- }
- /* Print the list */
- for(d=alldevs; d; d=d->next)
- {
- printf("%d. %s", ++i, d->name);
- if (d->description)
- printf(" (%s)\n", d->description);
- else
- printf(" (No description available)\n");
- }
- if(i==0)
- {
- printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
- return -1;
- }
- printf("Enter the interface number (1-%d):",i);
- scanf("%d", &inum);
- if(inum < 1 || inum > i)
- {
- printf("\nInterface number out of range.\n");
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
- /* Jump to the selected adapter */
- for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
- /* Open the output device */
- if ( (fp= pcap_open_live(d->name, // name of the device
- 65536, // portion of the packet to capture (only the first 100 bytes)
- 0, // promiscuous mode
- 1000, // read timeout
- errbuf // error buffer
- ) ) == NULL)
- {
- fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", argv[1]);
- return -1;
- }
- /**************************************************************************************************
- ** 윗 부분은 http://heestory.kr/220 을 참조하기 바람 **
- **************************************************************************************************/
- memset(packet, 0, sizeof(packet)); // 전송할 패킷을 저장할 버퍼의 초기화
- ETHER_HDR eth; // Ethernet Header의 구성을 위한 구조체 선언
- IPV4_HDR ip; // IP Header의 구성을 위한 구조체 선언
- int length = 0; // 생성된 Packet의 Length를
- ////////////////////// 2계층인 Ethernet Header를 구성
- // 지금은 테스트를 못해봐서 ... 확인하기는 힘들지만..
- // 예전에 테스트 할 때.. ethernet header의 source mac address가
- // 자신의 mac address와 다를 경우
- // 전송이 막혔던 기억이 있음..(보안상?)
- // 하지만 wireshark 같은 프로그램에서는 캡쳐됨....
- eth.ether_dhost[0] = 0x00;
- eth.ether_dhost[1] = 0x01;
- eth.ether_dhost[2] = 0x02;
- eth.ether_dhost[3] = 0x03;
- eth.ether_dhost[4] = 0x04;
- eth.ether_dhost[5] = 0x05;
- eth.ether_shost[0] = 0x10;
- eth.ether_shost[1] = 0x11;
- eth.ether_shost[2] = 0x12;
- eth.ether_shost[3] = 0x13;
- eth.ether_shost[4] = 0x14;
- eth.ether_shost[5] = 0x15;
- eth.ether_type = htons(ETHERTYPE_IP); // 3계층의 프로토콜을 지정..
- memcpy(packet, ð, sizeof(eth)); // 패킷 버퍼에 저장한다.
- length += sizeof(eth);
- memset(&ip,0x01,sizeof(ip)); // 귀찮아서 다 0x01로 채움...;;하하하..
- ip.ip_header_len = sizeof(ip)/4; // wireshark에서 안보여서 header length만 설정
- // sizeof(ip)/4 인 이유는
- // 1당 4 바이트를 의미하기 때문. 즉 20/4 = 5
- memcpy(packet+length, &ip, sizeof(ip));
- length += sizeof(ip);
- if ( length < 64 ) { // ethernet packet의 최소 size는 64 이다.
- for( i = length ; i < 64 ;i++)
- {
- packet[i]=0;
- }
- }
- /**************************************************************************************************
- ** 실제 패킷을 전송하는 부분 **
- ** 같은 패킷을 두번 보낸다.(이유 없음..그냥! **
- **************************************************************************************************/
- /* Send down the packet */
- if (pcap_sendpacket(fp, packet, length /* size */) != 0)
- {
- fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
- return -1;
- }
- /* Send down the packet */
- if (pcap_sendpacket(fp, packet, length /* size */) != 0)
- {
- fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
- return -1;
- }
- return 0;
- }
아아악!!!!!!!!!!!!! 좁다.ㅠ.ㅠ
아래 그림은 wireshark에서 캡쳐한 패킷의 모습입니다.
소스에서 설정한 것처럼 나왔죠?ㅋㅋ
UDP든..TCP든....spoofing을 위한 ARP든....
프로토콜에 대해서 정확하게 이해한다면! 패킷을 만들수 있겠죠?...^-^;
출처 : http://heestory.kr/
728x90
댓글