一个简易网络嗅探器的实现

由于很多网络(常见共享HUB连接的内部网)是基于总线方式,物理上是广播的,即当一个机器发给另一个机器数据,共享HUB先收到,然后把它接收到的数据再发给其他的(来的那个端口不发)每一个接口.所以在共享HUB下同一网段的所有机器的网卡都能接收到数据。将局域阿中某台机器的网络接口设置为混杂(promiscuous)模式(即网卡可以接收其收到的所有数据包,下面会详细地讲).那么它就可以捕获网络上所有的报文和帧了.如图1所示。

Sniffer(嗅探器)是一种常用的收集有用数据的方法.这些数据可以是用户的账号和密码,也可以是一些商用机密数据等。Sniffer的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。在合理的网络中,Sniffer的存在对系统管理员是至关重要的,系统管理员通过Sniffer可以诊断出大量的不可见模糊问题,这些问题涉及两台乃至多台计算机之间的异常通讯,有些甚至牵涉到各种协议。借助于Sniff er,系统管理员可以方便地确定出多少通讯量属于哪个网络协议、占主要通讯协议的主机是哪一台、大多数通讯目的是哪台主机、报文发送占用多少时间,或者相互主机的报文传送间隔时间等,这些信息为管理员判断网络问题、管理网络区域提供了非常宝贵的信息。

嗅探的基本工作

原理就是通过将网卡设置为混杂模式,然后接收所有经过本主机(或设备)的包,并尝试对其进行解包分析。本文通过一个简单的嗅探器的编写.力图使大家能够了解嗅探软件的基本实现方式.并从原理上理解嗅探。本嗅探器的基本工作流程如图2所示,下面我们就来看看这个嗅探器的具体实现。

在进行主函数编写之前,首先我们需要建立几个特殊的数据结构iphdr.tcphdr和udpHdr.这几个数据结构分别代表lP头、TCP头和UDP头的包头结构,用于在接包以后对相应的包进行解析。现在我们来看主函数。主函数首先需要进行初始化,初始化的工作包括使用WSAStanup和Socket函数初始化接受用的套接字Sock.对sockeLin结构的地址变量myaddress赋值(指向本地lP地址).以及使用bind函数将套接字Sock和本地地址变量myaddress绑定在一起,具体内容如下。

然后我们使用一个函数WSAlocil()将网卡设置为混杂模式。

接下来我通过一个简单的循环来接受经过网卡的包,然后进行解包就可以了

这里,我们还需要定义个solve()函数来对接到的数据包进行分析。Solve接收从主函数传递来的缓冲区数据.然后按照IP头.TCP头.UDP头的格式对接收缓冲区数据进行读取,对没有加密的包可以直接读取其数据.加密的包读出的则是乱码。solve函数的具体内容如下。

1、取包头

2、协议判断

3、tcp包的简单解析

4、udp包的简单解析


至此,我们的嗅探就已经基本完成了.图3是运行这个嗅探器抓包的结果。可以看到,这个嗅探器已经可以接收经过本网卡的所有数据包了,并可对不同协议的包进行区分.判断相应标志位,显示报文.已经具备了嗅探器的基本功能。但是本嗅探器由于使用手动抓包,因此丢包较严重,与EtHearl等使用PCAP抓包的工具相比,抓包率大约仅为50%。倘若想要编写一个真正的嗅探器,光靠手动抓包显然是远远不够的.必须要借助PCAP等工具包,才能使嗅探器的功能真正得到实现。

你可能感兴趣的:(一个简易网络嗅探器的实现)