1、sniffer实验报告 实验一:网络嗅探器(sniffer) 040940207 李孟杰实验中遇到的问题:问题一:在点击sinffwindow中button控件时,出现了invalidoperationexception的异常?经过查阅得到,访问windows窗体的本质上不是线程安全的,如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与控件相关的bug,包括争用情况和死锁。在调试器中运行应用程序时,如果创建某控件的线程之前外的其他线程调用该控件,则调试器会引发一个invalidoperationexception,并提示消息:“从不是创建控件的co
2、ntrol name的线程访问它。解决一: 在相应的 sinffwindow 的sniffwindow_load中直接添加, Checkforlllegalcrossthreadcalls=false 直接运用VS2003中的状态,避免这种异常。解决二: 利用delegate进行托管。如果从一个线程调用控件的方法,那么必须使用控件的一个invoke方法来将调用封送到适当的线程。该属性可应用于确定是否必须调用invoke,当不知道什么线程拥有控件时这很有用: 首先定义一个委托, 与这个事件处理函数的签名一样委托,当然直接使用该时间的委托也是可以的。在调用invoke required时,返回当前
3、线程是否等于new的时候记录下来的那个线程。如果 invoke required=true表示其他线程需要访问控件,那么调用invoke来转给控件的owner处理。1.1 网络嗅探的简介网络嗅探器又称为网络监听器,简称为Sniffer子系统,放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,这些数据可以是用户的账号和密码,可以是一些商用机密数据等等。Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。Sniffer的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的
4、发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。而嗅探器也可作为攻击工具被黑客所利用为其发动进一步的攻击提供有价值的信息。基于网卡混杂模式的嗅探原理在网络中,嗅探器接收所有的分组,而不发送任何非法分组。它不会妨碍网络数据的流动,因此很难对其进行检测。不过,处于混杂模式网卡的状态很显然和处于普通模式下不同。在混杂模式下,应该被硬件过滤掉的分组文会进入到系统的内核。是否回应这种分组完全依赖与内核。 下面我举一个现实世界中的例子,说明我们检测处于混杂模式网络节点的方法。设想一下,在一个会议室中正在举行一个会议。某个人把耳朵放在会议室就可以进行窃听。当
5、她进行窃听时,会屏住呼吸,安静地聆听会议室内所有的发言。然而,如果此时会议室内有人忽然叫窃听者的名字:“太太”,她就可能答应“唉”。这听起来有点好笑,但是完全可以用于网络嗅探行为的检测。网络进行网络嗅探的节点会接收网络的所有报文,因此其内核可能对某些本该被硬件过滤的分组作出错误回应。根据这个原理,我们可以通过检查节点对ARP报文的响应来检测网络的嗅探行为。实验截图: 实验源码附带:/用一个结构体定义ip头格式,还为这个结构体附加了structlayout的特性,可以控制此结构体数据域的物理分布 / explicit用来控制每一个数据成员的精确位置。 / 使用explicit时,要求每一个成员必
6、须使用fieldoffset来指明该域所占的物理位置。 StructLayout(LayoutKind.Explicit) public struct IPHeader FieldOffset(0) public byte ip_verlen; /IP version and IP Header length Combined FieldOffset(1) public byte ip_tos; /Type of Service FieldOffset(2) public ushort ip_totallength; /Total Packet Length FieldOffset(4) pu
7、blic ushort ip_id; /Unique ID FieldOffset(6) public ushort ip_offset; /Flags and Offset FieldOffset(8) public byte ip_ttl; /Time To Live FieldOffset(9) public byte ip_protocol; /Protocol (TCP, UDP, ICMP, Etc.) FieldOffset(10) public ushort ip_checksum; /IP Header Checksum FieldOffset(12) public uint
8、 ip_srcaddr; /Source IP Address FieldOffset(16) public uint ip_destaddr; /Destination IP Address / / A raw socket for sniffing/ public class SniffSocket private bool keepRunning; private static int rcv_buf_len;/定义一个接受到的最大包的长度。 private byte rcv_buf_bytes;/用于存放所收到的包的内容 private Socket socket=null;/定义一个
9、套接字。/ private IAsyncResult ar; / / Initialize the socket parameter / public SniffSocket() / / TODO: Add constructor logic here / rcv_buf_len=4096; rcv_buf_bytes=new byte rcv_buf_len; / / Keep receiving. / public bool KeepRunning get return keepRunning; set keepRunning=value; / / Create and bind a so
10、cket / / ip for binding public void CreateAndBindSocket(string IP) /用于完成套接字的创建和绑定; / 利用sockettype.raw 提供了ip层的链接。 socket=new Socket (AddressFamily.InterNetwork ,SocketType.Raw ,ProtocolType.IP ); socket.Blocking =false;/用来指明是非阻塞状态。 /用于将socket绑定在ip地址上,端口为. socket.Bind (new IPEndPoint (IPAddress.Parse
11、(IP),0);/用于将IP地址转换成为ipaddress形式。 /用来设置socket的属性。 SetSocketOption(); unsafe private void Receive(byte buf, int len) byte temp_protocol=0; uint temp_version=0; uint temp_ip_srcaddr=0; uint temp_ip_destaddr=0; short temp_srcport=0; short temp_dstport=0; IPAddress temp_ip; PacketArrivedEventArgs e=new P
12、acketArrivedEventArgs(); /用fixed的关键字来锁定buf数组所处的内存空间。 fixed(byte *fixed_buf = buf) IPHeader * head = (IPHeader *) fixed_buf; e.HeaderLength=(uint)(head-ip_verlen & 0x0F) ip_protocol; switch(temp_protocol) case 1: e.Protocol=ICMP:; break; case 2: e.Protocol=IGMP:; break; case 6: e.Protocol=TCP:; break
13、; case 17: e.Protocol=UDP:; break; default: e.Protocol= UNKNOWN; break; temp_version =(uint)(head-ip_verlen & 0xF0) 4; e.IPVersion = temp_version.ToString(); temp_ip_srcaddr = head-ip_srcaddr; temp_ip_destaddr = head-ip_destaddr; temp_ip = new IPAddress(temp_ip_srcaddr); e.OriginationAddress =temp_i
14、p.ToString(); temp_ip = new IPAddress(temp_ip_destaddr); e.DestinationAddress = temp_ip.ToString(); temp_srcport = *(short *)&fixed_bufe.HeaderLength; temp_dstport = *(short *)&fixed_bufe.HeaderLength+2; e.OriginationPort=(ushort)IPAddress.NetworkToHostOrder(temp_srcport).ToString(); e.DestinationPo
15、rt=(ushort)IPAddress.NetworkToHostOrder(temp_dstport).ToString(); e.PacketLength =(uint)len; e.MessageLength =(uint)len - e.HeaderLength; e.ReceiveBuffer=buf; Array.Copy(buf,0,e.IPHeaderBuffer,0,(int)e.HeaderLength); Array.Copy(buf,(int)e.HeaderLength,e.MessageBuffer,0,(int)e.MessageLength); OnPacke
16、tArrival(e); / / User defined Packet Arrived Event / / 通过c#的事件机制传递接收到的包的信息 public class PacketArrivedEventArgs : EventArgs private string protocol; /协议名 private string destination_port; private string origination_port; private string destination_address; private string origination_address; private s
17、tring ip_version; private uint total_packet_length; private uint message_length; private uint header_length; private byte receive_buf_bytes = null; private byte ip_header_bytes = null; private byte message_bytes = null; public PacketArrivedEventArgs() this.protocol = ; this.destination_port = ; this
18、.origination_port = ; this.destination_address = ; this.origination_address = ; this.ip_version = ; this.total_packet_length =0; this.message_length =0; this.header_length =0; this.receive_buf_bytes=new bytercv_buf_len; this.ip_header_bytes=new bytercv_buf_len; this.message_bytes=new bytercv_buf_len
19、; public string Protocol get return protocol; set protocol=value; public string DestinationPort get return destination_port; set destination_port=value; public string OriginationPort get return origination_port; set origination_port=value; public string DestinationAddress get return destination_addr
20、ess; set destination_address=value; public string OriginationAddress get return origination_address; set origination_address=value; public string IPVersion get return ip_version; set ip_version=value; public uint PacketLength get return total_packet_length; set total_packet_length=value; public uint
21、 MessageLength get return message_length; set message_length=value; public uint HeaderLength get return header_length; set header_length=value; public byte ReceiveBuffer get return receive_buf_bytes; set receive_buf_bytes=value; public byte IPHeaderBuffer get return ip_header_bytes; set ip_header_by
22、tes=value; public byte MessageBuffer get return message_bytes; set message_bytes=value; public override string ToString() return protocol+origination_address + t + destination_address; /声明一个托管,实现对c#事件的一个实现, public delegate void PacketArrivedEventHandler(Object sender, PacketArrivedEventArgs args); /
23、声明一个事件, public event PacketArrivedEventHandler PacketArrival; protected virtual void OnPacketArrival(PacketArrivedEventArgs e) if (PacketArrival != null) PacketArrival(this, e); / / User defined exception / public class SniffSocketException:Exception public SniffSocketException():base() public Sniff
24、SocketException(string message):base(message) public SniffSocketException(string message,Exception innerException):base(message,innerException) 实验心得: 通过这次实验使我明白了自己原来知识还比较欠缺。自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。 在这次实验中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1