【网络程序设计】在vs2008MFC下开发基于winpcap的网络嗅探器(IPTCPUDP)_第1页
【网络程序设计】在vs2008MFC下开发基于winpcap的网络嗅探器(IPTCPUDP)_第2页
【网络程序设计】在vs2008MFC下开发基于winpcap的网络嗅探器(IPTCPUDP)_第3页
【网络程序设计】在vs2008MFC下开发基于winpcap的网络嗅探器(IPTCPUDP)_第4页
【网络程序设计】在vs2008MFC下开发基于winpcap的网络嗅探器(IPTCPUDP)_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计课程设计设计报告设计报告 题 目: 基于 winpcap 的网络嗅探器的实现 学 号: 姓 名: 学 院: 专业班级: 指导教师: 设计时间: 指导老师评语: 评定成绩: 签名: 日期: 2 目目 录录 1 1 概述概述.3 1.1 课程设计的目的.3 1.2 设计任务与要求.3 1.3 开发环境.3 2 2 系统设计的基本概念与原理系统设计的基本概念与原理.3 2.1 ip 协议基本知识.3 2.2 tcp 协议基本知识.7 2.3 udp 协议基本知识.9 2.4 winpcap基本知识.9 2.5 winpcap基本原理.14 2.6 mfc 编程框架.17 3 3 基于基于 w

2、inpcapwinpcap 的单文档网络嗅探器的设计与分析的单文档网络嗅探器的设计与分析.20 3.1 系统设计实现的基本原理与过程.20 3.2 系统功能设计.22 3.3 系统架构设计.22 3.4 子系统与模块设计.23 3.4.1 网络嗅探器设置模块.23 3.4.2 网络数据包的捕获模块.24 3.4.3 解析和显示模块.24 4 4 系统详细设计与实现系统详细设计与实现.24 4.1 数据结构的设计.24 4.2 全局变量与函数的声明.25 4.3 嗅探器界面设计.26 4.4 嗅探器捕获模块的设计与实现.26 4.5 网络数据包捕获模块的设计与实现.31 4.6 解析和显示模块的

3、设计与实现.32 4.6.1 列表视图初始化设置.32 3 4.6.2 从读取离线数据包并在列表视图中显示.33 4.6.2 响应用户鼠标消息,解析对应行的数据包信息。.36 5 5 系统调试与运行系统调试与运行.38 5.1 winpcap函数库的安装.38 5.2 sniffer网络嗅探器的测试与运行.38 6 6 课程设计总结课程设计总结.39 参考文献参考文献.40 1 概述 1.1 课程设计的目的 目的:设计一个 gui 程序,实现 ip、tcp、udp 数据包的捕获和解析。通过 编程了解各类数据报的结构,掌握网络编程的基本原理和方法。 1.2 设计任务与要求 本课程设计的基本内容是

4、捕获 ip,tcp,udp 数据包,通过解析数据包,理解 和掌握各类数据包的结构 (1)设计一个 gui 程序,完成局域网数据包的捕获和 ip、tcp、udp 数据包 的解析; (2)捕获几个网络数据报,给出实例并分析各数据包各字段的含义; (3)说明基于 winpcap 编程的基本原理、程序的总体框架,绘制每个函数的 详细设计流程图。 1.3 开发环境 标准 pc 机,windows 操作系统,vs2008 集成开发环境,winpcap 函数库。 4 2 系统设计的基本概念与原理 2.1 ip 协议基本知识 (1) ip 协议介绍 ip 是英文 internet protocol(网络互连的

5、协议)的缩写,中文简称为 “网协” ,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中, 它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算 机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要 遵守 ip 协议就可以与因特网互连互通。 (2) ip 协议的网络互连实现 各个厂家生产的网络系统和设备,如 以太网、分组交换网等,它们相 互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元 (技术上称之为 “帧” )的格式不同。 ip 协议实际上是一套由软件程序组成 的协议软件,它把各种不同 “帧”统一转换成 “ip 数据包”格式,这种转 换

6、是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互 通,即具有“开放性”的特点。 (3) ip 数据报 tcp/ip 协议定义了一个在因特网上传输的包,称为 ip 数据报(ip datagram)。这是一个与硬件无关的虚拟包, 由首部和数据两部分组成,其格式 如图 2.1 所示: 图 2.1 ip 数据报一般格式 ip 数据报的详细格式如图 2.2 所示: 0 3 7 15 31 版本首部长度 服务类型总长度 标识标志片偏移 生存时间协议头校验和 源 ip 地址 数据报的数据区数据报首部 5 目的 ip 地址 选项填充域 数据部分 图 2.2 ip 数据报的详细格式 ip 数据报

