已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学学 位位 论论 文文 网络数据包捕获工具的设计与实现网络数据包捕获工具的设计与实现 论论文作者姓名:文作者姓名: 申申请请学位学位专业专业: : 申申请请学位学位类别类别: : 指指导导教教师师姓姓名名( (职职称称) ): : 论论文提交日期:文提交日期: 网络数据包捕获工具的设计与实现网络数据包捕获工具的设计与实现 摘摘 要要 网络数据包的捕获对于网络安全有着巨大的作用,为我们更好的分析网络 中的数据流提供了帮助。 本论文是基于 windows 下开发一个网络监听工具,侧重点在于实现网络数 据包的捕获,然后分析并显示捕获到的数据包信息这部分功能的实现,如分析: ip 首部协议类型、源 ip、目的 ip 和端口号等。数据包的捕获是实现防火墙、 网络协议的分析或者网络监听等等功能的核心内容,一般可以采用 winsock 编 程、winpcap 或者 ndis 网络接口驱动来实现。 采用的是 winpcap(windows packet capture)来实现的抓包功能。winpcap 是 windows 平台下一个专业网络数据包捕获开发包,是为 libpcap 在 windows 平台下实现数据包捕获而设计的。winpcap 功能更加强大,不仅具备了 libpcap 的功能,还具有一些其他功能。 通过 vc+6.0 中 mfc 编程实现通过一个完整界面来控制调用 winpcap 中 的函数来实现对网卡信息的捕获和循环捕获数据包,然后通过预先对于 ip、tcp、udp 等数据包的定义和 tcp/ip 等协议来解析其中包含的内容并返回 显示捕获到数据包的信息,当然也可以保存捕获到的数据包到指定地点以便进 一步分析。 关键词关键词:winpcap;npf;vc+6.0;tcp/ip;计算机网络; the design and implementation of capture tool of network data packets abstract the capture of network data packets plays an important part in network security, which is helpful for our better analysis of network data flow. this paper is about a network monitoring tool based on windows system, which emphasizes particularly on realizing the capture and analysis of network data packets and then displays them. take analysis as an example, it will check the type of the ip protocol, the source address of ip, the destination address of ip and the port number. the capture of data packets is the basis of realizing the analysis of network protocol and network monitoring. generally it can be realized via winsock and winpcap programming, or ndis. use the winpcap(windows packet capture)to capture of data packets. winpcap is a professional developing program based on windows which is designed to help you to capture the data packs via libpcap. winpcap is much more powerful. it not only has integrated all the functions of libpcap but also has some advanced functions. in mfc programming of vc+6.0, the capture of network data packets can be realized via the invoking and control of the functions through a full control panel, and then the analysis of ip ,tcp,udp and tcp/ip will be done before they are displayed. certainly the information captured can be saved to the appointed destination in order to go through an advanced analysis. key words: winpcap;npf;visual c+6.0;tcp/ip;computer network; 目目 录录 论文总页数:27 页 1 引言1 1.1课题背景1 1.2国内外研究现状1 1.3课题研究的意义1 2设计理论依据2 2.1osi 与协议族.2 2.2面向对象和可视化编程4 2.3winpcap开发技术详解.5 2.3.1winpcap 介绍.5 2.3.2winpcap 的组成5 2.3.3winpcap 数据结构7 2.3.4winpcap 函数8 3设计方案与系统功能描述10 3.1设计方案10 3.2功能描述11 3.3系统流程图12 4编码实现12 4.1winpcap环境设置.12 4.2mfc 控件相关.14 4.3定时器和系统时间的获得15 4.4捕获并显示本机信息16 4.5捕获数据包及相关操作17 5软件测试与结果22 5.1网卡信息获取22 5.2整合到 mfc 界面中的程序测试23 结 论24 参考文献25 致 谢26 声 明27 第 1 页 共 27 页 1 1 引言引言 1.11.1 课题背景课题背景 随着网络技术的飞速发展,网络的普及,给我们带来了巨大的社会和经济 效益,同时网络安全问题变得日益严重,计算机网络的设计、维护难度日益增 加,安全问题正威胁着每一个网络用户,对网络安全的研究也越来越重要。因 此,人们迫切的需要能够分析、诊断和测试网络的工具,以及保护我们的电脑 尽可能的减少收到侵害的堡垒防火墙。对于网络数据包的捕获现在也有着 很多的实现方法,存在着许多开源的 sniffer 软件供我们参考,但是其中的某 些细节上还是有一些问题的存在,在效果和效率上都有一些问题,分析上也并 不是很方便。所以尝试选择了这个课题。 1.21.2 国内外研究现状国内外研究现状 现在不论是网上的一些开源的 sniffer 软件还是市面上出售的网络监听软 件,其实其基础功能都是基于网络数据包捕获功能后扩展开的。所以我们可以 清晰的认识到网络数据包捕获功能的巨大作用和广泛的应用范围。目前 sniffer 软件种类繁多,但是很多都存在一些问题,比如说:效率低,效果差, 分析困难等等。有些 sniffer 软件往往嵌入许多并不怎么使用的功能在里面, 增加了操作的复杂性,使用起来反而不便。所以真正想要找到一款操作简单使 用方便的数据包捕获软件并不容易。作为一名网络工程专业的学生,熟悉常用 的各种计算机相关软件,特别是和网络相关的软件是应该的。现在市场上的国 内外的各种防火墙软件、网络监听软件和协议分析软件等软件种类繁多,让人 有点眼花缭乱。这些产品大多数品质都不错,各有各的特点,所以选择起来的 难度也挺大。我总是在一些比较著名的软件下载网站上获取一些比较受好评的 软件来使用,然后从中选择适合自己的。通过一系列的使用和学习,我希望能 够自己完成一款功能适合自己使用的操作简单让人可以轻易上手的网络数据包 捕获和简单分析的软件。 1.31.3 课题研究的意义课题研究的意义 随着网络的飞速发展,internet 的迅速普及,网络已经深入到了我们的生 活,跟我们息息相关。伴随着网络带来的便利,网络安全问题也越来越受到人 们的关注和重视。防火墙也成了一个非常热门的课题,带来巨大的社会经济效 益,保护我们的合法权益不受到侵害。我选择的课题是 windows 下的网络数据 包的捕获工具的开发和实现,所以主要的研究方向和侧重点是在于最基本也是 最核心的网络数据包的捕获和分析等功能上。网络数据包的捕获在于网络安全 领域有着无可代替的重要作用,不论是防火墙技术,网络监听技术或者是网络 测试都离不开数据包的捕获,这是一切的基础,其他的功能都要基于这个功能 第 2 页 共 27 页 才能实现。 2 2设计理论依据设计理论依据 2.12.1osiosi 与协议族与协议族 要想轻松搞定抓包程序,除了要有良好的编程能力,还要有扎实的理论知 识,特别是计算机网络方面的知识。必须要明白数据包在网络中是怎么传送的, 通过什么协议,运作在哪一层,当然还要了解数据包的特点,方便你能更好的 获得有用的信息。 学习计算机网络的我想大都应该知道著名的 osi 体系结构,osi 模型有点 太过理想化和复杂,在时下 internet 网体系结构非常流行并将其取而代之。 物理层:涉及在物理信道上传输原始比特,处理与物理传输介质有关的机 械的、电气的和过程的接口。 数据链路层:分为介质访问控制(mac)和逻辑链路控制(llc)两个子层。 mac 子层解决广播型网络中多用户竞争信道使用权问题。llc 的主要任务是将有 噪声的物理信道变成无传输差错的通信信道,提供数据成帧、差错控制、流量 控制和链路控制等功能。 网络层:负责将数据从物理连接的一端传到另一端,即所谓点到点,通信 主要功能是寻径,以及与之相关的流量控制和拥塞控制等。 传输层:主要目的在于弥补网络层服务与用户需求之间的差距。传输层通 过向上提供一个标准、通用的界面,使上层与通信子网(下三层)的细节相隔 离。传输层的主要任务是提供进程间通信机制和保证数据传输的可靠性。 会话层:主要针对远程终端访问。主要任务包括会话管理、传输同步以及 活动管理等。 表示层:主要功能是信息转换,包括信息压缩、加密、与标准格式的转换 (以及上述各操作的逆操作)等等。 应用层:提供最常用且通用的应用程序,包括电子邮件(e-mail)和文电 传输等。 对于网络方面的知识应该予以一定的了解,也许你在学习的时候没有发觉 它的具体作用,但是当你一旦在实践中遇到了运用到了就会豁然开朗,发现原 来一切是这么回事。实践才是检验真理的最佳途径。 第 3 页 共 27 页 下面两幅图图 1 和图 2 中我们可以看到现在风靡世界的 internet 网的结构 跟著名的 osi 之间的区别和共同之处: 图 1 tcp/ip 体系结构 下面是 osi 和 tcp/ip 结构的对比, 图 2 osi 与 internet 协议族 值得注意的是,在一些问题的处理上,tcp/ip 与 osi 是很不相同的。例如: 1.tcp/ip 一开始就考虑到多种异构网的互连问题,并将网际协议 ip 作为 tcp/ip 的重要组成部分。但 iso 和 ccitt 最初只考虑到全世界都使用同一种统 第 4 页 共 27 页 一的标准公用数据网将各种不同的系统互联起来。后来 iso 认识到网际协议 ip 的重要性,却已经来不及了,internet 网的超迅猛发展给了 osi 重重一击,投 入了巨大资源 iso 当然不愿放弃自己定义的标准为了补救只好在网络层中划分 出一个子层来完成类似 tcp/ip 中 ip 的作用。 2.tcp/ip 一开始就对面相连接服务和无连接服务并重,而 osi 在开始时只 强调面向连接这一种服务。一直到很晚才开始制定另一种无连接服务的有关标 准。 2.22.2面向对象和可视化编程面向对象和可视化编程 面向对象技术是软件技术的一次革命,在软件开发史上具有里程碑的意义。 随着 oop(面向对象编程)向 ood(面向对象设计)和 ooa(面向对象分析)的 发展,最终形成面向对象的软件开发方法 omt(objectmodellingtechnique)。 这是一种自底向上和自顶向下相结合的方法,而且它以对象建模为基础,从而 不仅考虑了输入、输出数据结构,实际上也包含了所有对象的数据结构。所以 omt 彻底实现了 pam 没有完全实现的目标。不仅如此,oo 技术在需求分析、可 维护性和可靠性这三个软件开发的关键环节和质量指标上有了实质性的突破, 彻底地解决了在这些方面存在的严重问题,从而宣告了软件危机末日的来临。 面向对象的程序设计是结构化语言的自然延伸。面向对象程序设计中通过 定义基本的功能模块-类,使得物质世界中的对象被有机的分解,然后遵循一 定的原则用程序将模块组合、装配、扩充、达到按用户的要求,将现实世界中 的对象以软件形式部分或全部实现。oop 的先进编程方法为一般用户和其他的 程序员提供了可以在其他的程序中使用以经设计好的模块-类的机会,这样就 完全不必重新编制大量重复的程序代码。这种程序设计方法可使用开发时间大 大地缩短,切实地提高编程人员的工作效率。 visual c+自诞生以来,一直是 windows 环境下最主要的应用开发系统之 一。visual c+不仅是 c+语言的集成开发环境,而且与 win32 紧密相连,所 以 vc+开发系统可以完成各种各样的应用程序的开发,从底层软件直到上层直 接面向用户的软件。而且其强大的调试功能也为大型复杂软件的开发提供了有 效的排错手段。 可视化(visual)技术得到广泛的重视越来越多的人开始研究可视化技术。 所谓可视化技术,一般是指软件开发阶段的可视化和对计算机图形技术和方法 的应用。 我采用 vc+6.0 的 mfc 来实现通过界面控制程序的运行。之所以采用 vc+ 来实现是因为: 1界面设计简单 第 5 页 共 27 页 2面向对象编程,比较容易实现 3很容易调用 windows 自身的函数 4后台存取规则容易 5所见即所得 2.32.3winpcapwinpcap 开发技术详解开发技术详解 2.3.12.3.1 winpcap 介绍介绍 winpcap(windows packet capture)是 windows 平台下一个专业网络数据 包捕获开发包,是为 libpcap 在 windows 平台下实现数据包的捕获而设计的。 在设计 winpcap 时参照了 libpcap,两者使用方法相似。使用 winpcap 开发包, 可以把在 linux 下基于 libpcap 的程序很容易的移植到 winpcap 平台下。 winpcap 是在 bsd 许可证下发布的,它主要是由加利福尼亚大学的 lawrence berkeley laboratory 开发。 使用 winpcap 开发包的主要软件有:windump(与 linux 下的 tcpdump 的功 能几乎一致) 、analyzer(windows 下的嗅探器) 、ethereal(网络协议分析软 件)等。 开发 winpcap 这个项目的目的在于为 win32 应用程序提供访问网络底层的 能力,其核心功能是捕获网络数据包,其他功能包括数据包过滤、数据包发送、 流量统计和数据包存储等。winpcap 给程序员提供了一套标准的网络数据包捕 获的编程接口,并且与 libpcap 兼容,增加了从 linux 到 windows 平台的可移 植性。而且提供很高的应用效率,充分考虑了各种性能和效率的优化,在内核 层实现了数据包的捕获和过滤。这是由 npf 来实现的,npf 是 winpcap 的核心 部分,它实现了内核层次的统计功能,对于设计网络流量的程序很有好处。 在这里我使用的是 winpcap 3.1 版,性能稳定。 2.3.22.3.2 winpcap 的组成的组成 winpcap 包括三部分内容。 第一部分是内核层的数据包过滤模块。它相当于在 linux 下 libpcap 使用 的 bpf 过滤模块,实现了高效的网络数据包的捕获和过滤功能,其过滤规则跟 bpf 是一样的。此过滤模块实际上是一个驱动程序,被称为 npf(netgroup packet filter)数据包驱动程序。 第二部分是动态链接库 packet.dll。它是提供给开发者的一个接口,使用 它就可以调用 winpcap 的函数,它是一个较低层的开发接口。 第三部分是动态链接库 wpcap.dll。它也是提供给开发者的一个接口,但 它是一个更高层的编程接口,其调用与系统无关。使用此接口进行编程,几乎 可以把 linux 下使用 libpcap 写的程序原封不动的搬到 windows 平台下。 第 6 页 共 27 页 网络驱动程序接口规范(ndis,network driver interface specification)是由微软和 3com 公司共同制定的,它位于网卡和协议层之间, 提供一个接口,为上层协议提供服务,并且屏蔽了下层各种网卡的差别,并且 支持多种网络协议。并且支持多种工作模式和网络驱动类型(小端口驱动、中 间层驱动、协议驱动) ,其中 winpcap 的 npf 就属于协议驱动类型。 npf(netgroup packet filter): npf 是 winpcap 的核心部分,它的主要功能就是捕获数据包,还可以发送 数据包、存储数据包以及对网络进行统计分析。 图 3 npf 的结构 图 3 中的箭头标识网络数据包的流动方向,并且可以看到 npf 是工作在内 核层的。npf 由一个网络转发部件,从网卡驱动程序收集网络数据包,既可以 发送给过滤部件,对网络数据包进行过滤,也可以发送给统计部件,对网络进 行统计分析,还可以发送给存储部件,把网络数据包直接存储到磁盘。数据包 在 npf 中使用了缓存机制,主要是为了提高效率和速度。 第 7 页 共 27 页 从图 3 中也可以看到,packet.dll 位于 wpcap.dll 的下层,是较低层的网 络编程接口。使用它可以跟内核打交道,它是开发者与内核交互的一个很好的 接口。packet.dll 提供了很多功能复杂的编程接口,其接口形式与微软的 ddk 提供的 packet32.dll 差不多。使用 packet.dll 比较烦琐,如果无特殊要求, 一般不用 packet.dll 进行编程开发。用的最多的还是 wpcap.dll,因为它提供 了一个更高级、更方便的编程接口。 图 3 中,wpcap.dll 是最上层的一个接口,与 libpcap 兼容,具有很好的 可移植性,是用的最多的一种编程接口。使用 wpcap.dll 进行数据包捕获的编 程与使用 libpcap 一样简单。 2.3.32.3.3 winpcap 数据结构数据结构 详细的一些数据结构在后面的软件编程中会给出,此处只是给出一些比较 核心的数据结构,并简单介绍。 1.pcap_addr pcap_addr 数据结构的定义如下: tpyedef struct pcap_addr pcap_addr_t; struct pcap_addr struct pcap_addr *next; /指向下一个地址结 点 struct sockaddr *addr; /网络接口地址 struct sockaddr *netmask; /地址掩码 struct sockaddr *broadaddr; /广播地址 struct sockaddr *dstaddr; /目的地址 ; 此数据结构描述的是网络接口的地址。 2.pcap_if pcap_if 数据结构定义如下: tpyedef struct pcap_if pcap_if_t; struct pcap_if struct pcap_if *next; /指向下一个网络接口结点 char *name; /网络接口名字 char *description; /描述信息 struct sockaddr *addresses; /网络接口地址 bpf_u_int32 flags; /标记 ; 第 8 页 共 27 页 此数据结构描述的是一个网络接口,它其实是网络接口链表中的一个结点。 3.pcap_pkthdr pcap_pkthdr 数据结构定义如下: struct pcap_pkthdr struct timeval ts; /时间戳 bpf_u_int32 caplen; /捕获长度 bpf_u_int32 len; /数据包长度 ; 此数据结构用来描述每个捕获到的数据包的一些基本信息,每个数据包都有此 数据结构。 2.3.42.3.4 winpcap 函数函数 winpcap 提供的输出函数与 libpcap 的函数完全一样,使用方法也一样, 呵呵,也就是说掌握了其中任何一种那么恭喜你不论是 windows 下的还是 linux 下的你都已经迈出了坚实的一大步,至少我个人是这么认为的。下面介 绍一些主要的函数。 1.网络接口函数 a) int pcap_findalldevs(pcap_if_t *alldevsp,char *errbuf) ; 函数返回值:如果操作成功,就返回 0;失败就返回-1。 参数描述:参数 alldevsp 表示网络接口链表,参数 errbuf 用来储存 错误信息。 此函数的功能是查找机器的所有可用网络接口,用一个链表返回。 b) void pcap_freealldevs(pcap_if_t *alldevs); 函数返回值:无。 参数描述:参数 alldevs 表示一个网络接口链表。 此函数的功能是释放网络接口链表中的所有网络接口。 c) pcap_t *pcap_open_live(const char *device,int snaplen,int promisc,int to_ms,char *ebuf); 函数返回值:返回一个 libpcap 句柄。 参数描述:参数 device 表示网络接口的名字;参数 snaplen 表示捕获 数据包的长度;参数 promisc 表示是否设置混杂模式,如 果赋值 1,就表示设置混杂模式;参数 to_ms 表示等待时间; 参数 ebuf 表示储存错误信息。 此函数的功能是打开一个网络接口进行数据包捕获打开的模式有 promisc 表示,如果是 1 就表示以混杂模式把接口打开。 第 9 页 共 27 页 2.规则函数 a) int pcap_setfilter(pcap_t *p,struct bpf_program *fp) /此函数设置 bpf 过滤规则,由参数 fp 确定 b) int pcap_compile(pcap_t *p,struct bpf_program *program,char *buf,int optimize,bpf_u_int32 mask) /此函数的功能是编译 bpf 过滤规则。 说明:此处的过滤规则只是在内核中过滤显示协议信息,并非过滤数据包, 并不能做到对数据包的阻塞功能,要想过滤数据包可以采用 ndis 网络 驱动在更底层来实现,所以我并没由添加这部分功能,这里只是提出 来说明下有这些功能。 3.数据包捕获函数 a) int pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user) 函数返回值:操作成功返回 0,失败返回负数。 参数描述:参数 p 表示 winpcap 的句柄;参数 cnt 为捕获数据包的个 数如果为-1 则表示无限个;参数 callback 表示回调函数; 参数 user 表示回调函数中传输的参数。 此函数是循环捕获网络数据包,直到遇到错误或者满足退出条件。每 捕获一个数据包就调用 callback 指示的回调函数,所以可以在回调函 数中对捕获到的数据包进行操作。 说明: 由于 pcap_loop()这个函数在没有数据包进出时会可能阻塞掉,而 且用 loop 会造成程序代码更加复杂,所以我采用的下面一个 pcap_next_ex()来循环抓包。 b) int pcap_next_ex(pcap_t *p,struct pcap_pkthdr *pkt_header,const u_char *pkt_data) 函数返回值:函数操作成功返回 1,如果超时就返回 0,失败则返回-1 或-2。 参数描述:参数 p 表示 winpcap 句柄;参数 pkt_header 宝石数据包头; 参数 pkt_data 表示数据包。 此函数的功能时捕获一个网络数据包。 说明:winpcap_next_ex()从 winpcap_next()发展的,更加简单好用, winpcap_next()还要配合 pcap_dispatch()来使用才能达到 winpcap_next_ex()的效果。 c) void pcap_close(pcap_t *p) 第 10 页 共 27 页 函数返回值:无。 参数描述:参数 p 为 winpcap 句柄。 此函数的功能是关闭 winpcap 操作,并销毁相应资源。 4.文件相关函数 a) pcap_dumper_t *pcap_dump_open(pcap_t *p,const char *fname) 此函数的功能是打开一个文件,并准备向其写入网络数据包数据。 b) void pcap_dump(u_char *user,const struct pcap_pkthdr *h,const u_char *sp) 此函数的功能是向文件中写入网络数据包内容。 3 3设计方案与系统功能描述设计方案与系统功能描述 3.13.1设计方案设计方案 在多方参考的情况下打算采用 winpcap 和 winsock 中的一种来实现抓包等 相应的功能。参考了网络安全开发包详解和windows 防火墙和网络封包 截获技术这两本书后决定采用 winpcap 来实现代码。winpcap 中封装了许多 的功能,只需要直接调用,就像 java 中封装好的类一样,使用起来非常方便。 通过 microsoft visual c+6.0 mfc 来实现可视化编程,通过一个简单的 界面来实现对于捕获网卡信息、本机 ip 地址、广播地址和子网掩码等信息的获 取显示。设置开始/停止按钮来实现对于抓包函数的调用的控制。在界面上获取 并显示系统当前时间,通过设置定时器每隔一秒钟触发一次获取当前系统时间 来实现一个时间显示。在开始/停止按钮中添加循环判断语句,并且设置一个 bool 型变量来控制是否开启抓包函数的调用。如果执行抓包函数,那么将捕获 到的数据包的信息保存并解析处里面的信息返回到 list 表中插入显示出来。如 果点击停止按钮则调用 pcap_close()函数来实现关闭 winpcap 操作。大体的一 个设计思路就是这样子的,具体的各个功能实现在软件编码部分会详细讲解。 下面部分,为了方便大家形象的理解其中的一些东西,会适当的结合一些 图片和代码来分类详细描述。 下面的图 4 是开发初期的大体界面框架。 第 11 页 共 27 页 图 4 mfc 控制界面 3.23.2功能描述功能描述 制作的这个软件的最主要也是最核心的功能就是对于网络数据包的捕获, 对于捕获到的网络数据包显示和简单的分析,分析数据包的协议类型(是 tcp、udp 还是 icmp 等) ,还有数据包的源 ip、目的 ip 还有端口号、时间戳 和包长等最后并将这些信息显示出来。实质是主要实现一个网络实时监听的功 能,然后将捕捉到的数据包保存下来以便进一步的分析使用。图 5 中为系统初 始化后加载各个模块的流程图。具体功能在后面章节中会分别详细说明。 图 5 功能模块图 第 12 页 共 27 页 3.33.3系统流程图系统流程图 下图 6 是程序流程图 图 6 程序流程图 根据流程图可以清楚明白的看到每一步的流程,程序是怎么样执行下去的, 有助于理解程序。 4 4编码实现编码实现 4.14.1winpcapwinpcap 环境设置环境设置 配置环境首先需要安装 winpcap,所使用的是 winpcap_3_1.exe,这个是必 须安装的,它是所有基于 winpcap 的应用程序运行所必须的。还有就是 wpdpack.zip 文件的解压了放在 d:毕业设计knightgwpdpack 中,它是 winpcap 开发包文件,是设计基于 winpcap 的应用程序的开发文件。该文件包 括开发用的头文件和静态链接库文件,是开发者要用到的。解压后会有几个文 件夹。其中,include 文件夹中的是 winpcap 的一些头文件,编程时必须把此 文件夹的路径包含到 visual c+的包含头文件的路径中;文件夹 lib 中是开发 程序时用刀的静态链接库,编程时此文件夹也必须包含到 visual c+库文件路 径中。 第 13 页 共 27 页 vc 环境下安装配置过程如下: 1、添加路径: 工具(tools)-选择(options)-目录(directories)同下图图 7 进行设置。 图 7 winpcap 环境配置 1 这里添加路径要注意自己 winpcap 安装时的 wpcap 和 include 的文件夹的 位置,要不然在代码编译和连接的时候都会报:cannot open include file: pcap.h: no such file or directory。刚开始写代码的时候就吃了这方面的 亏,对于这个 winpcap 的环境配置不来,教程和相应的参考书籍里面写的非常 的模糊,当时配置起来选项和栏目又多不知道该要填在哪儿,对于一个 winpcap 的初学者来说实在时有一定的难度,后来在 msdn 论坛上面求教后才明 白该怎么弄,所以在论文中特别将这点加入进来。 添加路径时要注意这里不仅要添加头文件相关的路径,还要加入 libpcap 的的路径。否则编译过了,连接时也会报错:cannot open file “wpcap.lib“。 图 8 winpcap 环境设置 2 第 14 页 共 27 页 2、设置工程参数 新建一个工程后, 工程(project)-设置(settings) 选择 c/c+;在预处理程序定义(preprocessor definition)里面添加 图 9 winpcap 环境设置 3 wpcap 即可。 同理设置 link,如下图图 10: 图 10 winpcap 环境配置 4 4.24.2 mfcmfc 控件相关控件相关 通过设置不同的按钮来实现不同的控制功能,还可以通过设置 list 表来显 示信息。其中这里主要说下关于 list 表的问题。其他的控件都比较简单就不在 第 15 页 共 27 页 这里多说了。 将 list 的属性中的 style 里查看选项改成了 report 格式,然后通过插入 语句来实现对表项中每一列显示信息种类的设置。 /设置监听状况表项 m_list1.insertcolumn( 0, _t(“协议类型“), lvcfmt_left, 60); m_list1.insertcolumn( 1, _t(“时间“), lvcfmt_left, 70); m_list1.insertcolumn( 2, _t(“包头长“), lvcfmt_left, 60); m_list1.insertcolumn( 3, _t(“源 ip 地址“), lvcfmt_left, 125); m_list1.insertcolumn( 4, _t(“目的 ip 地址“), lvcfmt_left, 125); m_list1.insertcolumn( 5, _t(“源端口号“), lvcfmt_left, 60); m_list1.insertcolumn( 6, _t(“目的端口号“), lvcfmt_left, 80); 设置第一列为协议类型,然后第二到七列分别为捕获到数据包的时间戳、 包头长度、源 ip、目的 ip、源端口号和目的端口号。 然后在抓包函数执行后得到我们需要的信息后执行和列的插入来将数据返 回界面并显示出来。 row=m_list1.getitemcount(); row=m_list1.insertitem(row,ip_header_proto); /协议类型 m_list1.setitemtext(row,1,time1); /捕获数据包的时间戳 m_list1.setitemtext(row,2,bag_header_len); /包头长度 m_list1.setitemtext(row,3,sourceip); /源 ip m_list1.setitemtext(row,4,desip); /目的 ip m_list1.setitemtext(row,5,sourceport); /源端口号 m_list1.setitemtext(row,6,desport); /目的端口号 其中数据包的显示是通过定时器每隔一秒钟触发调用一次将捕捉到的数据 包信息返回插入到 list 表中 4.34.3定时器和系统时间的获得定时器和系统时间的获得 settimer(1,1000,null); /设置定时器,1000ms 触发一次 cdialog:ontimer(nidevent); / 获得系统当前时间 第 16 页 共 27 页 systemtime tnow; getlocaltime( m_tc.format(“%2d:%2d:%2d“,tnow.whour,tnow.wminute,tnow.wsecond); updatedata(false); 其中设置定时器放在程序的初始化里边,通过控件显示定时器每个一秒触 发一次获取当前时间函数所得到的时间。定时器的设置在捕获网络数据包函数 还将会使用到,后面会详细说明。 4.44.4捕获并显示本机信息捕获并显示本机信息 int getnetworkcardinfo() /捕获网卡信息函数 pcap_findalldevs( /将网卡描述传递到 description 中 ip_address=iptos(structsockaddr_in*)a-addr)-sin_addr.s_addr); submask=iptos(structsockaddr_in*)a-netmask)-sin_addr.s_addr); 通过下面的函数把 u_long 型的数据转换可读的 ip 地址和子网掩码 char *iptos(u_long in) static char outputiptosbuffers3*4+3+1; /定义 buffers 的大小 3*4+3+1,后面的+3+1 分别是代表 3 个“.”和 1 个结束符 static short which; u_char *p; p = (u_char *) which = (which + 1 = iptosbuffers ? 0 : which + 1); sprintf(outputwhich, “%d.%d.%d.%d“, p0, p1, p2, p3); /输出 ip: *.*.*.* return outputwhich; 在初始化程序通过调用和文本设置语句将获取的本机信息传递到 mfc 界面 中显示出来 /调用获取网卡及本机信息函数 getnetworkcardinfo() 第 17 页 共 27 页 /输出网卡基本信息 m_des.setwindowtext(description); m_ip.setwindowtext(ip_address); m_submask.setwindowtext(submask); m_addressfamilyname.setwindowtext(address_family_name); 通过设置的文本框来接收并显示这些信息。 4.54.5捕获数据包及相关操作捕获数据包及相关操作 接下来就是重中之重的数据包捕获等相关操作了。首先要了解一些基本信 息,以便更加容易理解这段代码。当然这里所给出的都是实现每一个功能的主 要代码,如头文件还有一些结构(tcp、udp 等首部的结构)的定义这里并没有 给出。这些东西将不会特别给出给出,如有需要可以自行参考。因为这些只是 一些 struct 定义而已,将各个首部中的各种相关属性定义到一起。所以这里为 了大家方便理解就形象化的把个首部的信息用 excel 作出了插入到这里大家可 以看看,代码中很多地方都用到了一些相关信息。 图 11 ip 首部 图 12 tcp 首部 图 13 udp 首部 第 18 页 共 27 页 从图 11、12 和 13 中可以轻易的看出每一种协议的数据包首部所包含的信 息,这些信息很多都是可以解析看到,也是我们分析判断的依据。不论是监听 网络状况还是防火墙的过滤规则安全策略,捕获数据包并分析其中所包含的内 容绝对都是其中的关键和绝对的前提。 当初在写抓包程序这段代码的时候遇到了一定的问题,最开始打算通过 ndis 网络驱动程序来实现这段代码,但是通过一段时间的初步学习鉴于对驱动 程序的各种特性的不了解最终在韩斌韩老师和宋波宋老师的建议下改用 winpcap 来实现。 刚开始在使用 winpcap 来实现抓包功能的时候采用了 pcap_loop()这个函 数来实现,但是当使用这个函数将抓包程序写出来的时候发现调用这个函数来 实现抓包功能的时候存在一定的缺陷。首先这个函数在没有数据包到来的时候 将会出现阻塞的情况,而且还会增加程序的复杂程度。基于回调包捕获机制的 pcap_loop()在某些情况下是不错的选择。一般程序不大的情况下使用。但是在 一些情况下处理回调并不特别好:这会使程序变的复杂并且在象多线程或 c+ 类这些情况下它看起来到像一块绊脚石。 于是同样用 pcap_next_ex()来编写了一个捕获网络数据包的小程序来实验 比较,最终决定是用 pcap_next_ex()来实现抓包功能。pcap_next_ex()是在 pcap_next()的基础出现的,pcap_next()因为 pcap_next()有许多限制在很多 情况下并不鼓励用它。首先它的效率很低因为它隐藏了回掉方法并且还依赖于 pcap_dispatch()这个函数。再次它不能够识别文件结束标志 eof 所以对来自文 件的数据流它几乎无能为力。 下面来看看这段代码: int cfirewalldlg:capturebag() pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbufpcap_errbuf_size; struct tm *ltime; char timestr16; ip_header *ih; 第 19 页 共 27 页 udp_header *uh; u_int ip_len; u_short sport,dport; /* 重新获取网络接口链表 */ pcap_findalldevs( /* 跳转到选择的网卡,这里设置的默认可用网络接口为第二块,即本机的网卡,第一 块是拨号的。并且在这里给出遍历每一块网络接口的代码(可通过循环来实现): for(d=alldevs; d; d=d-next) */ d=alldevs; d=d-next; /* 打开网卡 */ adhandle= pcap_open_live(d-name, / 网络接口名称 65536, / 捕获数据包的长度 1, / 混杂模式 1000, / 读取超时 errbuf / 错误缓冲区 ); /*释放所有设备列表 */ pcap_freealldevs(alldevs); / 建立存储截获数据包的文件 pcap_dumper_t* dumpfile; dumpfile=pcap_dump_open(adhandle, “packet.dat“); /将捕获的信息保存到抓包程序所在目录下的 packet.dat 中以便以后进一步分析使用 /* 此处循环调用 pcap_next_ex 来接受数据报*/ res = pcap_next_ex( adhandle, /* 转换时间戳为识别格式 */ ltime=localtime( 第 20 页 共 27 页 strftime( timestr, sizeof timestr, “%h:%m:%s“, ltime); /* 找到 ip 头的位置 */ ih = (ip_header *) (pkt_data + 14); /14 为以太网首部的长度 ip_len = (ih-ver_ihl uh = (udp_header *) (u_char*)ih + ip_len); /* 将端口信息从网络型转变为主机顺序 */ sport = ntohs( uh-sport ); dport = ntohs( uh-dport ); /将捕获到数据包时间戳赋给 time1,转换包头长、源 ip、目的 ip、源端口号、目的端口 号转换为可读格式 time1=timestr; bag_header_len.format(“%d“,header-len); sourceip.format(“%d.%d.%d.%d“,ih-saddr.byte1,ih-saddr.byte2,ih- saddr.byte3,ih-saddr.byte4); desip.format(“%d.%d.%d.%d“,ih-daddr.byte1,ih-daddr.byte2,ih- daddr.byte3,ih-daddr.byte4); sourceport.format(“%d“,sport); desport.format(“%d“,dpo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年全球及中国铁磁共振充电器行业现状动态及未来发展态势剖析研究报告
- 简单家具买卖合同范本
- 雇佣双方劳动合同
- 2024-2025学年河南省周口恒大中学高一上学期开学考试历史试题(解析版)
- 2024年腈类项目评估分析报告
- 2024年血橙提取物化妆品项目综合评估报告
- 2023年家用制冷电器具项目综合评估报告
- 2024至2030年中国变频恒压供水节电器数据监测研究报告
- 2023年专科疾病防治服务项目评估分析报告
- 2024至2030年中国面包模型行业投资前景及策略咨询研究报告
- (2024年)茶艺授课课件
- 学科交叉-语文与其他学科的融合
- 金融服务方案范本
- 设备技改方案范文
- 兼职潜水教练合同
- 华为认证数通高级 HCIE-Datacom H12-891考试题库-上(单选、多选题汇总)
- 增资扩产政府措施
- 2024年安徽合肥兴泰商业保理有限公司招聘笔试参考题库含答案解析
- 住宅小区人群分析报告
- 医疗标书的供货方案
- 非煤矿山安全生产知识题库
评论
0/150
提交评论