基于.NET的Sniffers网络嗅探器的设计与实现

时间:2022-09-11 10:48:15

基于.NET的Sniffers网络嗅探器的设计与实现

摘要:随着社会经济与科学技术的发展,网络技术很快融入到了人们的生产和生活中。它不仅仅是一种交流工具,在许多其他的应用领域也起着越来约重要的作用。随之而来的,网络的安全也被逐渐的重视起来。尤其是网络在传输过程中,对数据检测和分析显得尤其重要。Sniffer作为一款数据收集工具,在伴随Internet的发展中受到了包括黑客在内的所有计算机爱好者的青睐。本文结合网络基础知识,研究和学习了Sniffer的基本原理,设计完成了基于.NET的网络嗅探器系统,实现了对网络数据包的检测功能。

关键词:嗅探器,以太网,线程,C#.NET

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)26-6389-03

The Network Sniffers Design And Implemention Based .NET

GAO Hui, SHENG Jian-lun

(Computer Engineering Department Of Qingdao Technological University, Qingdao 266033, China)

Abstract: With the development of society and economy,internet being quickly into our production and social activities. It not only benn used as a kind of communication method of the people of quality. It can develop its special fuction in many applied field,especially in ]transmission of Internet. Then the satety of Internet and the analyse on the transmission of data is munch more cruical. Sniffer as a data collection tool,is liked by all the peple include hackers. In this paper, combined with knowledge of network infrastructure, research and learning the basic principles of the Sniffer and design a network sniffer system based on .NET to realize the network packet detection.

Key words: sniffers; ethernet; thread; C#.NET

1 简介

Sniffers(嗅探器)是伴随Internet产生的,是一种常用的收集有用数据的工具。这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。随着Internet及电子商务的日益普及,Internet的安全也越来越受到重视。在Internet安全隐患中扮演重要角色之一的Sniffer也受到越来越大的关注。

在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 "Sniffer" 程序。这种方法要求运行Sniffer 程序的主机和被监听的主机必须在同一个以太网段上,故而在外部主机上运行Sniffer是没有效果的。再者,必须以root的身份使用Sniffer 程序,才能够监听到以太网段上的数据流。在以太网上Sniffing对网上设备上传送的数据包进行侦听,挖掘感兴趣的包。如果发现符合条件的包,就把它存到一个log文件中去。通常设置的这些条件是包含关键字“username”或“password”的包。这也就是最初破解网络密码的方法。

Sniffer通常运行在路由器,或有路由器功能的主机上。这样就能对大量的数据进行监控。Sniffer属第二层次的攻击。通常是攻击者已经进入了目标系统,然后使用Sniffer这种攻击手段,以便得到更多的信息。

Sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如在网上传送的金融信息等等。Sniffer几乎能得到任何以太网上的传送的数据包。黑客会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证Sniffer能够执行。

以太网Sniffer程序将系统的网络接口设定为混合模式。这样,它就可以监听到所有流经同一以太网网段的数据包,不管它的接受者或发送者是不是运行Sniffer的主机。程序将用户名、密码和其它黑客感兴趣的数据存入log文件。

然而Sniffer的正确应用是用来分析网络流量,以便找出所关心的网络汇总的潜在的问题。例如:假设网络中的某一段运行的不是很好,报文的发送比较慢,而我们又不知道问题处在什么地方,此时就可以用嗅探器来做出精确的问题判断。在合理结构的网络中,Sniffer的存在对网络管理员是至关重要的,网络管理员通过Sniffer可以诊断出大量的不可见的模糊问题,这些问题涉及到多台计算机的异常通讯,甚至各种网络协议。嗅探器获得的各种信息为管理员判断网络问题提供了非常宝贵的信息。图1给出了Sniffer嗅探器的网络层次。

2 Sniffer的设计与实现

2.1 Sniffer的原理

Sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。Sniffer要捕获的信息必须是物理信号能收到的报文信息,这时候就需要通知网卡接受其收到的所有的数据包。即网络上的所有设备都对总线上传送的数据进行侦听,并不仅仅是它们自己的数据,这种模式称为混杂模式(promiscuous)。

2.2 Sniffer的设计

根据原理我们知道当局域网的主机都通过HUB方式进行连接时,即共享式的连接,它有一个很明显的特点:HUB会将接收到的所有数据向HUB上的每个端口转发,也就是说当主机根据MAC地址进行数据包发送时,尽管发送端主机告知目标主机的地址,但这并不意味着在一个网络内的其他主机听不到发送端和接收端之间的通信,只是这些主机判断数据包的目的地址为非自身地址后不予以响应。假如将网卡设置为混杂模式,那么,对于这台主机的网络接口而言,任何在这个局域网内传输的信息都可以被侦听到。Sniffer的工作流程如图2 所示。

获取本地IP地址的目的是在soket绑定是使用,本地IP可以通过自己加入,也可以通过C#平台的DNS函数自动获得,为了操作方便,该Sniffer采用自动获取的方式,该获取IP方式是先通过获取本地主机的主机名然后将主机名转换为IP。实现代码如下:

IPAddress GetHostIp()

{

IPHostEntry MyHostIp = Dns.GetHostEntry(Dns.GetHostName());

IPAddress MyIp=MyHostIp.AddressList[0];

return MyIp;}

然后建立socket套接字并将本地IP地址与一个套接字绑定,即绑定端口。套接字是用于描述IP地址和端口的,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。实现代码如下:

Socket S = new Socket(AddressFamily.InterNetwork,SocketType.Raw,

ProtocolType.IP);

IPEndPoint MyIp = new IPEndPoint(GetHostIp(), 0);

S.Bind(MyIp);

将网卡接口设置为混杂模式,以接受所有流经网络介质的信息包

byte[] output = new byte[4];

byte[] input = new byte[4] { 1, 0, 0, 0 };

S.IOControl(IOControlCode.ReceiveAll,input, output);

在读取数据包之前,为了减少系统负担,提高数据处理效率,需要设置用户缓冲区大小、取样时间以及数据包的抓去长度。用户缓冲区用于存放从内核缓冲区拷贝的网络数据包。取样时间是指当内核缓冲区有数据待读且用户缓冲区没满时,系统向用户发送就绪通知的等待时间。如果取样时间为零,则当内核缓冲区有数据时,系统就会立即发送就绪通知,用户进程就会把数据从内核缓冲区拷贝到用户缓冲区。这样可能会造成过于频繁的通知和拷贝,增加系统负担,降低效率,所以应该设置合适的取样时间。抓取长度是指从内核拷贝空间到用户空间的最大网络长度,超过该长度的包将被截断,以提高数据处理效率。

接下来就是从文件描述字中读取数据,通常是指数据链路层的数据帧,即以太网帧。首先把所有的网络数据包从内核空间拷贝到用户空间,然后由用户进程进行分析,主要分析以太包的包头和TCP/IP包头中的信息,从中选择出用户感兴趣的网络数据包,然后对应用层级协议进行解释,把原始数据转化成用户可以理解的方式输出。

另外,本程序的实现必须使用多线程,单线程是无法完成的,因为程序本身需要检测程序的控制动作,如开始、暂停等。同时还要进行数据包的抓去动作,所以需要分两个线程同时工作。线程的启动代码如下:

Thread SnifferThread ;

SnifferThread = new System.Threading.Thread(new System.Threading.

ThreadStart(RunReceiver));

SnifferThread.Start();

RunReceiver函数用于实现线程的启动和暂停。实现代码如下:

Socket S = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP);

IPEndPoint MyIp = new IPEndPoint(GetHostIp(), 0);

S.Bind(MyIp);

//设置网卡为混杂模式

byte[] output = new byte[4];

byte[] input = new byte[4] { 1, 0, 0, 0 };

S.IOControl(IOControlCode.ReceiveAll,input, output);

//网卡设置完毕

while (SnifferStop.Enabled ==true)

{ System.Threading.Thread.Sleep(1000);

System.IAsyncResult ar = S.BeginReceive(PacketBuffer, 0, 65536, .Sockets.SocketFlags.None,

new System.AsyncCallback(CallReceive), this);

count++;

}

S.Close();

线程是通过判定while (SnifferStop.Enabled ==true)循环进行工作的,所以当snifferstop.enable=false时进程停止。

程序运行情况如图3所示。

3 总结

通过对嗅探器(Sniffer)技术的调研、资料搜集、理论研究、系统设计和系统实现五个阶段的工作,完成了基于C#的网络嗅探器的设计与应用工作,通过测试实现了网络的数据抓包。

参考文献:

[1] 罗森林,高平. 信息系统安全与对抗技术实验教程[M].北京:北京理工大学出版社,2005:1-268.

[2] 周存杰.C#网络编程实例教程[M]. 北京:北京希望电子出版社,2002:1-400.

[3] 陈坚主.Visual C++.NET编程基础专家教程[M]. 西安:西安电子科技大学出版社,2002:1-200.

[4] 郑宇军,崔伟宁,王旦伟. Visual C#案例教程[M]. 北京:北京希望电子出版社,2002:1-302.

[5] 刘甲耀,严桂兰. C#程序设计教程[M]. 北京:电子工业出版社,2007:1-200.

[6] 胡剑锋,姚华,张永主. Visual C++ .NET实用教程[M]. 北京:中国水利水电出版社,2006:1-200.

[7] 孙晓非,冉晓F,冯冠. C#程序设计基础教程与实验指导[M]. 北京:清华大学出版社,2008:1-150.

[8] Nagel C, Bill Evjen. C# 2005 & .NET 3.0高级编程[M]. 北京:清华大学出版社,2007:1-500.

[9] 王小科,吕双. C#从入门到精通[M]. 北京:清华大学出版社, 2008:100-250.

[10] Huddleston J,姜玲玲,冯飞. C#数据库入门经典[M]. 北京:清华大学出版社,2008:200-300.

上一篇:数据库转存为平面文件应用系统的设计 下一篇:自适应访问多种数据来源的类