计算机网络 课程设计

本文介绍了一次网络嗅探器的课程设计,旨在理解网络嗅探器的功能和原理,提升网络编程能力。通过创建原始套接字,设置混杂模式,捕获并处理网络数据包,详细阐述了实现过程,包括创建原始套接字、设置混杂模式、捕捉数据包和对数据包的处理。在调试过程中解决了连接错误和IP地址显示问题,最后展示了程序运行结果和心得体会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机网络

课程设计报告

 

题目:网络嗅探器的设计与实现   

 

 

 

 

一:实验目的

随着网络技术的发展和网络应用的普及,越来越多的信息资源放在了互联网上,网络的安全性和可靠性显得越发重要。因此,对于能够分析、诊断网络,测试网络性能与安全性的工具软件的需求也越来越迫切。网络嗅探器具有两面性,攻击者可以用它来监听网络中数据,达到非法获得信息的目的,网络管理者可以通过使用嗅探器捕获网络中传输的数据包并对其进行分析,分析结果可供网络安全分析之用。

本次课程设计的主要目的:

1了解什么是网络嗅探器及其主要功能

了解网络嗅探器的原理并编程实现一个简单的网络嗅探器

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

以及对应的代码。依次判断是属于那种数据包。这里只处理了最常见的两种数据包TCPUDP,依次打印IP包头中的Source address  Destination address    以及在TCP或者UCP包结构中的Source port  Destination port,和对应的Data .

 

三:调试过程及流程图

程序编译时出现如下几个错误,经过在网上查找,找到其解决办法,具体如下:

1

错误分析:程序编译正常,但是连接错误,原因是缺少ws2_32.lib这个库文件

解决办法:在程序开头加条语句:“#pragma comment(lib,"ws2_32.lib")”, 相当于是把ws2_32.lib 这个库加入到工程文件中

2

程序调试好后,但运行是发现数据包的源IP地址和目的IP地址始终一样,如下图所示:

错误分析:inet_ntoa函数返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。

解决办法:将原来的代码

printf("Address %s->%s/n",inet_ntoa(pIpheader->srcaddr),inet_ntoa(pIpheader->dstaddr));

改成两行,如下:

printf("Address %s->",inet_ntoa(pIpheader->srcaddr));

printf("%s/n",ine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值