课程设计活动主机扫描.doc_第1页
课程设计活动主机扫描.doc_第2页
课程设计活动主机扫描.doc_第3页
课程设计活动主机扫描.doc_第4页
课程设计活动主机扫描.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计()报告( 2011 / 2012 学年 第 二 学期)题目: 活动主机的检测 专 业 计算机科学与技术 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机学院 计算机系统与网络教学中心日 期 2012.06.112012.06.22指导教师成绩评定表学生姓名班级学号专业计算机科学与技术评分内容评分标准优秀良好中等差平时成绩认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事设计成果设计的科学、合理性功能丰富、符合题目要求 界面友好、外观漂亮、大方程序功能执行的正确性程序算法执行的效能设计报告设计报告正确合理、反映系统设计流程文档内容详实程度文档格式规范、排版美观验收答辩简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。评分等级指导教师简短评语指导教师签名日期2012.06.23备注评分等级有五种:优秀、良好、中等、及格、不及格2题目一:活动主机的检测一、 课题内容和要求1.设计内容:根据协议规定的ICMP数据包的标准格式,编写程序向指定网段中的目的主机发送ICMP数据包,并对目的主机返回的数据包进行解析,以发现那些处于活动状态的主机。2.设计要求(1)将目的主机的状态显示在屏幕上,具体格式: 开始主机扫描 活动主机:xx.xx.xx.xx 活动主机:xx.xx.xx.xx (2)要求有良好的编程规范和注释,编程所使用的操作系统、语言和编译环境不限,但是需在课程设计报告文档中予以说明。二、需求分析2.1 使用原始套接字,实现发送/监听ICMP报文2.2 由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构和ICMP头部的数据结构。IP头部的数据结构和ICMP头部的数据结构在概要设计中已有分析。2.3填充并发送请求类型的ICMP报文, 填充ICMP报文后,应在ICMP报文之前加上IP报头并发送出去。2.4解析数据包:如果所ping的目的主机存在,那么它会发出一个回送应答包。这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。ICMP数据包中的IP地址就是活动主机的IP。三、概要设计 3.1 设计原理 本程序使用的原始套接字生成ICMP请求/应答报文来进行活动主机的探查。这个程序使用的是回送请求和应答消息。程序的大致思想是把ICMP的数据报类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP地址的主机上的TCP/IP软件就能接受到这个ICMP回送请求,从而返回一个ICMP回送请求(类型号为0)信息。信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息,相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。本设计的主体思想是使用ICMPECHO数据包来探测指定网段内的活动主机。具体方法是:通过简单的发送一个ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。ICMP全称Internet Control Message Protocol,工作在OSI的网络层。它的中文名为因特网控制报文协议。ICMP报文要封装在IP数据报内部才能传输。其结构如(图1)所示。ICMP报文的格式如(图2)所示。所有的ICMP报文的前4个字节都是一样的,但是其他字节互不相同。其中0-7位是类型字段,8-15位是代码字段,16-31位是校验和字段。校验和字段为2个字节,校验的范围是整个ICMP报文。本设计仅用到类型为0和8的ICMP报文,关于这两种类型报文的具体描述详见(图3)。20B图1: ICMP封装在IP内部IP数据报IP首部ICMP报文31(位)15 167 8类型字段代码字段校验和字段0(不同类型和代码有不同内容)图2:ICMP报文类型代码描述00回应应答(Ping应答,与类型8的Ping请求一起使用)80回应请求(Ping请求,与类型8的Ping应答一起使用)图3:本设计使用的ICMP报文类型 3.2 数据结构设计 3.1.1IP头部数据结构typedef struct iphdr unsigned int headlen:4; /ip头长度 unsigned int wersion:4; /ip版本号 unsigned char tos; /服务类型unsigned short totallen; /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; 3.1.2ICMP头部数据结构 typedef struct icmphdr BYTE type; /icmp类型码,回送请求的类型码为8 BYTE code; /子类型码,保存与特定ICMP报文类型相关的细节信息 USHORT checksum; /校验和 USHORT id; /ICMP报文id号 USHORT seq; /ICMP数据报的序列号Icmpheader;3.3 系统流程图3.3.1主流程图 (图4)图4 3.3.2子流程图(图5)图5四、详细设计 4.1.ICMP报文分析ICMP是一种差错和控制报文协议,用于传输错误报告和控制信息。ICMP报文分为头部和数据部分。ICMP报文封装在IP数据报中传输。IP报头中的类型为1时,表示报文的数据部分为ICMP报文。虽然ICMP报文由IP报文传输,但是并不能认为ICMP是IP的上层协议,而是IP协议的有机补充。把ICMP报文放在IP包中,是要利用IP的转发功能。 类型(TYPE)是一个字节,表示ICMP消息的类型。代码(CODE)也是一个字节,表示报文类型的下一步信息。校验和共有两个字节,提供对整个ICMP报文的校验和(和IP报文类型的进一步信息)。校验和共两个字节,提供对整个ICMP报文的校验和。按照协议的功能来分,ICMP报文可以分为1) ICMP差错报文 包括目的不可达报告,超时报告,参数出错报告。2) ICMP控制报文包括拥塞控制和源抑制报文,路游控制和重定向报文。3) ICMP测试报文包括请求应答报文,时戳请求应答报文。本课程设计就是使用ICMP请求/应答报文来测试目的主机是否存在,请求者想某特定的主机发送请求,其中包含任选的数据。目的主机收到请求后,发送应答报文。在同一时刻,一台机器可以同时向多台主机发送请求报文。ICMP报文格式如图6所示,ICMP回送报文格式如下图7所示。 类型 代码 校 验 和 数据区(变长)类型 代码 校验和 标志位 序号 任选数据 图6.ICMP报文格式 图7.ICMP回应报文格式4.2.程序功能分析 在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。因为要寻找活动的主机可能很多,为节省时间可以采用多线程编程。结合核心代码对程序的具体进行分析。 4.2.1使用原始套接字 为了实现发送/监听ICMP抱文,必须使用原始套接字,创建原始套接字的代码如下:SOCKET sockraw;sockraw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,wsa_flag_overlapped);在WSASocket函数中,我们使用IPPROTO_ICMP表示接受ICMP数据包,为了使用发送接受超时设置(设置SO_RCVTIMEO或SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED。然后调用setsockopt函数设置读取迟延。在setsockopt函数中,sockraw是之前创建的原始套接字,设置SOL_SOCKET表明使用基本套接字处理ICMP抱文。设置SO_RCVTIMEO表示使用接受超时设置,SOSNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。4.2.2定义IP头部和ICMP头部数据结构由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构和ICMP头部的数据结构。IP头部的数据结构和ICMP头部的数据结构在概要设计中已有分析。4.2.3填充并发送请求类型的ICMP报文 #define ICMP_ECHO 8 /请求回送 #define DEF_PACKET_SIZE 32 /缺省数据报长度#define MAX_PACKET 1024 /最大数据报长度#char icmp_dataMAX_PACKET; /ICMP数据报最大可能长度Memset(icmp_data,0, MAX_PACKET) /将数据报清空初始化Int datasize=DEF_PACKET_SIZE; /ICMP数据报报文体的额缺省长度Datasize+=sizeof(icmpHeader); /加上ICMP数据头部 icmp_header *icmp_hdr; char *datapart; icmp_hdr=(icmpheader*)icmp_data; icmp_hdr-type=icmp_echo; /设置类型 icmp_hdr-id=(ushort)getcurrentthreadid(); /设置其ID号为当前线程号 datapart=icmp_data+sizeof(icmpheader); /计算出ICMP数据报的数据部分 memset(datapart,A,datasize-sizeof(icmphearder); /填入数据 ((IcmpHeader*)icmp_data)-seq=0; /序列号 ((IcmpHeader*)icmp_data)-check_sum=0; /先将检验和置0((IcmpHeader*)icmp_data)-checksum=checksum(USHORT*) icmp_data,data_size);/Checksum 为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。其代码如下: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地址字符串。 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); 4.2.4解析数据包 如果所ping的目的主机存在,那么它会发出一个回送应答包。这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。ICMP数据包中的IP地址就是活动主机的IP。代码分析如下: #define ICMP_MIN 8 #defineMAX_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; unsigned 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;五、测试数据及其结果分析经调试,运行正常,运行结果如下图实验过程中的一些测试:(1) 在实验室运行程序时,发现某些主机无法发现。经分析,是因为这些主机装有瑞星防火墙,拒绝发送ICMP回送响应信息。如果将其防火墙关闭,或者修改规则,能正常发现。(2) 如果参数不符合,比如输入为:scanhost 10.0.,程序能够发现格式错误,并给出警告并提示正确格式:输入格式错误:scanhost startip endip。(3) 在格式正确的情况下,如果IP地址格式有错误,程序不能正常发现。比如输入scanhost 10.1 10.15时,程序不能返回IP格式错误的信息,反而给出发现主机10.0.0.3与10.0.0.14。这说明程序对IP地址没有预先判断处理。(4) 经以上分析,程序容错性不是很好,能检查基本错误,但是一些问题(如IP格式检测)等没有处理好。(5) 还有,程序把能响应ICMP回送请求信息的主体都视为主机,这有一定的不科学性。比如上面截图中,10.0.0.3是网关的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论