网络课程设计_第1页
网络课程设计_第2页
网络课程设计_第3页
网络课程设计_第4页
网络课程设计_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

网络编程技术报告——端口扫描器报告人:04级软件工程6班李阳合作人:04级软件工程6班卓多伟一、端口扫描器产生的背景2二、端口扫描器在扫描过程中主要具有以下三个方面的能力:2三、扫描器的原理3四、端口扫描器的设计分析过程3(1)设计过程中所用到的技术3(2)程序设计分析(即程序设计流程)51、新建一个Windows应用程序项目,设计界面如:52、使用的名称空间:(useing)53、添加成员64、对ICMP报文的操作控制65、添加按钮Ping的Click事件代码:86、添加扫描端口的Click事件117、运行结果:12五、课程设计心得体会121、对Microsoft.NET平台的体系结构的了解122、对类库的熟悉133、对端口扫描器的了解:134、增强了合作的能力13一、端口扫描器产生的背景(了解到远程计算机所存在的安全问题)端口扫描器是一种自动检测远程或本地计算机安全性弱点的程序,通过使用扫描器可不留痕迹的发现远程服务器的各种TCP协议端口的分配及提供的服务,还可以得知它们所使用的软件版本!这就能间接的了解到远程计算机所存在的安全问题。端口扫描"通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。"端口扫描"行为的一个重要特征是:在短时期内有很多来自相同的信源地址传向不同的目的地端口的包。对于用端口扫描进行攻击的人来说,攻击者总是可以做到在获得扫描结果的同时,使自己很难被发现或者说很难被逆向跟踪。为了隐藏攻击,攻击者可以慢慢地进行扫描。除非目标系统通常闲着(这样对一个没有listen端口的数据包都会引起管理员的注意),有很大时间间隔的端口扫描是很难被识别的。隐藏源地址的方法是发送大量的欺骗性的端口扫描包(1000个),其中只有一个是从真正的源地址来的。这样,即使全部包(1000)都被察觉,被记录下来,也没有人知道哪个是真正的信源地址。能发现的仅仅是"曾经被扫描过"。也正因为这样那些黑客们才乐此不彼地继续大量使用这种端口扫描技术来达到他们获取目标计算机信息、并进行恶意攻击。二、端口扫描器在扫描过程中主要具有以下三个方面的能力:(1)发现一个计算机或网络的能力;(2)一旦发现一台计算机,就有发现目标计算机正在运行什么服务的能力;(3)通过测试目标计算机上的这些服务,发现存在的漏洞的能力。三、扫描器的原理现在假设你是A,要扫的是B那么,通常建立3次握手的过程是ASyn->BA<-Syn/AckBA-Ack>B这样就建立了连接,扫描就是建立很多这样的连接,从而达到了解对方开了哪些端口,哪些服务厉害的扫描器还会进一步探测!但是,这种tcp扫描会留下大量的记录,如果B的网管聪明的话,那么他就会开始注意了。所以我们又会用半开放式扫描(syn)也就是ASyn->BA<-Syn/AckBA->\\BA-connected?<-B这样,由于B一直得不到确认,当然就不会记录ip啦,不过B若是很bt,那么他也会记录任何syn的ip,那就没办法了!!四、端口扫描器的设计分析过程(1)设计过程中所用到的技术在本课程设计中运用到的名字空间主要有:和System.Net。1、名称空间包含了可以给低级WinsockAPI提供实际的.NET接口的类。其构造函数为:Socket(AddressFamilyaf,SocketTypest,ProtocolTypept)其中,AddressFamily为网络类型,SocketType为数据类型,ProtocolType为使用AddressFamily.InterNetwork枚举值。2、TcpClient类,用于在同步阻塞模式下通过网络来连接、发送和接受数据。该类有以下3种构造函数:TcpClient()TcpClient(IPEndPointiep)TcpClient(stringhost,intport)3、发送数据要调用Sendto()方法来实现4、获取主机地址信息定义主机对象IPEndPoint类IPAddress类获取主机信息Dns类中常用方法Dns.GetHostName()Dns.GetHostByName(stringhostname)Dns.GetHostByAddress(address)Dns.Resolve().定义主机对象IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息。通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。常用的方法原型:publicIPEndPoint(IPAddressaddress,intport);说明:address:IP地址port:端口号功能:初始化IPEndPoint类的实例。用法举例:IPAddressmyServerIP=newIPAddress.Parse(“”IPEndPointmyServer=newIPEndPoint(myServerIP,13);5、Internet控制报文协议——ICMP的作用与特点ICMP的特点:ICMP本身是网络层的一个协议;ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因;ICMP并不能保证所有的IP数据报都能够传输到目的主机;ICMP不能纠正差错,它只是报告差错。差错处理需要由高层协议去完成。(2)程序设计分析(即程序设计流程)1、新建一个Windows应用程序项目,设计界面如:2、使用的名称空间:(useing)System、、System.ComponentModel、System.Data、System.Drawing、System.Text、Sy、、System.Net。3、添加成员publicclassIcmpPacket{publicByteType; //消息类型publicByteSubCode; //子码类型publicUInt16CheckSum; //校检和publicUInt16Identifier; //标志符publicUInt16SequenceNumber;//顺序号publicByte[]Data; //数据}//ICMP包4、对ICMP报文的操作控制//声明常量constintSOCKET_ERROR=-1;constintICMP_ECHO=8;publicstaticInt32Serialize(IcmpPacketpacket,Byte[]Buffer,Int32PacketSize,Int32PingData){//取得报文内容,转化为字节数组,然后计算报文的长度 Int32cbReturn=0;//数据报结构转化为数组intIndex=0;Byte[]b_type=newByte[1];b_type[0]=(packet.Type);Byte[]b_code=newByte[1];b_code[0]=(packet.SubCode);Byte[]b_cksum=BitConverter.GetBytes(packet.CheckSum);Byte[]b_id=BitConverter.GetBytes(packet.Identifier);Byte[]b_seq=BitConverter.GetBytes(packet.SequenceNumber);Array.Copy(b_type,0,Buffer,Index,b_type.Length);Index+=b_type.Length;Array.Copy(b_code,0,Buffer,Index,b_code.Length);Index+=b_code.Length;Array.Copy(b_cksum,0,Buffer,Index,b_cksum.Length);Index+=b_cksum.Length;Array.Copy(b_id,0,Buffer,Index,b_id.Length);Index+=b_id.Length;Array.Copy(b_seq,0,Buffer,Index,b_seq.Length);Index+=b_seq.Length;//复制数据 Array.Copy(packet.Data,0,Buffer,Index,PingData);Index+=PingData;if(Index!=PacketSize/*sizeof(IcmpPacket)*/){cbReturn=-1;returncbReturn;}cbReturn=Index;returncbReturn;}///<summary>/// 校验和算法///</summary>publicstaticUInt16checksum(UInt16[]buffer,intsize){Int32cksum=0;intcounter;counter=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/while(size>0){UInt16val=buffer[counter];cksum+=Convert.ToInt32(buffer[counter]);counter+=1;size-=1;}/* 若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个* 2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(UInt16)(~cksum);}5、添加按钮Ping的Click事件代码:privatevoidbutton1_Click(objectsender,EventArgse){//执行PING this.richTextBox1.Text=""; for(intp=0;p<10;p++) { try { stringHostName=this.textBox1.Text; intnBytes=0; intdwStart=0,dwStop=0; //初始化一个ICMP类型的Socket Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp); //取得目标主机的主机名IPHostEntryserverHE=Dns.GetHostByName(HostName); IPEndPointipepServer=newIPEndPoint(serverHE.AddressList[0],0); EndPointepServer=(ipepServer); IPHostEntryfromHE=Dns.GetHostByName(Dns.GetHostName());IPEndPointipEndPointFrom=newIPEndPoint(fromHE.AddressList[0],0); EndPointEndPointFrom=(ipEndPointFrom); intPacketSize=0; IcmpPacketpacket=newIcmpPacket(); //构造数据报 packet.Type=ICMP_ECHO; packet.SubCode=0; packet.CheckSum=UInt16.Parse("0"); packet.Identifier=UInt16.Parse("45"); packet.SequenceNumber=UInt16.Parse("0"); intPingData=32;//sizeof(IcmpPacket)-8; packet.Data=newByte[PingData]; //初始化Packet.Data for(inti=0;i<PingData;i++) { packet.Data[i]=(byte)'#'; } //保存数据报的长度 PacketSize=PingData+8; Byte[]icmp_pkt_buffer=newByte[PacketSize]; Int32Index=0; //调用Serialize方法 //报文总共的字节数 Index=Serialize( packet, icmp_pkt_buffer, PacketSize, PingData); if(Index==-1) { this.richTextBox1.Text+="报文大小有错!\n"; return; }//转化为Uint16类型的数组,取得数据报长度的一半 Doubledouble_length=Convert.ToDouble(Index); Doubledtemp=Math.Ceiling(double_length/2); intcksum_buffer_length=Convert.ToInt32(dtemp); //生成一个字节数组UInt16[]cksum_buffer=newUInt16[cksum_buffer_length]; //初始化Uint16类型array inticmp_header_buffer_index=0; for(inti=0;i<cksum_buffer_length;i++) { cksum_buffer[i]=BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index); icmp_header_buffer_index+=2; } //调用checksum,返回检查和UInt16u_cksum=checksum(cksum_buffer,cksum_buffer_length); //检查和存在报文中 packet.CheckSum=u_cksum; Byte[]sendbuf=newByte[PacketSize]; //再次检查报文大小 Index=Serialize( packet, sendbuf, PacketSize, PingData); //如果有错,则报告错误 if(Index==-1) {this.richTextBox1.Text+="报文大小有错!\n"; return;}dwStart=System.Environment.TickCount;//开始时间 //用socket发送数据报if((nBytes=socket.SendTo(sendbuf,PacketSize,0,epServer))==SOCKET_ERROR){ this.richTextBox1.Text+="不能发送数据包!\n";} //初始化缓冲区.接受缓冲区 //ICMP头+IP头(20字节) Byte[]ReceiveBuffer=newByte[256]; nBytes=0; //接受字节流 boolrecd=false; inttimeout=0; //循环检查目标主机响应时间 while(!recd){nBytes=socket.ReceiveFrom(ReceiveBuffer,256,0,refEndPointFrom); if(nBytes==SOCKET_ERROR){this.richTextBox1.Text+="目标主机没有响应!\n"; recd=true; break;} elseif(nBytes>0){dwStop=System.Environment.TickCount-dwStart;this.richTextBox1.Text+="数据来自主机:"+this.textBox1.Text+",收到的字节数:"+nBytes+",耗时:"+dwStop+"ms\n"; recd=true; break;}timeout=System.Environment.TickCount-dwStart; if(timeout>1000) {this.richTextBox1.Text+="连接超时!\n"; recd=true;} } //关闭socket socket.Close(); } catch(ExceptionErr){MessageBox.Show("PING目标主机操作失败!错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}}}6、添加扫描端口的Click事件privatevoidbutton2_Click(objectsender,EventArgse){//扫描端口intiStart=(int)this.numericUpDown1.Value;intiEnd=(int)this.numericUpDown2.Value;try{gressBar1.Minimum=iStart;gressBar1.Maximum=iEnd;this.richTextBox2.Text="程序开始扫描端口:\n";this.richTextBox2.Update();for(inti=iStart;i<iEnd;i++){gressBar1.Value=i;TcpClientMyTCP=null;try{MyTCP=newTcpClient(this.textBox1.Text,i);this.richTextBox2.Text+="端口"+i.ToS

温馨提示

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

评论

0/150

提交评论