7、固定部分各字段含义: (1)版本占 4 位,指 ip 协议的版本。通信双方使用的 ip 协议版本必 须一致。目前广泛使用的 ip 协议版本号为 4(即 ipv4) 。关于 ipv6,目前 还处于草案阶段。 (2)首部长度占 4 位,可表示的最大十进制数值是 15。请注意,这 个字段所表示数的单位是 32 位字长(1 个 32 位字长是 4 字节) ,因此,当 ip 的首部长度为 1111 时(即十进制的 15) ,首部长度就达到 60 字节。当 ip 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以 填充。因此数据部分永远在 4 字节的整数倍开始,这样在实现 ip 协议时较

8、为方便。首部长度限制为 60 字节的缺点是有时可能不够用。但这样做是希 望用户尽量减少开销。最常用的首部长度就是20 字节(即首部长度为 0101) ,这时不使用任何选项。 (3)区分服务占 8 位,用来获得更好的服务。这个字段在旧标准中叫 做服务类型,但实际上一直没有被使用过。 1998 年 ietf 把这个字段改名 为区分服务 ds(differentiated services)。只有在使用区分服务时,这个 字段才起作用。 (4)总长度总长度指首部和数据之和的长度,单位为字节。总长度字 段为 16 位,因此数据报的最大长度为 216-1=65535 字节。 在 ip 层下面的每一种数据链

9、路层都有自己的帧格式,其中包括帧格式 中的数据字段的最大长度,这称为最大传送单元mtu(maximum transfer unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加 上数据部分)一定不能超过下面的数据链路层的mtu 值。 (5)标识(identification)占 16 位。ip 软件在存储器中维持一个计 数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个 “标识”并不是序号,因为 ip 是无连接服务,数据报不存在按序接收的问 6 题。当数据报由于长度超过网络的mtu 而必须分片时,这个标识字段的值 就被复制到所有的数据报的标识字段中。相同的标识字

10、段的值使分片后的各 数据报片最后能正确地重装成为原来的数据报。 (6)标志(flag)占 3 位,但目前只有 2 位有意义。 标志字段中的最低位记为 mf(more fragment)。mf=1 即表示后面 “还 有分片”的数据报。 mf=0 表示这已是若干数据报片中的最后一个。 标志字段中间的一位记为 df(dont fragment),意思是“不能分片” 。 只有当 df=0 时才允许分片。 (7)片偏移占 13 位。片偏移指出:较长的分组在分片后,某片在原分 组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。 片偏移以 8 个字节为偏移单位。这就是说,每个分片的长度一定是

11、8 字节 (64 位)的整数倍。 (8)生存时间占 8 位,生存时间字段常用的的英文缩写是ttl(time to live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字 段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白 消耗网络资源。最初的设计是以秒作为ttl 的单位。每经过一个路由器时, 就把 ttl 减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的 时间小于 1 秒,就把 ttl 值减 1。当 ttl 值为 0 时,就丢弃这个数据报。 (9)协议占 8 位,协议字段指出此数据报携带的数据是使用何种协议, 以便使目的主机的 ip 层知道应将数据部分上

12、交给哪个处理过程。 (10)首部检验和占 16 位。这个字段只检验数据报的首部,但不包括 数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首 部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化) 。 不检验数据部分可减少计算的工作量。 (11)源地址占 32 位。 (12)目的地址占 32 位。 ip 数据报可选部分字段含义: ip 首部的可变部分就是一个可选字段。选项字段用来支持排错、测量以 及安全等措施,内容很丰富。此字段的长度可变,从1 个字节到 40 个字节 7 不等,取决于所选择的项目。某些选项项目只需要1 个字节,它只包括 1 个字节的选项代码。但还有些选

13、项需要多个字节,这些选项一个个拼接起来, 中间不需要有分隔符,最后用全 0 的填充字段补齐成为 4 字节的整数倍。 2.2 tcp 协议基本知识 (1)tcp 协议介绍 tcp:transmission control protocol (传输控制协议)tcp 是一种面向连 接(连接导向)的、可靠的、基于字节流的运输层通信协议。在 osi/rm 模型 中,它完成第四层传输层所指定的功能,udp 是同一层内另一个重要的传输协 议。 (2)tcp 协议的作用 在因特网协议族(internet protocol suite)中,tcp 层是位于 ip 层之上,应 用层之下的运输层。 应用层向 tcp

14、 层发送用于网间传输的、用 8 位字节表示的数据流,然 后 tcp 把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数 据链路层的最大传送单元 (mtu)的限制) 。之后 tcp 把结果包传给 ip 层, 由它来通过网络将包传送给接收端实体的tcp 层。tcp 为了保证不发生丢 包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按 序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ack); 如果发送端实体在合理的往返时延 (rtt)内未收到确认,那么对应的数据 (假设丢失了)将会被重传。 tcp 用一个校验和函数来检验数据是否有错 误;在发送和接收时都要计算

15、校验和。 首先,tcp 建立连接之后,通信双方都同时可以进行数据的传输,其次, 他是全双工的;在保证可靠性上,采用超时重传和 稍待确认机制。 在流量控制上,采用 滑动窗口协议 ,协议中规定,对于窗口内未经确认 的分组需要重传。 在拥塞控制上,采用慢启动算法。 (3) tcp 报文段格式 8 两台机器上的 tcp 软件之间传送的数据单元称为报文段。两台机器通过报 文段的交互来建立连接、传送数据、发送确认、通告窗口大小及关闭连接。每 个报文段分为两个部分:首部和数据。tcp 报文格式如图 2.3: 0 4 10 16 24 31 源端口目的端口 序号 确认序号 首部长度保留代码比特窗口 校验和紧急

