ICMP扫描程序的设计与实现.doc
《ICMP扫描程序的设计与实现.doc》由会员分享,可在线阅读,更多相关《ICMP扫描程序的设计与实现.doc(21页珍藏版)》请在沃文网上搜索。
1、 ICMP扫描程序的设计与实现 第 21页 共21页 ICMP扫描程序的设计与实现摘要:我们常用Ping程序来判断一个特定的主机是否处于活动状态.该程序发送一个ICMP回应请求报文给主机,然后等待返回的ICMP报文回应应答就可以知道自己是否能成功的访问到那台机器.本次课程设计涉及到MFC的应用,要在充分了解套接字的实现以及IP,ICMP的格式,功能等的基础上才能实现此设计。关键字:ICMP;扫描;程序;协议;目 录1 引言31.1 课程设计目的31.2 课程设计要求32 概要设计42.1 设计原理42.2 数据结构设计42.3 系统流程图63 详细设计83.1 ICMP报文分析83.2 程序功
2、能分析94 测试结果124.1 遇到问题124.2 测试结果125 结束语13参考文献14附录及源代码151 引言1.1 课程设计目的IP协议的优点是简单,但缺少差错控制和查询机制,而网际控制报文协议(ICMP具有补充IP功能的作用。在网络管理中,常常要确定当前网络在红处于活动状态的主机,这时可以通过ICMP的回送和回送响应消息来完成这项工作。这课程设计的目的就是编制程序,利用ICMP数据包,发现网络中的活动主机,即ping消息的请求和应答。通过课程设计,熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识,培养综合运用网络知识解决实际问题能力。1.2 课程设计要求设计程序,其功能是发送I
3、CMP数据包,以获取指定望段中的活动主机,并将结果显示在标准输出设备上程序的具体要求如下:1用命令形式运行scanhost为程序名;start_ip为被搜索网段;end_ip为被搜索网段的结束IP地址。如在命令行输入 scanhost 192.168.0.1 192.168.0.1002输出格式活动主机1的IP地址活动主机2的IP地址 活动主机 n的IP地址2 概要设计2.1 设计原理本程序使用的原始套接字生成ICMP请求/应答报文来进行活动主机的探查。这个程序使用的是回送请求和应答消息。程序的大致思想是把ICMP的数据报类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经
4、被占用的话,那么使用位于这个IP地址的主机上的TCP/IP软件就能接受到这个ICMP回送请求,从而返回一个ICMP回送请求(类型号为0)信息。信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息,相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。2.2 数据结构设计 2.2.1IP头部数据结构typedef struct iphdr unsigned int headlen:4; /ip头长度 unsigned int wersion:4; /ip版本号 unsigned char tos; /服务类型unsigned short t
5、otallen; /ip包总长度unsigned short id; /ip号unsigned short flag; /标记unsigned char ttl; /生存时间unsigned char prot; /协议(UDP TCP)unsigned short checksum; /校验和unsigned int sourceip; /源ipunsigned int destip; /目的ipIpHeader;2.2.2ICMP头部数据结构 typedef struct icmphdr BYTE type; /icmp类型码,回送请求的类型码为8 BYTE code; /子类型码,保存与
6、特定ICMP报文类型相关的细节信息 USHORT checksum; /校验和 USHORT id; /ICMP报文id号 USHORT seq; /ICMP数据报的序列号Icmpheader;2.3 系统流程图2.3.1主流程图 (图1) 开 始构造原始套接字,并初始化建立并初始化木的主机的Sockaddr_in数据结构dest起始IP地址-start_ip结束IP地址-end ip将start_ip填入到dest中start_iptype=icmp_echo; /设置类型 icmp_hdr-id=(ushort)getcurrentthreadid(); /设置其ID号为当前线程号 dat
7、apart=icmp_data+sizeof(icmpheader); /计算出ICMP数据报的数据部分memset(datapart,A,datasize-sizeof(icmphearder); /填入数据 ((IcmpHeader*)icmp_data)-seq=0; /序列号 ((IcmpHeader*)icmp_data)-check_sum=0; /先将检验和置0((IcmpHead*)icmp_data)-checksum=checksum(USHORT*) icmp_data,data_size);Checksum 为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或
8、,结果取反,便得校验和。其代码如下:unsinged long cksum=0;while (size1)cksum+=*buffer+;size-=sizeof(ushort);if(size)cksum+=*(uchar)buffer;cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return (ushort)(cksum); 填充ICMP报文之后,应在ICMP报文之前加上IP报头并发送出去。可调用下面的代码发送数据包。注意,这里的dest是填入目的主机的IP地址的一个sockaddr_in数据结构,IP_STRING是目的的主机的IP地址
9、字符串。 Struct sockaddr_in_dest; Dest.sin_family=AF_INET; Dest.sin_addr.s_addr=inet_addr(IP_STRING); Sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,size of(dest);3.2.4解析数据包 如果所ping的目的主机存在,那么它会发出一个回送应答包。这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。ICMP数据包中的IP地址就是活动主机的IP。代码分析如下
10、: #define ICMP_MIN 8 #define MAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader) char *recvbuf=newMAX_PING_PACKET_SIZE; struct sockaddr_in dest,from,end;int formlen=sizeof(from); int bytes=recvfrom(sockraw,recvbuf,MAX_PACKET,0,(Struct sockaddr*)&from,&fromlen) ipheader *iphdr; icmpheader *icmphdr; unsi
11、gned short iphdrlen; iphdr=(ipheader*)buf; iphdrlen=iphdr-headlen*4; /IP报头的长度 icmphdr=(icmpheader *)(buf+iphdrlen); /跳过IP头 /数据包太短 丢弃 if(bytestype!=icmp_echo_reply) return; /ID不相符,丢弃if(icmphdr-id!=(USHORT)getcurrentthreadid() return; /输出正在使用的IP地址 cout活动主机sin_addr)endl;4 测试结果4.1 遇到问题1 找不到头文件。因为头文件存放位置
12、错误。2 变量没有定义。因为变量没有定义和变量名书写写错。3 指针书写错误。4 宏参数列表错误。5 结构体指针传递错误。Cannot covert from struct iphdr * to struct icmphar * ip Ipheader * iphdr.因为缺少成员运算符”.”。4.2 测试结果 经反复调试,运行正常,运行结果如下(图5)5 结束语回顾过去的一个星期,有紧张,有忙碌,有苦恼,也有欢笑,在不断的改进与努力中,终于可以实现利用ICMP发现网络上的活动主机。通过这次课程设计,我加深了对ICMP协议的理解,巩固了课堂知识,为以后学习网络协议打下基础。在课程设计中,我和搭档
13、李宝详配合的很融洽,相互帮助,共同进步。在调试过程中难免要出现一些问题,为了能够快速地确定错误的原因,尽快的排除程序逻辑错误,通常把程序错误划分为三种类型:语法错误、运行错误和逻辑错误。在这次网络课程设计中,也发生了这样那样的错误,如变量没有定义、缺少头文件。通过查阅文献资料、请教老师和同学讨论,以及自己认真地分析与思考,逐一对错误进行了调试,使程序基本能正常运行,大体上符合了设计的意图和设计的要求。由于网络协议比较抽象,比较难学,也学得不深入,何况还要把所学知识运用到实践中来,真是一大难题,所以一开始时,真是有点一筹莫展,网上查有关资料却总觉得不搭干。通过这次课程设计,我明白做什么事都要沉得
14、下心,在搞任何研发工作时,遇到问题沉着冷静是特别重要的,千万不能有半点浮躁的心情。在程序的调试过程中,出现问题是正常的,关键是如何去发现问题的根源,然后去解决它。其实写程序并不是很花时间,改错才是最花时间的的事情。还有一点特别重要的是,在设计过程中或者是改错的过程中遇到棘手的问题时,借助网络去解决的确是一种很好的选择。一个星期的课程设计,我过的很充实,感觉每天都在学习,每天都在进步,在课程设计完成之际,我在此向所有关心我帮助我的刘老师和同学们致以最真诚的感谢。在这次课程设计中,我从刘老师身上学到了很多东西,他认真负责,知识丰富,要求严格,无论在理论上还是在系统调试中,都给与我很大的帮助,使我得
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ICMP 扫描 程序 设计 实现
