网络嗅探器的设计与实现

更新时间:2023-12-14 07:27:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机网络课程设计报告

网络嗅探器的设计与实现

目录

第一章设计目的、任务与要求 ....................................................................................................... 1

1.1设计的目的 .............................................................. 1 1.2设计的任务与要求 ........................................................ 1 第二章系统分析设计 ....................................................................................................................... 1

2.1需求分析 ................................................................ 1 2.2 原理分析 ............................................................... 1 2.3网络中数据传送过程以及数据包结构 ........................................ 2

2.3.1信息传送过程 .......................................................................................................... 2 2.3.2 数据包的结构 ......................................................................................................... 2

第三章系统实现 ............................................................................................................................... 4

3.1 Winpcap技术 ............................................................ 4 3.2系统主要模块 ............................................................ 7 3.3 实现界面 ............................................................... 9 第四章心得体会 ............................................................................................................................. 10

4.1 程序总结 .............................................................. 10 4.2 个人总结 .............................................................. 10 参考文献......................................................................................................................................... 10 附录 ................................................................................................................................................ 10

第一章设计目的、任务与要求

1.1设计的目的

编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。 1.2设计的任务与要求

IP数据包的捕获与分析,程序能够自动的收集局域网中的IP数据包,能在程序运行时进行显示。

实现在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。

程序的具体要求如下:

1)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。

2)形成记录结果的日志文件。

第二章系统分析设计

2.1需求分析

在通常情况下,网络通讯的Socket程序只能响应与自己硬件地址想匹配的或者是以广播形式发出的数据桢,对于其他形式的数据桢,比如已到达网络接口但却不是发给此地址的数据桢,网络接口在验证目的MAC并非自身地址之后,将不进行响应,也就是说应用程序无法收取与自己无关的数据包。所以,我们要想实现截获流经网络设备的所有数据包,都要采取一点特别的手段了:将网卡设置为混杂模式,这样以来,该主机的网卡就可以捕获所有流经其网卡的数据包和帧。利用基于Win32的捕获数据包和网络分析的Winpcap可以实现从网卡捕获以及分析IP数据包。 2.2 原理分析

Winpcap所包含的packet.dll和Wpcap.dll:packet.dll直接映射了内核的调用。 Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具,充分考虑了各种性

1

能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。 2.3网络中数据传送过程以及数据包结构 2.3.1信息传送过程

计算机网络将要传输的报文分割成一个个小的数据片段,称为“分组”,在每一个分组的数据前加上传输数据所必需的信息“报头”,就构成了网络数据传输的基本部件“数据包”。

在计算机网络中,传输的信息是以数据包为基本传输单位的,数据包的内容是被分割后的信息块,在每个数据包上附加了多层包头。在一个数据包里,信息内容往往是不完整的,而在每一个数据包头部,完整地包含了传送此数据包所需的全部来源及目标的地址信息。在一个数据包最里层是被传输的数据。在数据的外面首先由处理此数据的应用程序将数据片断外包裹上应用层的协议,然后交给网络通信系统软件,网络通信系统软件根据此数据包的传输方式,为数据包裹上传输层协议,交给下一层协议。下面的网络层协议根据数据包的路由地址,为其包裹上网络层协议,并交给下一层协议。下面的链路层协议为数据包加上来源和目标物理地址的链路层协议后交给下一层协议。在物理层,由网络通信硬件系统按照通信设备的要求将数据包转换成一个个符合物理层协议的电脉冲,通过网络接口电路发送的网络传输媒介上。

这一串串电脉冲沿着传输媒介到达下一个网络节点。在每一个网络节点上,节点设备将收到的电脉冲还原为数字信号,并对数字信号进行判读和分析,了解此数据包的最终目的地,并根据节点上的路由表为此数据包选择一个到达目的地的最佳路由,并对此数据包进行必要的修改和签章后再次发送到网络传输媒介上。

数据包就这样通过一个个网络节点,最终到达了信息传输的目的地。 在目标主机上,依据网络协议,逐层地对数据包进行签收和校验,如果数据包未出现差错,则剥除此层的协议,将数据向上层递交。通过如此逐层剥除与递交,最终在应用层由应用软件系统将一个个还原后的数据包拼接还原为原始的状态,完成了数据的传输过程。 2.3.2 数据包的结构

捕获的网络数据包的结构如图所示: UDP/TCP/ICMP/IGMPDLC数据帧头 IP数据包结构 数据 数据报结构 其中DLC数据帧头: 目的MAC(6字节) 源MAC(6字节) 2

以太网类型(2字节)

IP数据包结构:

UDP数据包结构:

TCP数据包结构:

ICMP数据包结构:

3

IGMP数据包结构:

第三章系统实现

3.1 Winpcap技术