16、指针 选项填充 数据 图 2.3 tcp 报文段详细格式 tcp 报文字段说明: 源端口号(16 位),标识主机上发起传送的应用程序; 目的端口(16 位)标识主机上传送要到达的应用程序。 序号:占 32 比特。用来标识从 tcp 源端向 tcp 目标端发送的数据字节流,它 表示在这个报文段中的第一个数据字节。 确认序号:占 32 比特。只有 ack 标志为 1 时,确认号字段才有效。它包 含目标端所期望收到源端的下一个数据字节。 首部长度:占 4 比特。给出头部占 32 比特的数目。没有任何选项字段的 tcp 头部长度为 20 字节;最多可以有 60 字节的 tcp 头部。 预留:由跟在数据

17、偏移字段后的 6 位构成,预留位通常为 0. 代码比特(u、a、p、r、s、f):占 6 比特。各比特的含义如下: urg:紧急指针(urgent pointer)有效。 ack:确认序号有效。 psh:接收方应该尽快将这个报文段交给应用层。 rst:重建连接。 syn:发起一个连接。 fin:释放一个连接。 9 窗口大小:占 16 比特。此字段用来进行流量控制。单位为字节数,这个值 是本机期望一次接收的字节数。 tcp 校验和:占 16 比特。对整个 tcp 报文段,即 tcp 头部和 tcp 数据进 行校验和计算,并由目标端进行验证。 紧急指针:占 16 比特。它是一个偏移量,和序号字段中

18、的值相加表示紧急 数据最后一个字节的序号。 选项、填充:占 32 比特。可能包括窗口扩大因子、时间戳等选项。 2.3 udp 协议基本知识 (1) udp 协议介绍 udp 协议的全称是用户数据报协议,在 网络中它与 tcp 协议一样用于 处理数据包。在 osi 模型中,在第四层 传输层,处于 ip 协议的上一层。 udp 有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说, 当报文发送之后,是无法得知其是否安全完整到达的。 udp 用来支持那 些需要在计算机之间传输数据的网络应用。包括 网络视频会议 系统在内的 众多的客户/服务器模式的网络应用都需要使用udp 协议。udp 协议从

19、问 世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖, 但是即使是在今天, udp 仍然不失为一项非常实用和可行的网络传输层协 议。 (2) udp 报文格式 udp 报文段首部只有 8 个字节;详细格式见图 2.4 0 1 3 5 7 源端口目的端口长度校验和 数据 图 2.4 udp 报文详细格式 10 2.4 winpcap 基本知识 (1) winpcap 简介 (1) winpcap 简介 大多数 unix 操作系统提供了一套允许应用程序直接与网络相互联系的系统 调用。这些指令对于那些需要通过网络捕获连续的包数据而不用内核进行过多 的干预的包捕获应用程序非常有用。在

20、 windows 环境下,winpcap 就是这样一 类工具。 winpcap 是一个在 windows 操作系统下的免费、公开的用于直接访问网络 的开发工具包(编程 api) 。大多数 windows 网络应用程序都是通过 winsock api(windows 套接口)这类高级编程接口访问网络的。这种方法允许在网络上 进行简单的数据传送,因为操作系统的 tcp/ip 协议栈实现软件会处理底层细节 (协议操作、流程重组等等) ,并提供一个类似于读写文件的函数接口。 然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过 tcp/ip 协议栈,直接处理底层网络中的通信数据,它们需要对网络

21、进行底 层进行直接访问,即在没有类似协议栈(tcp/ip 协议栈)的实体介入条件 下对网络进行原始访问。 基于 winsock api 编程,应用程序是通过调用操作系统提供的编程接口访 问 tcp/ip 协议栈实现网络通信的。基于 winpcap 编程,网络程序实际上是绕开 操作系统的 tcp/ip 协议栈直接通过底层网络发送数据,因此,网络程序可以实 现一些更低级、更灵活的功能。 (2) winpcap 的目的和用途 开发 winpcap 的目的是为 win32 应用程序提供一种直接访问底层网络的能 力。通过 winpcap,网络应用程序可以实现如下功能: 捕获原始数据包,包括发送到本主机以

22、及在共享网络上的数据包。 数据过滤。在将数据包发送给应用程序之前按照用户的规定对捕获的数据 包进行过滤。 发送原始数据包。向网络发送原始数据包。 数据包统计。对网络通信进行统计。 11 上述功能都通过一个设备驱动(这个驱动程序安装在 win32 内核的网络部 分)和一组动态连接库(dll)获得。所有这些功能部件都通过一个强大的编程 接口来实现,应用程序能易于开发并且能移植到各种操作系统中。 (3) 基于 winpcap 可开发的网络应用程序 基于 winpcap 可以开发很多网络应用程序,典型的包括: 网络和协议分析软件 网络监听软件 网络通信量记录软件 网络数据生成软件 用户机网桥和路由器

