收藏 分销(赏)

网络课程设计范文.doc

上传人:精**** 文档编号:9860354 上传时间:2025-04-11 格式:DOC 页数:32 大小:139KB 下载积分:12 金币
下载 相关 举报
网络课程设计范文.doc_第1页
第1页 / 共32页
网络课程设计范文.doc_第2页
第2页 / 共32页


点击查看更多>>
资源描述
网络课程设计 32 2020年4月19日 文档仅供参考 网络编程技术报告 ——端口扫描器 报告人:04级软件工程6班 李阳 合作人:04级软件工程6班 卓多伟 一、端口扫描器产生的背景 2 二、端口扫描器在扫描过程中主要具有以下三个方面的能力: 2 三、扫描器的原理 3 四、端口扫描器的设计分析过程 3 (1)设计过程中所用到的技术 3 (2)程序设计分析(即程序设计流程) 5 1、新建一个Windows应用程序项目,设计界面如: 5 2、使用的名称空间:(useing) 5 3、添加成员 6 4、对ICMP报文的操作控制 6 5、添加按钮Ping的Click 事件代码: 8 6、添加扫描端口的Click事件 11 7、运行结果: 12 五、课程设计心得体会 12 1、对Microsoft.NET平台的体系结构的了解 12 2、对类库的熟悉 13 3、对端口扫描器的了解: 13 4、增强了合作的能力 13 一、端口扫描器产生的背景 (了解到远程计算机所存在的安全问题) 端口扫描器是一种自动检测远程或本地计算机安全性弱点的程序,经过使用扫描器可不留痕迹的发现远程服务器的各种TCP协议端口的分配及提供的服务,还能够得知它们所使用的软件版本!这就能间接的了解到远程计算机所存在的安全问题。 端口扫描"一般指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。"端口扫描"行为的一个重要特征是:在短时期内有很多来自相同的信源地址传向不同的目的地端口的包。   对于用端口扫描进行攻击的人来说,攻击者总是能够做到在获得扫描结果的同时,使自己很难被发现或者说很难被逆向跟踪。为了隐藏攻击,攻击者能够慢慢地进行扫描。除非目标系统一般闲着(这样对一个没有listen端口的数据包都会引起管理员的注意),有很大时间间隔的端口扫描是很难被识别的。隐藏源地址的方法是发送大量的欺骗性的端口扫描包(1000个),其中只有一个是从真正的源地址来的。这样,即使全部包(1000)都被察觉,被记录下来,也没有人知道哪个是真正的信源地址。能发现的仅仅是"曾经被扫描过"。也正因为这样那些黑客们才乐此不彼地继续大量使用这种端口扫描技术来达到她们获取目标计算机信息、并进行恶意攻击。 二、端口扫描器在扫描过程中主要具有以下三个方面的能力:   (1) 发现一个计算机或网络的能力;   (2) 一旦发现一台计算机,就有发现目标计算机正在运行什么服务的能力;   (3) 经过测试目标计算机上的这些服务,发现存在的漏洞的能力。 三、扫描器的原理 现在假设你是A,要扫的是B 那么,一般建立3次握手的过程是 ASyn->B A<-Syn/AckB A-Ack>B 这样就建立了连接,扫描就是建立很多这样的连接,从而达到了解对方开了哪些端口,哪些服务厉害的扫描器还会进一步探测!可是,这种tcp扫描会留下大量的记录,如果B的网管聪明的话,那么她就会开始注意了。 因此我们又会用半开放式扫描(syn) 也就是 ASyn->B A<-Syn/AckB A->\\ B A-connected?<-B 这样,由于B一直得不到确认,当然就不会记录ip啦,不过B若是很bt,那么她也会记录任何syn的 ip,那就没办法了!! 四、端口扫描器的设计分析过程 (1)设计过程中所用到的技术 在本课程设计中运用到的名字空间主要有:System.Net.Sockets和System.Net。 1、System.Net.Sockets名称空间包含了能够给低级Winsock API提供实际的.NET接口的类。其构造函数为: Socket(AddressFamily af,SocketType st ,ProtocolType pt) 其中,AddressFamily为网络类型, SocketType 为数据类型,ProtocolType为使用AddressFamily.InterNetwork枚举值。 2、TcpClient类,用于在同步阻塞模式下经过网络来连接、发送和接受数据。该类有 以下3种构造函数: TcpClient() TcpClient(IPEndPoint iep) TcpClient(string host,int port) 3、发送数据要调用Sendto ()方法来实现 4、获取主机地址信息 • 定义主机对象 – IPEndPoint类 – IPAddress类 • 获取主机信息 – Dns类中常见方法 • Dns.GetHostName() • Dns.GetHostByName(string hostname) • Dns.GetHostByAddress(address) • Dns.Resolve() .定义主机对象 IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息。经过组合服务的主机 IP 地址和端口号,IPEndPoint 类形成到服务的连接点。 常见的方法原型: public IPEndPoint(IPAddress address, int port); 说明: address:IP地址 port:端口号 功能:初始化IPEndPoint类的实例。 用法举例: IPAddressmyServerIP=new IPAddress.Parse(“127.0.0.1”); IPEndPoint myServer=new IPEndPoint(myServerIP,13); 5、Internet控制报文协议 ——ICMP的作用与特点 ICMP的特点: l ICMP本身是网络层的一个协议; l ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因; l ICMP并不能保证所有的IP数据报都能够传输到目的主机; l ICMP不能纠正差错,它只是报告差错。差错处理需要由高层协议去完成。 (2)程序设计分析(即程序设计流程) 1、新建一个Windows应用程序项目,设计界面如: 2、使用的名称空间:(useing) System、System.Collections.Generic、System.ComponentModel、System.Data、System.Drawing、System.Text、System.Windows.Forms、System.Net.Sockets、System.Net。 3、添加成员 public class IcmpPacket { public Byte Type; // 消息类型 public Byte SubCode; // 子码类型 public UInt16 CheckSum; // 校检和 public UInt16 Identifier; // 标志符 public UInt16 SequenceNumber; // 顺序号 public Byte[] Data; // 数据 } // ICMP包 4、对ICMP报文的操作控制 //声明常量 const int SOCKET_ERROR = -1; const int ICMP_ECHO = 8; public static Int32 Serialize(IcmpPacket packet, Byte[] Buffer, Int32 PacketSize, Int32 PingData) {// 取得报文内容,转化为字节数组,然后计算报文的长度 Int32 cbReturn = 0; //数据报结构转化为数组 int Index = 0; Byte[] b_type = new Byte[1]; b_type[0] = (packet.Type); Byte[] b_code = new Byte[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; return cbReturn; } cbReturn = Index; return cbReturn; } /// <summary> /// 校验和算法 /// </summary> public static UInt16 checksum(UInt16[] buffer, int size) { Int32 cksum = 0; int counter; counter = 0; /*把ICMP报头二进制数据以2字节为单位累加起来*/ while (size > 0) { UInt16 val = 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 事件代码: private void button1_Click(object sender, EventArgs e) {//执行PING this.richTextBox1.Text=""; for(int p=0;p<10;p++) { try { string HostName=this.textBox1.Text; int nBytes = 0; int dwStart = 0, dwStop = 0; //初始化一个ICMP类型的Socket Socket socket = new Socket(AddressFamily.InterNetwork , SocketType.Raw, ProtocolType.Icmp); //取得目标主机的主机名 IPHostEntry serverHE= Dns.GetHostByName(HostName); IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0); EndPoint epServer = (ipepServer); IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0); EndPoint EndPointFrom = (ipEndPointFrom); int PacketSize = 0; IcmpPacket packet = new IcmpPacket(); // 构造数据报 packet.Type = ICMP_ECHO; packet.SubCode = 0; packet.CheckSum = UInt16.Parse("0"); packet.Identifier = UInt16.Parse("45"); packet.SequenceNumber = UInt16.Parse("0"); int PingData = 32; // sizeof(IcmpPacket) - 8; packet.Data = new Byte[PingData]; //初始化 Packet.Data for (int i = 0; i < PingData; i++) { packet.Data[i] = (byte)'#'; } //保存数据报的长度 PacketSize = PingData + 8; Byte [] icmp_pkt_buffer = new Byte[ PacketSize ]; Int32 Index = 0; //调用Serialize方法 //报文总共的字节数 Index = Serialize( packet, icmp_pkt_buffer, PacketSize, PingData ); if( Index == -1 ) { this.richTextBox1.Text+="报文大小有错!\n"; return ; } // 转化为Uint16类型的数组,取得数据报长度的一半 Double double_length = Convert.ToDouble(Index); Double dtemp = Math.Ceiling( double_length / 2); int cksum_buffer_length = Convert.ToInt32(dtemp); //生成一个字节数组 UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length]; //初始化 Uint16类型 array int icmp_header_buffer_index = 0; for( int i = 0; i < cksum_buffer_length; i++ ) { cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index); icmp_header_buffer_index += 2; } //调用checksum,返回检查和 UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length); //检查和存在报文中 packet.CheckSum = u_cksum; Byte [] sendbuf = new Byte[ 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 = new Byte[256]; nBytes = 0; //接受字节流 bool recd =false ; int timeout=0 ; //循环检查目标主机响应时间 while(!recd){ nBytes = socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom); if (nBytes == SOCKET_ERROR) { this.richTextBox1.Text+="目标主机没有响应!\n" ; recd=true ; break;} else if(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(Exception Err){ MessageBox.Show("PING目标主机操作失败!错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}}} 6、添加扫描端口的Click事件 private void button2_Click(object sender, EventArgs e) {//扫描端口 int iStart = (int)this.numericUpDown1.Value; int iEnd = (int)this.numericUpDown2.Value; try { this.progressBar1.Minimum = iStart; this.progressBar1.Maximum = iEnd; this.richTextBox2.Text = "程序开始扫描端口:\n"; this.richTextBox2.Update(); for (int i = iStart; i < iEnd; i++) { this.progressBar1.Value = i; TcpClient MyTCP = null; try{MyTCP = new TcpClient(this.textBox1.Text, i); this.richTextBox2.Text += "端口 " + i.ToString() + " 开放!\n"; this.richTextBox2.Update(); } Catch{} } this.richTextBox2.Text += "扫描端口结束!\n"; } catch (Exception Err) { MessageBox.Show("扫描端口操作发生错误,错误信息是:" + Err.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }}}} 7、运行结果: 五、课程设计心得体会 经过这次课程设计,让我对网络编程有了一定的程度上的掌握。基于C#的编程技术有了些提高,总结如下: 1、对Microsoft.NET平台的体系结构的了解 Microsoft .NET 框架是一个平台,它提供了一个多语 言编程环境,同时集成了应用程序和服务,为Internet规 模应用程序的部署和操作提供了高度的灵活性。 .NET 框架主要由以下几个主要部分组成:.NET支持的 语言、公共语言执行环境(Common Language Runtime)、 统一类库的分层集合和ASP.NET。 2、对类库的熟悉 类库是一个由 Microsoft .NET Framework SDK 中 包含的类、接口和值类型组成的库。该库提供对系统功能的访问,是建立 .NET Framework 应用程序、组件和控件的基础。 .NET类库提供了企业级开发所需要的各种功能,完全支持Web标准及其应用,而且使用简单,扩充方便。 3、对端口扫描器的了解:   端口扫描器并不是一个直接攻击网络漏洞的程序,它仅仅能帮助发现目标机的某些内在的弱点。一个好的扫描器还能对它得到的数据进行分析,帮助查找目标计算机的漏洞。但它不会提供一个系统的详细步骤。 在编写扫描器程序永乐很多TCP/IP协议程序编写和C#语言的知识。需要一些Socket编程的背景,一种在开发客户/服务应用程序的方法。 4、增强了合作的能力 在此感谢我的搭档——卓多伟同学,在和她合作的过程中,能够积极得给我指出问题,并帮助我解决问题,让我对网络编程有了更深刻的了解。同时也感谢我们的指导老师——刘海波老师,在我们做课设时能耐心的指导。这次的课设,由于并不要求完全靠自己做,主要的目的是能够读懂代码。我们感觉自己在这次课设的过程中,基本上能够掌握了这种能力。希望自己以后能够独立的设计出自己的程序!
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服