网络安全课程设计-网络嗅探器的制作.doc

上传人:good****022 文档编号:116538345 上传时间:2022-07-05 格式:DOC 页数:27 大小:503KB
返回 下载 相关 举报
网络安全课程设计-网络嗅探器的制作.doc_第1页
第1页 / 共27页
网络安全课程设计-网络嗅探器的制作.doc_第2页
第2页 / 共27页
网络安全课程设计-网络嗅探器的制作.doc_第3页
第3页 / 共27页
点击查看更多>>
资源描述
南昌航空大学信息工程学院信息安全课程设计学 院 信息工程学院 专 业 网络工程 班 级 130461班 课题名称 网络嗅探器的制作 开课时间 2015至 2016 学年 第 二 学期 地点 D405 目录目录1一、选题背景与意义2二、需求分析32.1需求分析32.2功能分析3三、概要设计43.1功能图43.2设计界面4四、详细设计与实现64.1文字介绍实现的方法64.1.1程序流程图74.1.2 关键技术7(1)socket创建7(2)数据类型分析84.2具体界面展示及运行结果94.3关键代码13(1)数据包的捕获13(2)数据包的显示16(3)日志文件的保存23(4)抓包信息的过滤23五、课设小结25六、参考文献26一、选题背景与意义随着计算机网络技术的快速发展,网络己成为人们生活中的必备工具,计算机网络在政治、经济、军事、社会生活等各个领域正发挥着日益重要的作用,人们对计算机网络的依赖性也大大增强,一些网络新业务如电子商务、移动支付等,这些都对网络安全 提出了较高的要求。但是由于计算机网络具有连接形式多样性、开放性、互联性等特点,而且多数都采用TCP/TP协议,而TCP/TP在设计上力求运行效率,并建立在相互信任的基础上,其本身就是造成网络不安全的主要因素,这也是TCP/TP协议在设计上的缺陷,从而导致针对网络系统的攻击事件频繁发生,所以网络安全已成为网络建设的一个非常重要的方面。现在人们对计算机信息安全要求越来越高,随着计算机网络的资源共享进一步加强,随之而来的网络安全问题使得计算机网络安全保护将会变得越来越重要。所以当我们在享受网络所带来的方便和快捷的同时也要认识到网络安全所面临的严峻考验。在防范网络攻击方面,通过数据截取及分析输出结果可以捕获到透过防火墙而进入网络的非法数据,成功的监视记录黑客的入侵过程,保障网络的安全。而且数据截取和协议分析是入侵检测系统的重要部分,是入侵检测系统的最基础的环节。二、需求分析2.1需求分析实现Sniffer的基本功能。Sniffer是一种用于监测网络性能、使用情况的工具。能够侦听所有进出本主机的数据包,完整显示数据包网络层和传输层(ICMP、IP、TCP和UDP)的头信息。比如,对IP头而言,需要显示版本、头长度、服务类型、数据包长度、标识、DF/MF标志、段内偏移、生存期、协议类型、源目的IP地址、选项内容。要求显示数据的实际含义;侦听来源于指定IP地址的数据,显示接收到的TCP数据包的全部实际内容。需要考虑一个TCP包划分为多个IP包传输的情况;功能验证手段:在运行Sniffer的同时,执行标准的Ping、Telnet和浏览网页等操作,检查Sniffier能否返回预期的结果。2.2功能分析有于水平有限,不可能实现Sniffer或者wireshark那样复杂的设置和分析,所以我们只对抓取到的本机在网络中的通信数据(如协议类型,源、目的地址和端口、数据包的大小等)加以分析,实现一个简单的网络嗅探器。一个窗体显示主页面,另一个页面显示详细的包信息。详细信息页面,我们显示一下信息:开始时间:嗅探器抓取数据包的时间;源端口:源目的IP地址+端口号;目的端口:目的IP地址+端口号;协议类型:只分析一下类型,GPG,ICMP,IDP,IGMP,IP,ND,PUP,TCP,UDP,其他的不再分析;抓包时间:;报头大小:报文报首部大小;报文总长:整个数据报的大小;三、概要设计网络嗅探器3.1功能图数据包的显示混杂模式的开启及套接字的调用网卡信息的获取及本机IP的获取数据包的过滤及显示数据包的日志文件保存数据包的捕获图1 网络嗅探器的功能结构图3.2设计界面工具:Visual studio 2013使用编程语言:C#窗体编程Button类实现的功能有:开始,暂停,清除信息,显示所有信息,保存日志文件、过滤抓包信息Textbox:显示本机IP地址、输入IP地址用来过滤出所需的抓包信息Listview:显示抓包的详细信息,包括源IP,源端口,目的IP,目的端口,传输协议类型,时间,总长度,抓包信息显示Richtextbox:显示抓包的具体内容Lable标签:解释信息,显示具体的接收信息和抓包长度,做注释用具体控件的定义private System.Windows.Forms.CheckBox filterCheckBox; private System.Windows.Forms.Button startButton; private System.Windows.Forms.Button stopButton; private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.TextBox ipTextBox; private System.Windows.Forms.Label hintLabel; private MyButton clearButton; private System.Windows.Forms.BindingSource packetBindingSource; private System.Windows.Forms.ListView listView; private ColumnHeader header; private ColumnHeader columnHeader1; private ColumnHeader columnHeader2; private ColumnHeader columnHeader3; private ColumnHeader columnHeader4; private ColumnHeader columnHeader5; private ColumnHeader columnHeader6; private ColumnHeader columnHeader7; private ColumnHeader columnHeader8; private ComboBox typeComboBox; private MyRichTextBox hexTextBox; private MyRichTextBox charTextBox; private Button allButton; private Button filterButton; private ToolTip toolTip2; private ToolTip toolTip3; private Label label1; private Label label2; private TextBox textBox1; private RichTextBox richTextBox1; private Button button1; private Label label3; private Button ToolStripMenuItem;四、详细设计与实现4.1文字介绍实现的方法具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。4.1.1程序流程图关闭套接字是开始建立套接字绑定套接字设置网卡为混杂模式初始化数据包接收结构停止接收分析处理数据包否开始捕获显示分析结果图2 嗅探器工作流程如图2所示,在利用套接字开发网络嗅探器程序时的一般步骤是:首先,创建原始套接字,并设置其操作选项;其次将原始套接字绑定到本地网卡地址上;设置网卡为混杂模式,这样网卡就可以收到任何在网络中传输的数据包;在以上条件下开始对数据包进行捕获、分析。4.1.2 关键技术(1)socket创建网络嗅探器作为一种网络通讯程序,是通过对网卡的编对网卡的编程是使用Socket函数来实现的。是引用网络连接的特殊的文件描述符,是在客户和服务器之间通信的实体。当客户连接到服务器时,就会有两socket:客户方socket和对应的服务器端的套接字,这里将它们称作CLIENTSOCK 和 SERVERSOCK。当客户方在 CLIENTSOCK 使用 send()函数时,服务器方可以在 SERVERSOCK 上使用 recv()函数来获取客户方发送的数据。反之亦然。socket由三个基本要素组成:网络类型、数据传输类型、采用的网络协议。socket编程是网络编程的核心。以下是创建socket的代码:SOCKETconn;Conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(conn=INVAILD_SOCKET);return;原始socket是允许访问底层传输协议的一种socket 类型。使用原始socket操作 IP 数据报,可以进行路由跟踪、Ping等。另外,使用原始socket需要知道许多下层协议结构的知识。原始socket有两种类型,第一种类型是在 IP 头中使用预定义的协议, ICMP;如第二种类型是在 IP 头中使用自定义的协议1718。(2)数据类型分析套接字程序接收到 IP 数据包之后,调用自定义函数 DecodeIPPacket 进行解析。这个函数萃取出数据包中的协议头,向用户输出协议信息。即在设置SIO_RCVALLioctl 之后,在原始套接字上对 recv/WSARecv的调用将返回 IP 数据报,其中包含了完整的 IP 头, 头后面IP可能是 UDP 头,也可能是 TCP 头,这要看发送封包用户所使用的协议了。数据从应用层到达传输层时,将添加 TCP 数据段头或者是 UDP 数据段头。下面分别给出 TCP 数据包结构和 UDP 数据包结构。其中 TCP 数据头比较麻烦,它以 20 个固定字节开 而始,在固定头后面还可以有一些长度不固定的可选项。 UDP的数据段头相对来讲比较简单,它由 8 字节的头和数据部分组成。此外,从封包中萃取出 TCPHeader 或 UDPHeader 之后,还可以根据目的端口号进一步分析用户在应用层使用协议类型,例如目的的端口号为 25,则说明使用的是 SMTP,端口号为 110,则说明使用的是 POP3。4.2具体界面展示及运行结果图3 网络嗅探器的整体界面图4 开始抓包图5 双击鼠标显示抓包详细信息图6 通过源IP过滤抓包图7 通过目的IP抓包图8 清除所有抓包信息图9 保存抓包日志文件图10 打开抓包日志文件4.3关键代码(1)数据包的捕获class Monitor/记录 private const int SECURITY_BUILTIN_DOMAIN_RID = 0 x20; private const int DOMAIN_ALIAS_RID_ADMINS = 0 x220; private const int IOC_VENDOR = 0 x18000000; private const int IOC_IN = -2147483648; /0 x80000000; private const int SIO_RCVALL = IOC_IN | IOC_VENDOR | 1; private const int BUF_SIZE = 1024 * 1024;/设置缓冲区大小保存抓包文件 private Socket monitor_Socket;/监控函数套接字 private IPAddress ipAddress;/获取IP private byte buffer;/缓冲区 public Monitor(IPAddress ip) this.ipAddress = ip;this.buffer = new byteBUF_SIZE;/缓冲区的大小Monitor() stop(); public void start()/定义的开始基类 if (monitor_Socket = null) try if (ipAddress.AddressFamily = AddressFamily.InterNetwork) monitor_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, System.Net.Sockets.ProtocolType.IP); else monitor_Socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Raw, System.Net.Sockets.ProtocolType.IP); monitor_Socket.Bind(new IPEndPoint(ipAddress, 0); monitor_Socket.IOControl(SIO_RCVALL, BitConverter.GetBytes(int)1), null); monitor_Socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); catch(Exception e) monitor_Socket.Close(); monitor_Socket = null; Console.WriteLine(e.ToString(); public void stop() if(monitor_Socket != null) monitor_Socket.Close(); monitor_Socket = null; private void OnReceive(IAsyncResult ar)/返回值处理 try int len = monitor_Socket.EndReceive(ar); if (monitor_Socket != null) byte receivedBuffer = new bytelen; Array.Copy(buffer, 0, receivedBuffer, 0, len); try Packet packet = new Packet(receivedBuffer); OnNewPacket(packet); catch (ArgumentNullException ane) Console.WriteLine(ane.ToString(); catch (ArgumentException ae) Console.WriteLine(ae.ToString(); monitor_Socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); catch stop(); protected void OnNewPacket(Packet p) if (newPacketEventHandler != null) newPacketEventHandler(this, p); public event NewPacketEventHandler newPacketEventHandler; public delegate void NewPacketEventHandler(Monitor monitor, Packet p); / / 检查当前用户是否是管理员; / / private bool IsUserAnAdmin() WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); DllImport(advapi32.dll) private extern static int AllocateAndInitializeSid(byte pIdentifierAuthority, byte nSubAuthorityCount, int dwSubAuthority0, int dwSubAuthority1, int dwSubAuthority2, int dwSubAuthority3, int dwSubAuthority4, int dwSubAuthority5, int dwSubAuthority6, int dwSubAuthority7, out IntPtr pSid); DllImport(advapi32.dll) private extern static int CheckTokenMembership(IntPtr TokenHandle, IntPtr SidToCheck, ref int IsMember); DllImport(advapi32.dll) private extern static IntPtr FreeSid(IntPtr pSid); (2)数据包的显示在richtextbox中显示抓包信息:private void allButton_Click(object sender, EventArgs e) this.listView.Items.Clear(); pList.Clear(); Packet p; for (int i = 0; i allList.Count; i+) p = allListi; pList.Add(p); this.listView.Items.Add(new ListViewItem(new string p.Src_IP, p.Src_PORT,p.Des_IP, p.Des_PORT, p.Type, p.Time, p.TotalLength.ToString(), p.getCharString(); clearDetail(); MessageBox.Show(已重新加载信息!); 在listview中显示抓包的情况:private void listView_SelectedIndexChanged(object sender, EventArgs e)/抓包信息显示部分 ListView listView = sender as ListView; if (listView.SelectedItems != null & listView.SelectedItems.Count != 0) Packet p = pListlistView.SelectedItems0.Index; /MessageBox.Show(charLength: + p.getCharString().Length + n + hexLength: + p.getHexString().Length); this.hexTextBox.Text = p.getHexString(); this.charTextBox.Text = p.getCharString(); public class Packet/定义抓包的类型,包括抓包的协议类型,总长度,抓包的信息 private const int LineCount = 30; / / 使用枚举来标识协议类型; / enum ProtocolType GGP = 3, ICMP = 1, IDP = 22, IGMP = 2, IP = 4, ND = 77, PUP = 12, TCP = 6, UDP = 17, OTHERS = -1 / / 原始数据包对底层; / private byte raw_Packet; / / 嗅探的时间; / private DateTime dateTime; / / 抓包的协议类型; / private ProtocolType protocolType;/抓包的协议类型 private IPAddress src_IPAddress;/源IP地址 private IPAddress des_IPAddress;/目的IP地址 private int src_Port;/源端口 private int des_Port;/目的端口 private int totalLength;/包的总长度 private int headLength;/头的长度 /尽用于测试 public int HeadLength get return headLength; / / 使用原始的和当前的系统时间来初始化数据包; / / / public Packet(byte raw) /调用此构造函数时,应捕获所有下列异常; if (raw = null) throw new ArgumentNullException(); /当原长度小于20,它一定是错的; if (raw.Length 20) throw new ArgumentException(); raw_Packet = raw; dateTime = DateTime.Now;/抓包时间; /获取包的头长; headLength = (raw0 & 0 x0F) * 4; if (raw0 & 0 x0F) 5) throw new ArgumentException(); / 头是错误的,长度是不正确的; /实际长度与头长度指示器相同吗? if (raw2 * 256 + raw3) != raw.Length) throw new ArgumentException(); / 长度不正确; /获取包的类型; if (Enum.IsDefined(typeof(ProtocolType), (int)raw9) protocolType = (ProtocolType)raw9; else protocolType = ProtocolType.OTHERS; src_IPAddress = new IPAddress(BitConverter.ToUInt32(raw, 12); des_IPAddress = new IPAddress(BitConverter.ToUInt32(raw, 16); totalLength = raw2 * 256 + raw3; /处理特定方法的TCP或UDP; if (protocolType = ProtocolType.TCP | protocolType = ProtocolType.UDP) src_Port = rawheadLength * 256 + rawheadLength + 1; des_Port = rawheadLength + 2 * 256 + rawheadLength + 3; if (protocolType = ProtocolType.TCP) headLength += 20; else if (protocolType = ProtocolType.UDP) headLength += 8; else src_Port = -1; des_Port = -1; / / 可访问的源IP地址; / public string Src_IP get return src_IPAddress.ToString(); /返回 127.0.0.1; / / 可访问的源端口,并把源端口的值返回; / public string Src_PORT get if (src_Port != -1) return src_Port.ToString(); else return ; / / 可访问的IP地址,并把IP地址的值返回; / public string Des_IP get return des_IPAddress.ToString(); / / 可访问的目标端口; / public string Des_PORT get if (des_Port != -1) return des_Port.ToString(); else return ; / / 包的类型; / public string Type get return protocolType.ToString(); / / 包的总长度; / public int TotalLength get return totalLength; / / 实际的抓包时间; / public string Time get return dateTime.ToLongTimeString(); / / 返回的数据包在基本层忽略标题十六进制的进制格式; / / public string getHexString() StringBuilder sb = new StringBuilder(raw_Packet.Length); for (int i = headLength; i TotalLength; i += LineCount) for (int j = i; j TotalLength & j i + LineCount; j+) sb.Append(raw_Packetj.ToString(X2) + ); sb.Append(n); return sb.ToString(); / / 返回忽略底层层中的标题的数据包的字符格式; / / public string getCharString() StringBuilder sb = new StringBuilder(); for(int i = this.HeadLength; i TotalLength; i += LineCount) for (int j = i; j TotalLength & j 31 & raw_Packetj 128) sb.Append(char)raw_Packetj); else sb.Append(.); sb.Append(n); return sb.ToString(); (3)日志文件的保存private void ToolStripMenuItem_Click(object sender, EventArgs e) SaveFileDialog dlg = new SaveFileDialog(); dlg.DefaultExt = .text; /获取或设置默认文件扩展名 dlg.Filter = (.txt)|*.txt; / 获取或设置当前文件名筛选器字符串,该字符串决定对话框的“另存为文件类型”或“文件类型”框中出现的选择内容 DialogResult result = dlg.ShowDialog(); if (result = DialogResult.OK) string filename = dlg.FileName; /获取保存文件的完整路径,包括文件名 try using (StreamWriter sw = new StreamWriter(filename) sw.Write(this.hexTextBox.Text.Replace(n, rn); / sw.WriteLine(this.richTextBox1.Text); catch (Exception) (4)抓包信息的过滤private void filterButton_Click(object sender, EventArgs e) if (this.listView.Items.Count 1) MessageBox.Show(请嗅探和现实所有嗅包优先!); showIPPackets(getFilterCondition(); clearDetail(); / / 根据iptextbox和typecombobox得到过滤条件,包括IP、端口和类型; / default value ; / / private string getFilterCondition()/获取抓包的情况 string conditions = , , ; string tmpString = this.ipTextBox.Text; int port = 0; if (this.typeComboBox.SelectedIndex -1) conditions2 = this.typeComboBox.SelectedItem.ToString(); if (tmpString.Contains(/) | tmpString.Contains(:)/IP:PORT OR IP/PORT显示端口 string arr = null, null ; if (tmpString.Contains(/) arr = tmpString.Split(new char / ); else arr = tmpString.Split(new char : ); conditions0 = arr0; conditions1 = arr1; else if (int.TryParse(tmpString, out port)/just port;仅显示端口 conditions1 = port.ToString(); else/just IP; conditions0 = tmpString; /Console.WriteLine(conditions); return conditions; private void showIPPackets(string conditions) string ipString = conditions0; string
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 休闲娱乐


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!