23、网络入侵探测系统 网络扫描软件 网络安全工具 winpcap 的局限性: winpcap 可以独立于主机的协议(如 tcp/ip 协议)进行接收和发送数据包。 这意味着 winpcap 不能阻塞、过滤或处理本机上其它程序产生的数据。它仅仅 能嗅探在网线上传输的数据包。因此,winpcap 不能在 traffic shapers、qos schedulers 和个人防火墙这类应用程序中使用。 winpcap 的开发和运行环境 : 目前,winpcap 主要的开发和运行环境是 windows nt/2000/xp。由于 winpcap 的用户中只有很小一部分使用 windows 95/98/me,

24、并且微软也已经放 弃了对 win9x 的开发和支持。实际上,winpcap 中的面向 9x 系统的概念和 nt 系统的非常相似,只是在某些实现上有点差异,比如说 9x 只支持 ansi 编码, 而 nt 系统则提倡使用 unicode 编码。 winpcap 的组成与结构: winpcap 由一个数据包监听设备驱动程序(npf) 、一个底层的动态连接库 (packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个 部分构成,如图 2.5 所示。这里,npf 在操作系统的内核级, packet.dll、wpcap.dll 在用户级。 12 1)数据包监听设备驱动程序

25、技术实现上,为了实现抓包,系统必须绕过操作系统的协议栈来访问在网 络上传输的原始数据包(raw packet) 。这就要求 winpcap 的一部分运行在操作 系统核心内部,直接与网络接口驱动交互。由于这个部分是系统依赖(system dependent)的,在 winpcap 的解决方案中它被视为是一个设备驱动,称作 npf(netgroup packet filter) 。winpcap 开发小组针对 windows95,windows98,windowsme,windows nt 4,windows2000 和 windowsxp 提供了不同版本的驱动(在 windows95/98/me

26、 中是 vxd 文件,在 windowsnt/2000 中是 sys 文件) 。这些驱动不仅提供了基本的特性(例如抓包、 发送原始数据包注入数据包) ,还有更高级的特性(例如可编程的过滤器系 统和监视引擎) 。前者可以被用来约束一个抓包会话只针对网络通信中的一个子 集(例如,只捕获特殊主机产生的 ftp 通信数据包) ,后者提供了一个强大而简 单的统计网络通信量的机制(例如,获得网络负载或两个主机间的数据交换量) 。 2)底层的动态连接库(packet.dll)和高层静态库(wpcap.dll) 为了方便编程,winpcap 必须提供一个编程接口(api) ,这就是 winpcap 的底层的动

27、态连接库(packet.dll)和高层静态库(wpcap.dll) 。这里, packet.dll 提供了一个底层 api,伴随着一个独立于 microsoft 操作系统的编 图 2.5 winpcap 的组成和结构 应用程序 wpcap.dll packet.dll npf device driver 用户层用户层 核心层核心层 网络层网络层 数据包 13 程接口,这些 api 可以直接用来访问驱动的函数;wpcap.dll 导出了一组更强 大的与 libpcap 一致的高层抓包函数库(capture primitives) ,这些函数使得 数据包的捕获以一种与网络硬件和操作系统无关的方式进

28、行。 底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序 隔离开来,使得应用程序可以不加修改地在不同的 windows 系统上运行。高级 的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向 应用程序提供完善的监听接口。 winpcap 的技术细节: 1)npf 驱动 网络数据包过滤器(netgroup packet filter,简称 npf)是 winpcap 的 核心部分,它是 winpcap 完成困难工作的核心组件。npf 负责处理网络上传输 的数据包,并向上层提供各种服务,包括数据包的捕获(capture) 、发送 (injection)和分析性能(an

29、alysis capabilities) 。 2)npf 和 ndis ndis(network driver interface specification)是 windows 环境下的 一个定义网络适配器(或者说成是管理网络适配器的驱动程序)与协议驱动 (例如 tcp/ip 的实现)之间通信的规范,如图 2.2。基于 ndis,顶层应用(例 如 tcp/ip 协议)可以发送和接收网络(lan 或 wan)上的数据包而不必关心特 定的适配器硬件或特定的 win32 操作系统版本。 ndis 支持三种类型的网络驱动: 网络接口卡或 nic 驱动(network interface card o

30、r nic drivers) 。nic 驱动直接管 理着网络接口卡(nic) 。nic 驱动接下边与硬件连接, 从上边表现为一个接口,该接口允许高层发送数据 包到网络上,处理中断,重置 nic,停止 nic,查询 和设置驱动的运行特征。nic 驱动可以是小端口 (miniport)或完全的 nic 驱动(full nic driver) 。 miniport 驱动仅仅实现了管理 nic 的必要操作,包括在 nic 上发送和接收 网卡硬件 网卡驱动程序 ndis tcp/ip 协议栈实现 图 2.2 ndis 的作用和地位 14 数据。对于所有最底层的 nic 驱动的操作由 ndis 提供,例如

