用原始套接字实现网络监听

类别:编程语言 点击:0 评论:0 推荐:

用原始套接字实现网络监听

 

作者  张志强

1.  引言

网络监听工具(sinff)是提供给网络管理员的一类管理工具。在以太网中(Ethernet),当网络上连接多台计算机时,某瞬间只能有一台计算机可以传送数据。以太网中,数据是以被称为帧的数据结构为单位进行交换的。通常,在计算机网络上交换的数据结构体的单位是数据包。而在以太网中则称为帧。这种数据包是由记录着数据包发送给对方所必需信息的报头部分和记录着发送信息的报文部分构成。报头部分包含接收端的地址、发送端的地址、数据校验码等信息。

在以太网上,帧(数据包)是被称为带碰撞检测的载波侦听多址访问(CAMA/CD)发送的,在这种方法中,发送到指定地址的帧实际上是发送到所有计算机的,只是如果网卡检测到经过的数据不是发往自身的,简单忽略过去而已。

2.  网络监听工作原理

工作在普通模式下的网卡只能接收发往本地地址和广播的数据包,其余数据包将简单的转发,并不把数据提交给主机处理。工作在混杂模式下的网卡将接收所有经过本网卡的数据。所以网络监听程序只能工作在混杂模式下。对于不能工作在网卡,将无法监听所有在网络上传输的数据。网络监听的核心就是设置网卡为混杂模式。通常的套接字只能相应与自己硬件地址相匹配的或以广播方式发送的数据帧。对于其他数据帧,网络接口验证投递地址并非自身地址后将不做响应,也就是说网络程序无法接收到达网卡的数据包。

3.  具体实现

对网卡设置混杂模式是通过原始套接字(row socket)实现的,这有别于通常是使用的数据流和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行监听了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。                

4.  小结

本文介绍的以原始套接字实现网络侦听的方法实现起来比较简单,尤其是不需要编写驱动程序就能实现网络侦听。但由于接收到的数据报头不含帧信息,因此不能接收网络层的其他数据包,如ARP、RARP等。原始套接字只能监听但不能实现拦截。另外最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包例如TDI无法进行处理。对于一些木马和病毒来说很容易避开这个层次的监听。

 

本文地址:http://com.8s8s.com/it/it23592.htm