winpcap(windows packet capture)是windows平台下一个免费,公共的网络访

问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。Winpcap是一个Win32平台下用于抓包和分析的系统。包括一个内核级别的packet filter,一个底层的DLL(packet.dll)和一个高级的独立于系统的DLL(Wpcap.dll)。它用于windows系统下的直接的网络编程。Winpcap特别适用于下面这几个经典领域: ①网络及协议分析 ②网络监控

③通信日志记录

④Traffic generators ⑤用户级别的桥路和路由 ⑥网络入侵检测系统(NIDS) ⑦网络扫描 ⑧安全工具

通过安装winpcap组件,即可在win32程序上调用winpcap所提供的函数,来截获经过网卡的所有数据包。 Winpcap配置过程如下:

⑴在winpcap官网(http://www.winpcap.org/install/default.htm)上下载安装winpcap 驱动和 DLL组件,如图9所示,然后进行安装。

4

再到http://www.winpcap.org/devel.htm.下载winpcap开发包,解压到任意目录,可以看到里面包含了:Lib,Include,文档和实例程序。

5

⑵手动添加相关库文件。如果不添加,运行程序时会出现这样的错误:fatal error C1083: Cannot open include file: 'pcap.h': No such file or directory。

第一步,在VC6.0的菜单栏上工具?选项?目录下面添加将winpcap的include,lib目录添加进VC6.0的环境变量,如图12所示,最后点击确定。

第二步,在工程?设置?连接中,导入wpcap.lib和Packet.lib库,如图13。

在C/C++中,添加WPCAP,HAVE_REMOTE。

6

经过以上步骤,Winpcap就配置好了。

3.2系统主要模块

数据包的捕获和分析模块流程图如下:

开始

扫描网卡

选择网卡并设置

为混杂模式

监听网卡

捕获和解析IP数据包 输出解析信息并存入 日志

7

结束

IP数据包捕获的重要代码分析:

if ((adhandle = pcap_open_live(d->name, /* 设备名称*/ 65536, /* portion of the packet to capture.*/ /* 65536 grants that the whole packet will be captured on allthe MACs.*/ 1, /* 混杂模式*/ 1000, /* 读超时为1秒*/ errbuf /* error buffer*/ )) == NULL) { fprintf(stderr, \to open the adapter. %s is not supported by

LibPcap\\n\

/* Free the device list */ pcap_freealldevs(alldevs); return -1; }

printf(\正在监听%s...\\n\

// At this point, we don't need any more the device list. Free it pcap_freealldevs(alldevs);

// 开始捕获包

pcap_loop(adhandle, 0, ethernet_protocol_analysis, NULL); mylog.close();//关闭文件

8

3.3 实现界面

9

第四章心得体会

4.1 程序总结

在这次课程设计中,主要犯的错误主要有以下几种:①不知道如何添加头文件。C++的有些库文件比如WSOCK32.LIB,wpcap.lib,Packet.lib都不是VC6.0所自带的库文件,所以在编译前都应该提前添加进去。②关于IP数据包的捕获这一方面,由于了解不深,不知道如何开始编程。后来通过查阅资料,了解到了有好几种捕获IP数据包的方法,后来选取了基于Winpcap系统的捕获方法,winpcap提供了一系列相关的函数进行了扫描网卡,捕获数据包的方法,解决了这个问题。 4.2 个人总结

这次我选取的是网络嗅探器的设计与实现,即IP数据包的捕获分析,为此我将上个学期所学的计算机网络这门课的教材又捧起来重新浏览了几次,重点学习了网络层中几个重要的协议内容以及应用场所。考虑到这是比较基本的知识应用,所以我选择了C++作为程序实现的语言,并且C++对我来说也比较顺手。

我借助winpcap技术,利用它提供的函数来扫描本机的网卡,选择网卡并设置为可以接收所有数据包的混杂模式,来捕获和分析经过该网卡的所有数据包。 这次最大的收获应该是利用在计算机网络课程上学到的相关知识,实现了端口扫描以及IP数据包的捕获问题,大大加深了我对网络相关协议的了解程度,其中对于几个协议的数据包的结构更是印象深刻,同时也提高了我解决问题的能力。 最后感谢一直陪伴我们的老师,在课程设计过程中辛勤回答着我们各种各样的问题。

参考文献

[1]严伟,潘爱民译,《计算机网络》,2012年3月 [2]360个人图书馆,《常见的端口扫描类型及原理》,

http://www.360doc.com/content/12/0302/13/3725126_191092221.shtml,2012年3月

[3]新浪博客,《Windows下IP数据包捕获》

http://blog.sina.com.cn/s/blog_50dfcc660100ak3h.html,2008年10月

附录

源代码如下: #include \

10

#include

#pragma comment(lib,\#include \#include

/*下边是以太网的协议格式 */ struct ethernet_header {

u_int8_t ether_dhost[6]; /*目的以太地址*/ u_int8_t ether_shost[6]; /*源以太网地址*/ u_int16_t ether_type; /*以太网类型*/ };

/*ip地址格式*/

typedef u_int32_t in_addr_t;

struct ip_header {

#ifdef WORKS_BIGENDIAN

u_int8_t ip_version : 4, /*版本:4*/

ip_header_length : 4; /*IP协议首部长度*/ #else u_int8_t ip_header_length:4,ip_version:4; #endif

u_int8_t ip_header_length : 4, ip_version : 4; u_int8_t ip_tos; /*TOS服务质量*/ u_int16_t ip_length; /*总长度*/ u_int16_t ip_id; /*标识*/ u_int16_t ip_off; /*偏移*/ u_int8_t ip_ttl; /*生存时间*/ u_int8_t ip_protocol; /*协议类型*/ u_int16_t ip_checksum; /*校验和*/

struct in_addr ip_source_address; /*源IP*/

struct in_addr ip_destination_address; /*目的IP*/ };

//关于tcp头部的定义 struct tcp_header {

u_int16_t tcp_source_port;//源端口号

u_int16_t tcp_destination_port;//目的端口号

u_int32_t tcp_acknowledgement;//确认号

11

u_int32_t tcp_ack;//?

#ifdef WORDS_BIGENDIAN

u_int8_t tcp_offset : 4, tcp_reserved : 4; #else u_int8_t tcp_reserved:4,tcp_offset:4; #endif

u_int8_t tcp_reserved : 4, tcp_offset : 4;

u_int8_t tcp_flags;

u_int16_t tcp_windows;//窗口大小

u_int16_t tcp_checksum;

u_int16_t tcp_urgent_pointer;//紧急指针 };

ofstream mylog;//创建文件

//下边实现tcp数据包分析的函数定义tcp_protocol_analysis

void tcp_protocol_analysis(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char* packet_content) {

struct tcp_header *tcp_protocol; /*tcp协议变量*/ u_char flags; /*标记*/

int header_length; /*头长度*/ u_short source_port; /*源端口*/

u_short destination_port; /*目的端口*/ u_short windows; /*窗口大小*/

u_short urgent_pointer; /*紧急指针*/ u_int sequence; /*序列号*/

u_int acknowledgement; /*确认号*/ u_int16_t checksum; /*检验和*/

tcp_protocol = (struct tcp_header *) (packet_content + 14 + 20); /*获得tcp首部内容*/

//ntohs函数将一个16位数由网络字节顺序转换为主机字节顺序。 source_port = ntohs(tcp_protocol->tcp_source_port); /*获得源端口号*/

destination_port = ntohs(tcp_protocol->tcp_destination_port); /*获得目的端口号*/

12

header_length = tcp_protocol->tcp_offset * 4; /*获得首部长度*/

sequence = ntohl(tcp_protocol->tcp_acknowledgement); /*获得序列号*/ acknowledgement = ntohl(tcp_protocol->tcp_ack); windows = ntohs(tcp_protocol->tcp_windows);

urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer); flags = tcp_protocol->tcp_flags;

checksum = ntohs(tcp_protocol->tcp_checksum); printf(\

printf(\mylog<<\printf(\

mylog<<\printf(\

mylog<<\switch (destination_port) {

case 80:printf(\ mylog<<\case 21:printf(\ mylog<<\case 23:printf(\ mylog<<\case 25:printf(\ mylog<<\case 110:printf(\ mylog<<\default:break; }

printf(\mylog<<\

printf(\mylog<<\printf(\mylog<<\

printf(\ %d \\n\mylog<<\ \printf(\

13

if (inum < 1 || inum > i) //判断号的合法性 { printf(\ /* Free the device list */ pcap_freealldevs(alldevs); return -1; }

//找到要选择的网卡结构

for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);

//打开选择的网卡

if ((adhandle = pcap_open_live(d->name, /* 设备名称*/ 65536, /* portion of the packet to capture.*/ /* 65536 grants that the whole packet will be captured on allthe MACs.*/ 1, /* 混杂模式*/ 1000, /* 读超时为1秒*/ errbuf /* error buffer*/ )) == NULL) { fprintf(stderr, \to open the adapter. %s is not supported by LibPcap\\n\ /* Free the device list */ pcap_freealldevs(alldevs); return -1; }

printf(\正在监听%s...\\n\

// At this point, we don't need any more the device list. Free it pcap_freealldevs(alldevs);

// 开始捕获包

pcap_loop(adhandle, 0, ethernet_protocol_analysis, NULL); mylog.close();//关闭文件

return 0; }

19

本文来源:https://www.bwwdw.com/article/c745.html

Top