31、同步 (synchronization) 。小端口(miniport)不直接调用操作系统函数,它们对 于操作系统的接口是 ndis。 完全 nic 驱动(full nic driver)完成硬件细节的操作和所有由 ndis 完 成的同步和查询操作。例如,完全 nic 驱动维持接收到的数据的绑定信息。 中间层驱动(intermediate drivers)中间层驱动位于高层驱动(例如 协议驱动)和小端口之间。对于高层驱动,中间层驱动看起来像是小端口;对 于小端口,中间层驱动看起来像协议驱动。一个中间层协议驱动可以位于另一 个中间层驱动之上,尽管这种分层可能对系统性能带来负面影响。 传输驱动或协议

32、驱动(transport drivers or protocol drivers)协 议驱动实现了网络协议栈。在协议驱动的上面,它为应用层客户程序服务;在 它的下面,它与一个或多个 nic 驱动或中间层 ndis 驱动连接。 3)npf 在 windows 系统中的位置 如图 2.6,npf 是一个协议驱动。从性能方面来看,这不是最好的选择,但 是它合理地独立于 mac 层并且有权使用原始通信(raw traffic) 。可以看出, npf 在 ndis 之上,它与 tcp/ip 协议栈的实现在同一层次。因此,应用程序不 通过 winsock 也可以实现数据的发送和接受。 图 2.6 npf

33、在 windows 系统中的位置 基于 winsock 的应用程序 npftcp/ip 协议实现 nic driver (ndis3.0 或更高) 核心层核心层 网络层网络层 数据包 基于 wincap 的应用程序 15 2.5 winpcap 基本原理 抓包是 winpcap 的基本功能,也是 npf 最重要的操作。在抓包的时候,驱 动(例如 nic driver)使用一个网络接口监视着数据包,并将这些数据包完整 无缺地投递给用户级应用程序。 如图 2.7,winpcap 的 npf 抓包主要依靠两个组件。 1)数据包过滤器(filter) 。数据包过滤器决定是否接收进来的数据包并 把数据包

34、拷贝给监听程序。数据包过滤器是一个有布尔输出的函数。如果函数 值是 true,抓包驱动拷贝数据包给应用程序;如果是 false,数据包将被丢弃。 npf 数据包过滤器更复杂一些,因为它不仅决定数据包是否应该被保存,而且 还决定要保存的字节数。 应用程序采用用户自定义的过滤器并使用 wpcap.dll 将它们编译进 bpf 程 序。然后,应用程序使用 biocsetf ioctl 写入核心态的过滤器。这样,对于每 一个到来的数据包该程序都将被执行,而满足条件的数据包将被接收。与传统 解决方案不同,npf 不解释(interpret)过滤器,而是执行(execute)它。 由于性能的原因,在使用过

35、滤器前,npf 提供一个 jit 编译器将它转化成本地 的 80 x86 函数。当一个数据包被捕获,npf 调用这个本地函数而不是调用过滤 器解释器,这使得处理过程相当快。 2)循环缓冲区(buffer) 。npf 的循环缓冲区用来保存数据包以免丢失 (如果一个包符合过滤器的要求,就被复制到循环缓冲区) 。一个保存在缓冲区 中的数据包有一个头,它包含了一些主要的信息,例如时间戳和数据包的大小, 注意:它不是协议头。另外,循环缓冲区以队列插入的方式来保存数据包,提 高数据的存储效率。程序员可以以组的方式将数据包从 npf 缓冲区拷贝到应用 程序,这样就提高了性能,因为它降低了读的次数。如果一个数

36、据包到来的时 候缓冲区已经满了,那么该数据包将被丢弃,这时就发生了丢包现象。 3)network tap 是一个用于探听网络中所有数据流的函数。 4)数据统计 如图 2.7,为了提高数据处理的速度,winpcap 将统计和监听功能移到内核 中,这样避免了将任何数据都传递给用户。winpcap 通过使用从 npf 中得到的 16 过滤器来执行一个内核级的可编统计模块,这使其变成一个强大的分级引擎, 而不只是个简单的包过滤器。应用程序可以构造这个模块来监听网络活动的任 意方面(例如:网络负荷、两台主机间的流量、每秒 web 请求的次数等等) ,并 在预定的时间间隔内接收内核传来的数据。 (4) 基

37、于 winpcap 的网络编程编程 api 接口的选择 如前所述,winpcap 由三部分模块组成npf、packet.dll 和 wpcap.dll。编程方面,我们主要使用 packet.dll 和 wpcap.dll 提供的编程接 口。基于 packet.dll 编写的程序可以不经过重新编译就在各种 win32 平台下实 现捕获数据包。另外,packet.dll 还包含了其他一些函数,它可以进行一些底 层的操作,如获取网络适配器名或动态的加载驱动程序。通过 packet.dll 还可 以取得一些系统信息,如主机的 mac 地址、一些硬件计数,例如以太网上冲突 次数等。packet.dll

