计算机网络
课程设计报告
题目:网络嗅探器的设计与实现
一:实验目的
随着网络技术的发展和网络应用的普及,越来越多的信息资源放在了互联网上,网络的安全性和可靠性显得越发重要。因此,对于能够分析、诊断网络,测试网络性能与安全性的工具软件的需求也越来越迫切。网络嗅探器具有两面性,攻击者可以用它来监听网络中数据,达到非法获得信息的目的,网络管理者可以通过使用嗅探器捕获网络中传输的数据包并对其进行分析,分析结果可供网络安全分析之用。
本次课程设计的主要目的:
1了解什么是网络嗅探器及其主要功能
2 了解网络嗅探器的原理并编程实现一个简单的网络嗅探器
3提高网络编程和应用能力,熟悉一些简单的网络方面的编程。
二:设计思路
嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
一. 创建原始套接字
可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP, UDP...
SOCKET rawsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
这样我们就创建了一个 Raw Socket
二. 把网卡置于混杂模式
在正常的情况下,一个网络接口应该只响应两种数据帧:
1.与自己硬件地址相匹配的数据帧
2.发向所有机器的广播数据帧
假如要网卡接收所有通过它的数据, 而不管是不是发给它的, 那么必须把网卡置于混杂模式. 也就是说让它的思维混乱, 不按正常的方式工作. 用 Raw Socket 实现代码如下:
setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
//设置 IP 头操作选项
bind(rawsock,(SOCKADDR *)&addr,sizeof(addr)); //把 rawsock 绑定到本地网卡上
ioctlsocket(rawsock,SIO_RCVALL,&dwvalue); //让 rawsock 接受所有的数据
flag 标志是用来设置 IP 头操作的, 也就是说要亲自处理 IP 头: bool flag = ture;
addr 为本地地址: SOCKADDR_IN addr;
dwValue 为输入输出参数, 为 1 时执行, 0 时取消: DWord dwValue = 1;
三. 捕捉数据包
网卡已经在工作了, 下一步是抓包,让网卡能捕获所有的数据包!
recv(rawsock, RecvBuf,sizeof(RecvBuf),0); //接受任意数据包
四.对数据包处理
依据数据包的结构。对数据的内容分别进行读取和分类处理,下面是几个主要的数据包的包头结构。
IP header structure:
TCP header structure:
UDP header structure:
依据对RecvBuf 中对应数据结果的位置,找到IP数据包中的协议类型Protocol:
EGP 8 ICMP 1 HMP 20 RAW 255 RDP 27 RCD 66 TCP 6 UDP 17 INS-IDP 22
以及对应的代码。依次判断是属于那种数据包。这里只处理了最常见的两种数据包TCP和UDP,依次打印IP包头中的Source address ,Destination address 以及在TCP或者UCP包结构中的Source port ,Destination port,和对应的Data 项.