??xml version="1.0" encoding="utf-8" standalone="yes"?>
关键? |络嗅探?/span> h模式 模块化设?/span>
1 ?/span> a
随着|络技术的发展Q网l系l对于整个社会的工作和徏讑֏挥着来大的作用,|络环境也变得越来越复杂Q与此同时网l系l的安全问题也引起了我们的关注。设计数据包嗅探器的目的在于能够使系l管理员q用此类软g分析|络量以便更好地控制网l。它能够帮助pȝ理人员q速地扑ֈ问题症结所在(如网l瓶颈、错误配|等Q,它们通常被用来在|\上截?/span>/阅读位于OSI 协议模型中各个协议层ơ上的数据包?/span>
2 |络嗅探软g的设计原?/span>
嗅探器可以理解ؓ一个安装在计算Z的窃听设备,它可以用来窃听计机在网l上所产生的众多的信息Q可以窃听计机E序在网l上发送和接收到的数据Q用来接收在|络上传输的信息?/span>
很多计算机网l采用的?/span>“׃n媒体"。也是_不必中断他的通讯Qƈ且配|特别的U\Q再安装嗅探器,几乎可以在Q何连接着的网l上直接H听到同一掩码范围内的计算机网l数据。这U窃听方式ؓ“Zh模式的嗅?/span>”Q?/span>promiscuous modeQ?/span>
2.1 以太|的工作原理
以太|的数据传输是基?/span>“׃n”原理的:所有的同一本地|范围内的计机共同接收到相同的数据包。这意味着计算机直接的通讯都是透明可见的。正是因L原因Q以太网卡都构造了g?/span>“qo?/span>”,q个qo器将忽略掉一切和自己无关的网l信息。事实上是忽略掉了与自nMAC地址不符合的信息。嗅探程序正是利用了q个特点Q它把网卡设|ؓ“h模式”。因此,嗅探E序p够接收到整个以太|内的网l数据信息了?/span>
在以太网中所有的通讯都是q播的,也就是说通常在同一个网D늚所有网l接口都可以讉K在物理媒体上传输的所有数据,而每一个网l接口都有一个唯一的硬件地址Q这个硬件地址也就是网卡的MAC地址。大多数pȝ使用48比特的地址Q这个地址用来表示
|络中的每一个设备。一般来说每一块网卡上?/span>MAC地址都是不同的,每个|卡厂家得到一D地址Q然后用q段地址分配l其生的每个网卡一个地址。在g地址?/span>IP地址间?/span>ARP?/span>RARP协议q行怺转换?/span>
在正常的情况下,一个网l接口应该只响应q样的两U数据Q?/span>
?/span> 与自q件地址相匹配的数据帧?/span>
?/span> 发向所有机器的q播数据帧?/span>
2.2 |卡的工作原?/span>
在一个实际的pȝ中,数据的收发是q卡来完成的。网卡接收到传输来的数据Q网卡内的单片程序接收数据的目?/span>MAC地址。根据计机上的|卡驱动E序讄的接收模式判断该不该接收。认接收接收后产生中断信号通知CPUQ认Z该接收就丢掉不管。所以不该接收的数据Q网卡就截断了,计算机根本就不知道?/span>CPU得到中断信号产生中断Q操作系l就Ҏ(gu)|卡的驱动程序设|的|卡中断E序地址调用驱动E序接收数据Q驱动程序接收数据后攑օ信号堆栈让操作系l处理?/span>
对于|卡一般有四种接收模式Q?/span>
?/span> q播方式Q该模式下的|卡能够接收|络中的q播信息?/span>
?/span> l播方式Q设|在该模式下的网卡能够接收组播数据?/span>
?/span> 直接方式Q在q种模式下,只有目的|卡才能接收该数据?/span>
?/span> h模式Q在q种模式下的|卡能够接收一切通过它的数据,而不该数据是否是传l它的?/span>
数据?/span>MAC |
接口配置模式 |
产生中断Q通知CPU |
产生中断Q通知CPU |
不处理,丢弃 |
本地接口g地址 |
q播地址
|
其他g地址 |
h模式 |
非合模?/span> |
数据?/span>MAC |
接口配置模式 |
产生中断Q通知CPU |
产生中断Q通知CPU |
不处理,丢弃 |
数据?/span> |
2.3 |络嗅探软g的工作原?/span>
Ҏ(gu)以上的介l,我们可以得出l论如下Q?/span>
首先Q在以太|中是基于广播方式传送数据的Q也是_所有的物理信号都要l过我的机器。再ơ,|卡可以|于一U模式叫h模式Q?/span>promiscuous modeQ,在这U模式下工作的网卡能够接收到一切通过它的数据Q而不实际上数据的目的地址是不是它。这是以下要介绍的网l嗅探Y件的工作的基本原理:让网卡接收一切它所能接收的数据?/span>
计算机直接所传送的数据Q事实上是大量的二进制数据。因?/span>, 一个网l窃听程序还必须也用特定的|络协议来分解嗅探到的数据,嗅探器也必能够识别出哪个协议对应于这个数据片断,只有q样才能够进行正的解码?/span>
3 |络嗅探软g的设计实?/span>
该网l嗅探Y件能够从|络上读取数据包q且解析数据包报文头中各字段的意义。能够分析数据以及所使用的协议的cd?/span>
3.1 |络嗅探软g的模块结?/span>
设计该网l嗅探Y件可分ؓ以下几个步骤Q?/span>
?/span> 创徏套接?/span>
?/span> 把网卡设|ؓh模式
?/span> 捕获数据?/span>
?/span> 分析数据?/span>
3.2 模块说明
⑴ 该网l嗅探Y件主要是q用LINUX环境下的SOCKET~程。网l的SOCKET数据传输是一U特D的I/O, SOCKET也是一U文件描q符。该|络嗅探软g设计的目的是截获所有的数据包,卛_括所有的协议?/span>
SocketQ)函数的定义式如下Q?/span>
Sockfd = socket ( int family, int type, int protocol ) Q?/span>
W一个参数是地址cdQ如果选用AF UNIX, 是用于本Z不同q程之间q行通信Q而设?/span>AF INET 则是用于不同L之间的通信Q第二个参数?/span>socket的类型参敎ͼ主要?/span>4U参数类型如下:
① SOCK DRAMQ?/span>used for udp datagrams.
② SOCK STREAMQ?/span>used for tcp packets.
③ SOCK RAWQ?/span>used to bypass the transport layer and directly access the IP layer.
④ SOCK PACKETQ?/span>this is linux specific, it is similuar to sock raw except it accesses the DATA LINK layer.
W三个参数是协议参数Q指定程序用具体的协议?/span>
在此E序中ؓ截获包含所有协议的数据包,故在E序的开始就写语句:
Q?/span>define PROTO htons Q?/span>0x0003Q?/span>/ *Ethernet code for all protol */
且在本程序中socketQ)函数的第二个参数选用sock packet?/span>
c套接字创建成功之后,可以选择|络接口q加以参数控制了。进入第二个模块Q设|网卡于h模式?/span>
在程序中有一个单独的自定义函数是用来网卡设|ؓh模式的。在q个模块中主要是调用?/span>ioctl 函数Q?/span>ioctl 函数是用来控制特D文件的底层讑֤参数的,q些Ҏ(gu)文g通常是终端、套接字和接口?/span>ioctl 函数的定义如下:
ioctlQ?/span>sockQ?/span> SIOCGIFFLAGS, &ifr Q?/span>
ioctlQ)函数中第一个参数是一个打开的原始套接字描述W?#8220;sock”Q第二个参数是所要执行的h操作。这里,h操作?#8220;SIOCGIFFLAGS”Q意思是获取接口“etho”的标记符。第三个参数是接口请求数据结构的地址指针Q该l构中包含了所要进行请求操作的接口名称倹{?/span>
⑶ |络接口讄为杂模式以后,接着可以接收数据包?/span>, q入捕获数据包的模块?/span>
recvfrom ( if_eth_fd, &ep, sizeof (ep), 0, &dest, &dlen );
q个函数要做的就是接收数据,q把接收到的数据攑օbuffer中?/span>
在成功的接收到数据包后,E序进入下一个模块:分析数据包?/span>
q里要介l一下有关的|络基本知识Q首先介l一?/span>TCP/IP的分层:
?/span>TCP/IP协议族中Q有很多U协议。可用图一单概?/span>TCP/IP协议族中不同层次的协议。如图所C,׃TCP?/span>UDP?/span>ICMP?/span>IGMP都要?/span>IP传送数据,因此IP必须在生成的IP首部中加入某U标识,以表明数据属于哪一层。ؓ此,IP在首部中存入一个长度ؓ8 bit的数据,UC协议域?/span>1表示?/span>ICMP协议Q?/span>2表示?/span>IGMP协议Q?/span>6表示?/span>TCP协议Q?/span>17表示?/span>UDP协议。类似地Q许多应用程序都可以使用TCP?/span>UDP来传送数据。运输层协议在生成报文首部时要存入一个应用程序的标识W?/span>TCP?/span>UDP都用一?/span>16 bit的端口号来表CZ同的应用E序?/span>TCP?/span>UDP把源端口号和目的端口号分别存入报文首部中。网l接口分别要发送和接收IP?/span>ARP?/span>RARP数据Q因此也必须在以太网的首部中加入某UŞ式的标识Q以指明生成数据的网l层协议。ؓ此,以太|的帧首部也有一?/span>16 bit的cd域?/span>
|
TCP |
UDP |
ICMP |
IP |
IGMP |
ARP |
g接口 |
RARP |
用户q程 用户q程 用户q程 用户q程 应用?/span> q输?|络?/span> 链\?/span>
媒体
Q图一Q?/span>
|络嗅探E序在分析数据包q一阶段正是Ҏ(gu)了网l的工作原理Q在收到一个以太网数据帧时Q数据就开始从协议栈中由底向上升,同时L各层协议加上的报文首部。每层协议盒都要L查报文首部中的协议标识,以确定接收数据的上层协议。这个过E即是分用?/span>
4 q一步的发展方向
q有很多的功能可以加入到本文所设计的Y件中Q其变得更加完整。它的另一个发展的方向是q一步更好的分析数据包中的数据部分,q能够把分析出来的数据从ASCII码{换ؓ自然语言Q这p够给用户带来很大的方ѝ?/span>