38、和 npf 都严重依赖于操作系统,并且由于 windows95/98 图 2.7 wincap 的内部结构和原理 基于 winpcap 的监控程序 packet.dll wpcap.dll nic driver (ndis3.0 或更高) 核心层核心层 网络层网络层 数据包 基于 winpcap 的应用程序 1 filter1filter2filter3 buffer1 buffer2 统计引擎 network tap tcp/ ip 协 议栈 其他 协议 栈实 现 user- buffer1user- buffer2 基于 winpcap 的应用程序 2 npf 调用packet.dll a

39、pi 的程序 直接访问 npf 的程序 用户层用户层 17 和 windowsnt/2000 之间 os 结构的不同而在不同版本的操作系统上有所不同。 为了提高应用程序的可移植性,winpcap 提供了基于 wpcap.dll 的编程方 式。这里,wpcap.dll 不依赖于操作系统,它包含了一些其它高层的函数,比 如:过滤器生成器、用户定义的缓冲区和高层特性(数据统计和构造数据包) 。 wpcap.dll 能自动调用 packet.dll。一个“高层”调用会被译成几个 npf 系统 调用。程序员一般使用 wpcap.dll,只有在为数不多的程序中才直接使用 packet.dll。 2.6 m

40、fc 编程框架 mfc (microsoft foundation class library)中的各种类结合起来构成了 一个应用程序框架,它的目的就是让程序员在此基础上来建立 windows 下的应 用程序,这是一种相对 sdk 来说更为简单的方法。因为总体上,mfc 框架定义 了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是 通过预定义的接口把具体应用程序特有的东西填入这个轮廓。microsoft visual c+提供了相应的工具来完成这个工作:appwizard 可以用来生成初步 的框架文件(代码和资源等) ;资源编辑器用于帮助直观地设计用户接口; classwiz

41、ard 用来协助添加代码到框架文件;最后,编译,则通过类库实现了 应用程序特定的逻辑。 (1) mfc 类的封装 构成 mfc 框架的是 mfc 类库。mfc 类库是 c+类库。这些类或者封装了 win32 应用程序编程接口,或者封装了应用程序的概念,或者封装了 ole 特性, 或者封装了 odbc 和 dao 数据访问的功能,等等,分述如下。 1) 对 win32 应用程序编程接口的封装 用一个 c+ object 来包装一个 windows object。例如:class cwnd 是一个 c+ window object,它把 windows window(hwnd)和 windows

42、window 有关的 api 函数封装在 c+ window object 的成员函数内,后者的成员变量 m_hwnd 就 是前者的窗口句柄。 2) 对应用程序概念的封装 18 使用 sdk 编写 windows 应用程序时,总要定义窗口过程,登记 windows class,创建窗口,等等。mfc 把许多类似的处理封装起来,替程序员完成这些 工作。另外,mfc 提出了以文档-视图为中心的编程模式,mfc 类库封装了对它 的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处 理、查看数据。 3) 对 com/ole 特性的封装 ole 建立在 com 模型之上,由于支持 ole

43、 的应用程序必须实现一系列的接口 (interface) ,因而相当繁琐。mfc 的 ole 类封装了 ole api 大量的复杂工作, 这些类提供了实现 ole 的更高级接口。 4) 对 odbc 功能的封装 以少量的能提供与 odbc 之间更高级接口的 c+类,封装了 odbc api 的大 量的复杂的工作,提供了一种数据库编程模式。 (2) mfc 类的继承 首先,mfc 抽象出众多类的共同特性,设计出一些基类作为实现其他类的 基础。这些类中,最重要的类是 cobject 和 ccmdtarget。cobject 是 mfc 的根 类,绝大多数 mfc 类是其派生的,包括 ccmdtar

44、get。cobject 实现了一些重要 的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。 所有从 cobject 派生的类都将具备或者可以具备 cobject 所拥有的特性。 ccmdtarget 通过封装一些属性和方法,提供了消息处理的架构。 mfc 中,任何 可以处理消息的类都从 ccmdtarget 派生。 针对每种不同的对象,mfc 都设计了一组类对这些对象进行封装,每一组 类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗 口对象,基类是 cwnd;应用程序对象,基类是 cwinthread;文档对象,基类是 cdocument,等等。 程序员

45、将结合自己的实际,从适当的 mfc 类中派生出自己的类,实现特定 的功能,达到自己的编程目的。 (3) 虚拟函数和动态约束 mfc 以“c+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程 框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导 19 致虚拟函数表过于臃肿,消耗内存,效率低下。例如,cwnd 封装 windows 窗口 对象时,每一条 windows 消息对应一个成员函数,这些成员函数为派生类所继 承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是, mfc 建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函 数的动态约束问题

