sniffer实验报告.docx
《sniffer实验报告.docx》由会员分享,可在线阅读,更多相关《sniffer实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
sniffer实验报告
实验一:
网络嗅探器(sniffer)
——040940207李孟杰
实验中遇到的问题:
问题一:
在点击sinffwindow中button控件时,出现了invalidoperationexception的异常?
?
经过查阅得到,访问windows窗体的本质上不是线程安全的,如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
还可能出现其他与控件相关的bug,包括争用情况和死锁。
在调试器中运行应用程序时,如果创建某控件的线程之前外的其他线程调用该控件,则调试器会引发一个invalidoperationexception,并提示消息:
“从不是创建控件的controlname的线程访问它。
解决一:
在相应的sinffwindow的sniffwindow_load中直接添加,Checkforlllegalcrossthreadcalls=false直接运用VS2003中的状态,避免这种异常。
解决二:
利用delegate进行托管。
如果从一个线程调用控件的方法,那么必须使用控件的一个invoke方法来将调用封送到适当的线程。
该属性可应用于确定是否必须调用invoke,当不知道什么线程拥有控件时这很有用:
首先定义一个委托,与这个事件处理函数的签名一样委托,当然直接使用该时间的委托也是可以的。
在调用invokerequired时,返回当前线程是否等于new的时候记录下来的那个线程。
如果invokerequired==true表示其他线程需要访问控件,那么调用invoke来转给控件的owner处理。
1.1网络嗅探的简介
网络嗅探器又称为网络监听器,简称为Sniffer子系统,放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,这些数据可以是用户的账号和密码,可以是一些商用机密数据等等。
Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。
Sniffer的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。
例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。
而嗅探器也可作为攻击工具被黑客所利用为其发动进一步的攻击提供有价值的信息。
基于网卡混杂模式的嗅探原理
在网络中,嗅探器接收所有的分组,而不发送任何非法分组。
它不会妨碍网络数据的流动,因此很难对其进行检测。
不过,处于混杂模式网卡的状态很显然和处于普通模式下不同。
在混杂模式下,应该被硬件过滤掉的分组文会进入到系统的内核。
是否回应这种分组完全依赖与内核。
下面我举一个现实世界中的例子,说明我们检测处于混杂模式网络节点的方法。
设想一下,在一个会议室中正在举行一个会议。
某个人把耳朵放在会议室就可以进行窃听。
当她进行窃听时,会屏住呼吸,安静地聆听会议室内所有的发言。
然而,如果此时会议室内有人忽然叫窃听者的名字:
“太太”,她就可能答应“唉”。
这听起来有点好笑,但是完全可以用于网络嗅探行为的检测。
网络进行网络嗅探的节点会接收网络的所有报文,因此其内核可能对某些本该被硬件过滤的分组作出错误回应。
根据这个原理,我们可以通过检查节点对ARP报文的响应来检测网络的嗅探行为。
实验截图:
实验源码附带:
/用一个结构体定义ip头格式,还为这个结构体附加了structlayout的特性,可以控制此结构体数据域的物理分布
//explicit用来控制每一个数据成员的精确位置。
//使用explicit时,要求每一个成员必须使用fieldoffset来指明该域所占的物理位置。
[StructLayout(LayoutKind.Explicit)]
publicstructIPHeader
{
[FieldOffset(0)]publicbyteip_verlen;//IPversionandIPHeaderlengthCombined
[FieldOffset
(1)]publicbyteip_tos;//TypeofService
[FieldOffset
(2)]publicushortip_totallength;//TotalPacketLength
[FieldOffset(4)]publicushortip_id;//UniqueID
[FieldOffset(6)]publicushortip_offset;//FlagsandOffset
[FieldOffset(8)]publicbyteip_ttl;//TimeToLive
[FieldOffset(9)]publicbyteip_protocol;//Protocol(TCP,UDP,ICMP,Etc.)
[FieldOffset(10)]publicushortip_checksum;//IPHeaderChecksum
[FieldOffset(12)]publicuintip_srcaddr;//SourceIPAddress
[FieldOffset(16)]publicuintip_destaddr;//DestinationIPAddress
}
///
///Arawsocketforsniffing
///
publicclassSniffSocket
{
privateboolkeepRunning;
privatestaticintrcv_buf_len;//定义一个接受到的最大包的长度。
privatebyte[]rcv_buf_bytes;//用于存放所收到的包的内容
privateSocketsocket=null;//定义一个套接字。
//privateIAsyncResultar;
///
///Initializethesocketparameter
///
publicSniffSocket()
{
//
//TODO:
Addconstructorlogichere
//
rcv_buf_len=4096;
rcv_buf_bytes=newbyte[rcv_buf_len];
}
///
///Keepreceiving.
///
publicboolKeepRunning
{
get
{
returnkeepRunning;
}
set
{
keepRunning=value;
}
}
///
///Createandbindasocket
///
///ipforbinding
publicvoidCreateAndBindSocket(stringIP)
{
//用于完成套接字的创建和绑定;
//利用sockettype.raw提供了ip层的链接。
socket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP);
socket.Blocking=false;//用来指明是非阻塞状态。
//用于将socket绑定在ip地址上,端口为.
socket.Bind(newIPEndPoint(IPAddress.Parse(IP),0));//用于将IP地址转换成为ipaddress形式。
//用来设置socket的属性。
SetSocketOption();
}
unsafeprivatevoidReceive(byte[]buf,intlen)
{
bytetemp_protocol=0;
uinttemp_version=0;
uinttemp_ip_srcaddr=0;
uinttemp_ip_destaddr=0;
shorttemp_srcport=0;
shorttemp_dstport=0;
IPAddresstemp_ip;
PacketArrivedEventArgse=newPacketArrivedEventArgs();
//用fixed的关键字来锁定buf数组所处的内存空间。
fixed(byte*fixed_buf=buf)
{
IPHeader*head=(IPHeader*)fixed_buf;
e.HeaderLength=(uint)(head->ip_verlen&0x0F)<<2;
temp_protocol=head->ip_protocol;
switch(temp_protocol)
{
case1:
e.Protocol="ICMP:
";break;
case2:
e.Protocol="IGMP:
";break;
case6:
e.Protocol="TCP:
";break;
case17:
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=newIPAddress(temp_ip_srcaddr);
e.OriginationAddress=temp_ip.ToString();
temp_ip=newIPAddress(temp_ip_destaddr);
e.DestinationAddress=temp_ip.ToString();
temp_srcport=*(short*)&fixed_buf[e.HeaderLength];
temp_dstport=*(short*)&fixed_buf[e.HeaderLength+2];
e.OriginationPort=((ushort)IPAddress.NetworkToHostOrder(temp_srcport)).ToString();
e.DestinationPort=((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);
}
OnPacketArrival(e);
}
///
///UserdefinedPacketArrivedEvent
///
//通过c#的事件机制传递接收到的包的信息
publicclassPacketArrivedEventArgs:
EventArgs
{
privatestringprotocol;//协议名
privatestringdestination_port;
privatestringorigination_port;
privatestringdestination_address;
privatestringorigination_address;
privatestringip_version;
privateuinttotal_packet_length;
privateuintmessage_length;
privateuintheader_length;
privatebyte[]receive_buf_bytes=null;
privatebyte[]ip_header_bytes=null;
privatebyte[]message_bytes=null;
publicPacketArrivedEventArgs()
{
this.protocol="";
this.destination_port="";
this.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=newbyte[rcv_buf_len];
this.ip_header_bytes=newbyte[rcv_buf_len];
this.message_bytes=newbyte[rcv_buf_len];
}
publicstringProtocol
{
get{returnprotocol;}
set{protocol=value;}
}
publicstringDestinationPort
{
get{returndestination_port;}
set{destination_port=value;}
}
publicstringOriginationPort
{
get{returnorigination_port;}
set{origination_port=value;}
}
publicstringDestinationAddress
{
get{returndestination_address;}
set{destination_address=value;}
}
publicstringOriginationAddress
{
get{returnorigination_address;}
set{origination_address=value;}
}
publicstringIPVersion
{
get{returnip_version;}
set{ip_version=value;}
}
publicuintPacketLength
{
get{returntotal_packet_length;}
set{total_packet_length=value;}
}
publicuintMessageLength
{
get{returnmessage_length;}
set{message_length=value;}
}
publicuintHeaderLength
{
get{returnheader_length;}
set{header_length=value;}
}
publicbyte[]ReceiveBuffer
{
get{returnreceive_buf_bytes;}
set{receive_buf_bytes=value;}
}
publicbyte[]IPHeaderBuffer
{
get{returnip_header_bytes;}
set{ip_header_bytes=value;}
}
publicbyte[]MessageBuffer
{
get{returnmessage_bytes;}
set{message_bytes=value;}
}
publicoverridestringToString()
{
returnprotocol+origination_address+"\t"+destination_address;
}
}
//声明一个托管,实现对c#事件的一个实现,
publicdelegatevoidPacketArrivedEventHandler(Objectsender,PacketArrivedEventArgsargs);
//声明一个事件,
publiceventPacketArrivedEventHandlerPacketArrival;
protectedvirtualvoidOnPacketArrival(PacketArrivedEventArgse)
{
if(PacketArrival!
=null)
{
PacketArrival(this,e);
}
}
///
///Userdefinedexception
///
publicclassSniffSocketException:
Exception
{
publicSniffSocketException():
base()
{}
publicSniffSocketException(stringmessage):
base(message)
{}
publicSniffSocketException(stringmessage,ExceptioninnerException):
base(message,innerException)
{}
}
}
}
实验心得:
通过这次实验使我明白了自己原来知识还比较欠缺。
自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。
通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
在这次实验中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。