46、。 这样,通过虚拟函数和消息映射,mfc 类提供了丰富的编程接口。程序员 继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入 mfc 的编程框架。 mfc 编程框架将在适当的时候、适当的地方来调用程序的代码。本书将充分的 展示 mfc 调用虚拟函数和消息处理函数的内幕,让读者对 mfc 的编程接口有清 晰的理解。 (4) mfc 的宏观框架体系 如前所述,mfc 实现了对应用程序概念的封装,把类、类的继承、动态约 束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套 开发模板(或者说模式) 。针对不同的应用和目的,程序员采用不同的模板。例 如,sdi 应用程序的模板,mdi

47、 应用程序的模板,规则 dll 应用程序的模板,扩 展 dll 应用程序的模板,ole/activex 应用程序的模板,等等。 这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的 类。典型的 mdi 应用程序的构成将在下一节具体讨论。 为了支持对应用程序概念的封装,mfc 内部必须作大量的工作。例如,为 了实现消息映射机制,mfc 编程框架必须要保证首先得到消息,然后按既定的 方法进行处理。又如,为了实现对 dll 编程的支持和多线程编程的支持,mfc 内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。 虽然,这些内部处理对程序员来说是透明的,但是,懂得和理

48、解 mfc 内部机制 有助于写出功能灵活而强大的程序。 总之,mfc 封装了 win32 api,ole api,odbc api 等底层函数的功能,并 提供更高一层的接口,简化了 windows 编程。同时,mfc 支持对底层 api 的直 接调用。 mfc 提供了一个 windows 应用程序开发模式,对程序的控制主要是由 mfc 框架完成的,而且 mfc 也完成了大部分的功能,预定义或实现了许多事件和消 20 息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用 程序员的代码来处理应用程序特定的事件。 mfc 是 c+类库,程序员就是通过使用、继承和扩展适当的类来实现特定

49、的 目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴 趣的由基类处理。实现这种功能的基础是 c+对继承的支持,对虚拟函数的支 持,以及 mfc 实现的消息映射机制。 3 基于 winpcap 的单文档网络嗅探器的设计与分析 3.1 系统设计实现的基本原理与过程 3.1.1 基于 winpcap 捕获数据的机理 运用以太网数据捕获的原理使得信息捕获系统能够拦截到我们所要的信息, 这是捕获数据包的物理基础。 在网络数据包的捕获过程中,首先,数据包捕获系统必须绕过操作系统的 协议栈来访问在网络上传输的原始数据包,这就要求一部分程序要运行在操作 系统核心内部,直接与网络接口驱动交互

50、。这个部分是系统依赖的,在winpcap 的解决方案里它是由内核级的数据包监听设备驱动程序npf 实现的。winpcap 开发小组针对不同版本的windows 操作系统提供了不同的驱动。这些驱动不仅 提供了基本的特性,例如抓包和injection;还有更高级的特性,例如可编程的 过滤器系统和监视引擎等。 其次,数据包捕获系统必须有用户级的程序接口,通过这些接口,用户程 序可以利用内核驱动提供的高级特性。在winpcap 的解决方案中是由两个不同 的库:packet.dll 和wpcap.dll 库来实现的。winpcap 的优势在于提供了一套 标准的抓包接口与libpcap 兼容,可使得原来许

51、多unix 平台下的网络分析工具 快速移植过来便于开发各种网络分析工具,充分考虑了各种性能和效率的优化, 包括对于npf 内核层次上的过滤器支持, 支持内核态的统计模式, 提供了发 送数据包的能力。前者提供了一个底层api, 伴随着一个独立于windows 操作 系统的编程接口,这些api 可以直接用来访问驱动的函数;后者导出了一组更 21 强大的与libpcap 一致的高层抓包函数库(capture primitives)。这些函数 使得winpcap 在数据包的捕获过程中可以以一种与网络硬件和操作系统无关的 方式进行。 3.1.2 基于 winpcap 数据包捕获的过程 在利用winpca

52、p 捕获分析网络数据时, 主要是调用packet.dll 和 wpcap.dll 中提供的api 函数进行操作。以下是基于winpcap 的网络数据包捕 获流程及相应的winpcap 库函数。 (1) 获取网络适配器信息 利用winpcap 捕获数据包的第一步是要获得本地的网络适配器(网卡)列 表。winpcap 提供pcap_findalldevs()和pcap_findalldev_ex()这两个函数来 实现些功能,这两个api 函数都返回一个pcap_if 结构列表,列表的每项内容 都含有全面的网卡信息, 尤其是字段名字和含有名字的描述以及有关驱动器的 易读信息。 (2) 设置并编译过滤

53、器 winpcap 使用的过滤规则兼容tcpdump 的过滤规则, 它提供一种高效的方 法来捕获网络数据包的某些数据, 且常和系统的捕获机制相集成。函数 pcap_compile()和pcap_setfilter()用来实现过滤数据的功能。pcap_compile()来 编译一个过滤设备,它通过一个高层的boolean 型变量和字串产生一系列的能 够被底层驱动所解释的二进制编码。boolean 表示语法能够在这个文件的过滤 表示语法中找到。pcap_setfilter()用来联系一个在内核驱动上过滤的过滤器, 这时所有网络数据包都将流经过滤器,并拷贝到应用程序中。 (3) 打开网络设备 使用函

54、数pcap_open()或者pcap_open_line()。函数有三个参数 snaplen、promisc、to_ms。snaplen 用于指定要捕获数据包的长度,最大为 65535,如果设定一个值,则捕获到大于这个设定值的数据时,后面的数据会被 截断掉。promisc 表示是否把网卡设置为混杂模式,如果是1 表示设为混杂模 式,在通常情况下网卡只接受发往它的数据包而忽略发往其他主机的数据包。 但网卡处于混杂模式时它将接收所有的流经它的数据包,这就意味着在共享介 22 质的情况下我们可以捕获到其它主机的数据包;大部分的数据包捕获程序都将 混杂模式设为默认。to_ms 参数指定读数据的超时控制

55、,超时以毫秒计算,当 在超时时间内网卡上没有数据到来时对网卡的读操作将返回。 (4) 捕获数据包 一旦网卡被打开,就可以调用pcap_next(),pacp_next_ex()或pcap_loop()进 行数据包的捕获。pcap_next()和pacp_next_ex()表示捕获一个可用数据包就返 回;而pcap_loop()表示捕获多个数据包,可以循环捕获数据包,直到出现错误 为止。这三个函数都有返回一个指向pcap_pkthdr 结构的指针,pcap_next()与 pcap_next_ex()的功能相似,不过后者只在win32 环境下运行。 (5) 读取离线数据包 pcap_dump_o

56、pen()被用来打开一个savefile以供写入数据包。 pcap_open_offlin()被用来打开savefile,并用pcap_next()来逐条读取数 据包。 3.2 系统功能设计 本系统的基本功能为实现网络数据包的捕获,并将其数据内容解析显示; 网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调用 winpcap 提供的丰富的 api 函数来实现;数据解析及显示部分主要负责界面数 据转化、解析、处理、格式化、协议分析等,这一部分主要通过 mfc 来设计一 个单文档图形用户界面 gui,解析结果将通过 mfc 的类库显示到 gui 中。 3.3 系统架构设计 网络嗅探器的

57、整体设计由三个模块组成,自底向上分别是嗅探器设置模块, 数据包捕获模块,解析和显示模块; (1) 嗅探器设置模块主要调用 winpcap 提供的 api,分为获取网络设备信息,设 置并编译过滤器,打开网络设备 三个步骤; (2) 数据包捕获模块创建了新的线程,利用了 winpcap 的非回调函数 pcap_next_ex()函数从 winpcap 底层驱动的数据缓冲区中读取数据包。并 将数据包存储在系统临时文件中,以便之后的分析。用 23 pcap_open_offline()函数从离线文件中读取包。读取到的任意一个符合捕 获条件数据包,将其内容解析,并显示本数据包; (3) 捕获完成后,进入

58、解析和显示模块。 网络嗅探器总体结构如图 3.1 图 3.1 网络嗅探器总体结构 3.4 子系统与模块设计 3.4.1 网络嗅探器设置模块 该部分分为三个子过程: 1)获取已连接的网络设备列表,winpcap 提供了 pcap_findalldevs_ex() 函数,这个函数返回一个 pcap_if 结构的链表, 每个这样的结构都包含了一 个适配器的详细信息。 2)打开网络设备,winpcap 提供了 pcap_open()函数,该函数第一参数制 定要捕获数据包的哪些部分,第二参数用来制定适配器是否为混杂模式,第三 参数为读取数据的超时时间,当适配器被打开后,就可以进行捕获工作了; 3)设置过

59、滤器,winpcap 中用来过滤数据包的函数是 pcap_compile() 和 嗅探器设置模 块 网络数据包捕获 解析和显示模块 网络适配器 以太网 24 pcap_setfilter() 。pcap_compile() 它将一个高层的布尔过滤表达式编译成 一个能够被过滤引擎所解释的低层的字节码。pcap_setfilter() 将一个过滤器 与内核捕获会话相关联。当 pcap_setfilter() 被调用时,这个过滤器将被应 用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过 滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序。 3.4.2 网络数据包的捕获模块

60、 该部分创建了一个用于捕获数据包的线程,在该线程中调用 winpcap 提供 的 pcap_next_ex()函数从底层驱动数据缓冲区中读取数据包,该函数接受已打 开的网络设备句柄,返回捕获数据包的实体。并用 pcap_dump()函数将每一个 数据包写入临时文件中。 3.4.3 解析和显示模块 该部分在接收到用户发出的捕获完成消息后,将数据包从离线文件中逐条 取出并进行解析和显示。将解析完毕数据包中的各项内容填入已经预先声明的 协议的数据结构中,包括(序号,捕获时间,以太帧长度,传输层协议,源 ip 地址,目的 ip 地址,源 mac 地址,目的 mac 地址) ,然后将数据结构添加到列 表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论