网络抓包与协议分析软件的设计与开发 网络0601 陈金锋_第1页
网络抓包与协议分析软件的设计与开发 网络0601 陈金锋_第2页
网络抓包与协议分析软件的设计与开发 网络0601 陈金锋_第3页
网络抓包与协议分析软件的设计与开发 网络0601 陈金锋_第4页
网络抓包与协议分析软件的设计与开发 网络0601 陈金锋_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计 论文 题 目 网络抓包与协议分析软件 的设计与开发 学 生 陈金锋 指导老师 邹复民 讲师 系 别 计算机与信息科学系 专 业 网络工程 班 级 网络 0601 班 学 号 0306109111 2010 年 6 月 福建工程学院本科毕业设计 论文 作者承诺保证书 本人郑重承诺 本篇毕业设计 论文 的内容真实 可靠 如果存在弄 虚作假 抄袭的情况 本人愿承担全部责任 学生签名 年 月 日 福建工程学院本科毕业设计 论文 指导教师承诺保证书 本人郑重承诺 我已按有关规定对本篇毕业设计 论文 的选题与内容 进行了指导和审核 该同学的毕业设计 论文 中未发现弄虚作假 抄袭 的现象 本人愿承担指导教师的相关责任 指导教师签名 年 月 日 0 目 录 1 绪论 1 1 1 课题来源 1 1 2 当今网络数据安全现状 1 1 3 网络数据安全的技术研究 2 2 主要技术介绍 3 2 1 数据包的介绍 3 2 2 网络数据包捕获原理 4 2 3 网络数据包的捕获方法 5 2 3 1 原始套接字 5 2 3 2 LibPcap 5 2 3 3 WinPcap 5 2 3 4 JPcap 6 2 4 WinPcap 研究 6 2 5 WinPcap 内部结构 7 2 6 WinPcap 的主要函数库 8 3 系统设计 10 3 1 捕获数据的分析与还原 10 3 1 1 802 3 标准的数据帧分析与还原 10 3 1 2 IP 报文的分析与还原 10 3 1 3 UDP 数据包的封装 12 3 1 4 TCP 数据包的封装 14 3 1 5 ICMP 数据包的封装 15 4 实现与分析 16 4 1 WinPcap 环境配置 16 4 1 1 WinPcap 下载 16 4 1 2 WinPcap 配置 16 4 2 程序的实现 16 4 2 1 网络数据捕获的基本流程 16 1 4 2 2 获取网卡信息 17 4 2 3 捕获数据包 18 4 2 4 分析数据包 20 4 3 程序编译中出现的问题 23 4 4 问题的解决 23 4 5 程序功能 23 4 5 1 程序主界面 23 4 5 2 工具栏 24 4 6 程序运行结果 26 5 总结和展望 28 5 1 本文主要工作 28 5 2 展望 28 致谢语 29 参考文献 30 2 网络抓包与协议分析软件的设计与开发 摘要 网络数据包捕获是进行网络分析的基础 通过对 Windows 操作系统平台下网络数据包捕获模 型的论述 重点对基于 NDIS 的优秀包捕获开发包 WinPcap 的结构和功能的进行了详细的介绍和分析 实现了如何在 VC 6 0 环境下借助 WinPcap 提供的各个接口函数对网卡进行编程进而对网络数据 包进行捕获和分析的方法 突出叙述了数据包捕获在网络分析中的应用 关关键键字字 数据包捕获 数据包 WinPcap 3 Design and development a packet capture and protocol analysis software Abstract Network packet capture is the precondition for network analysis through the analysis of the models of network data packet capture in Windows the structure and function of WinPcap based on NDIS is analyzed and introduced in detail and how to program on the network adapter and how to capture and analyze the network data packets through WinPcap are realized under the environment of VC 6 0 the applications of network data capture for network analysis is narrated in detail Key words packet capture data packet WinPcap 0 1 绪论 1 1 课题来源 随着网络技术的飞速发展和网络时代的到来 互联网的影响已经渗透到国民经济的 各个领域和人民生活的各个方面 全社会对网络的依赖程度越来越大 整个世界通过网 络正在迅速地融为一体 但由于计算机网络具有联结形式多样性 终端分布不均匀性和 网络的开放性 互联性等特征 致使网络易受黑客 恶意软件和其他不轨的攻击 广义 来说 凡是涉及到网络上信息的保密性 完整性 可用性 真实性和可控性的相关技术 和理论都是网络安全所要研究的领域 网络安全涉及的内容既有技术方面的问题 也有 管理方面的问题 两方面相互补充 缺一不可 技术方面主要侧重于防范外部非法用户 的攻击 管理方面则侧重于内部人为因素的管理 如何更有效地保护重要的信息数据 提高计算机网络系统的安全性已经成为所有计算机网络应用必须考虑和必须解决的一个 重要问题 可以这样来定义网络数据安全 所谓网络数据安全 指的是网络系统的硬件 软件 和数据信息能够受到保护 不会因为偶然或恶意的原因而遭到破坏 更改 泄露 同时 系统能够连续 可靠地运行 网络服务不被中断 但在现实中 绝对安全的网络是没有 的 1 据 IT 界企业团体 ITAA 的调查显示 美国 90 的 IT 企业对黑客攻击准备不足 目前美国 75 一 85 的网站都抵挡不住黑客的攻击 约有 75 的企业网上信息失 窃 其中 25 的企业损失在 25 万美元以上 因此了解网络面临的各种威胁 防范和消 除这些威胁 实现真正的网络安全已经成了网络发展中最重要的事情 1 2 当今网络数据安全现状 计算机网络的核心是网络协议 所以研究协议与网络安全的关系就是至关重要的 现在网络中所使用的协议都是较早前设计的 许多协议的实现都是基于一种非常友好的 通信的双方充分信任的基础 在通常的网络环境之下 用户的信息包括口令都是以明文 的方式在网上传输的 只要将网络接口设置成监听模式 便可以源源不断地将网上传输 的信息截获 因此进行网络监听从而获得用户信息并不是一件困难的事情 例如目前使 1 用最广泛的 TCP IP 协议就存在很多安全缺陷 而 FTP POP 和 Telnet 协议在本质上也 是不安全的 从而很多网络的攻击就是针对这些不安全协议进行的 1994 年一个最大的 嗅探器 Sniffer 网络数据监听器 攻击被发现 这次攻击被人们普遍认为是记载中最 为严重的一次 攻击者处于 Rahul Net 使许多以 FTP Telnet 或远程登陆的主机系统 都受到了危害 在这件事故中 嗅探器只运行了 18 个小时 在这段时间里 有几百台 主机被泄密 受攻击者包括 268 个站点 如麻省理工学院 美国海军和空军 SUN 微系 统公司 IBM NASA CERFNET 和加拿大 以色列 荷兰 比利时的一些大学的机器 协议的安全验证方式也是有弱点的 就是很容易受到 中间服务器 方式的攻击 所谓 中间服务器 攻击方式 就是 中间服务器 冒充真正的服务器接收用户传给服 务器的数据 然后再冒充用户把数据传给真正的服务器 服务器和用户之间的数据传送 被 中间服务器 转发并做了手脚之后 就会出现很严重的问题 例如 冒充域名服务 器的攻击 也就是 DNS 欺骗 它是攻击者冒充域名服务器的一种欺骗行为 它主要用于 向主机提供错误 DNS 信息 当用户尝试浏览网页 例如 IP 地址为 XXX XX XX XX 网址 为 WWW XXX COM 而实际上登录的确实 IP 地址 YYY YY YY YY 上的 WWW XXX COM 用户 上网就只能看到攻击者的主页 而不是用户想要取得的网站的主页了 这个网址是攻击 者用以窃取网上银行登录证书以及帐号信息的假冒网址 据统计 目前网络攻击手段有 数千种之多 美国商业杂志 信息周刊 公布的一项调查报告称 黑客攻击和病毒等安 全问题在 2000 年就造成了上万亿美元的经济损失 在全球范围内每数秒钟就发生一起 针对网络的不同形式的攻击事件 1 3 网络数据安全的技术研究 为了保证网络的安全 防止网络攻击 除了对信息采用加密技术之外 还有就是与 网络协议相关的网络安全手段 例如防火墙技术 入侵监测技术 安全扫描技术 协议 分析技术和数据包生成技术等 这些技术中 数据包的捕获和分析是最首要的手段 它 是诸多网络安全技术实现的基础 2 2 主要技术介绍 2 1 数据包的介绍 包 Packet 是 TCP IP 协议通信传输中的数据单元 一般也称 数据包 有人说 局域网中传输的不是 帧 Frame 吗 没错 但是 TCP IP 协议是工作在 OSI 模型第三层 网络层 第四层 传输层 上的 而帧是工作在第二层 数据链路 层 上一层内容由下一层的内容来传输 所以在局域网中 包 是包含在 帧 里 的 用一个形象一些的例子对数据包的概念加以说明 我们在邮局邮寄产品时 虽然产 品本身带有自己的包装盒 但是在邮寄的时候只用产品原包装盒来包装显然是不行的 必须把内装产品的包装盒放到一个邮局指定的专用纸箱里 这样才能够邮寄 这里 产 品包装盒相当于数据包 里面放着的产品相当于可用的数据 而专用纸箱就相当于帧 且一个帧中只有一个数据包 包 听起来非常抽象 那么是不是不可见的呢 通过一定 技术手段 是可以感知到数据包的存在的 比如在能上网的情况下 把鼠标移动到任务 栏右下角的网卡图标上单击就会弹出一个窗口 如图 2 1 就可以看到 发送 包 收到 包 的提示 图 2 1 网络连接状态 我们上网打开网页 这个简单的动作 就是我们先发送数据包给网站 网站接收到 3 了之后 根据发送的数据包的 IP 地址 返回网页的数据包 也就是说 网页的浏览 实际上就是数据包的交换 如果能把数据包捕获 通过分析这些数据 我们就可以知道 网络中这些数据包传输的信息 那么如何捕获这些数据包呢 2 2 网络数据包捕获原理 由于目前用的最多的网络形式是以太网 2 在以太网上 数据是以被称为帧的数据 结构为单位进行交换的 而帧 数据包 是用被称为带碰撞检测的载波侦听多址访问即 CSMA CD carrier sense multiple access wim collision dctection 的方式发送的 在这种方 法中 发送到指定地址的帧实际上是发送到所有计算机的 只是如果网卡检测到经过的 数据不是发往自身的 简单忽略过去而已 正是这种基于 CSMS CD 的广播机制 这就 给连接在网络上的计算机捕获来自于其他主机的数据带来了可能 即通过对网络接口的 设置可以使网卡能够接收到所有经过该机器的数据 然后将这些数据做相应处理并实时 分析这些数据的内容 进而分析网络当前状态和整体布局 这里 通过设置硬路由器的 监听端口来捕获数据包的方式不再本文讨论范围内 从广义的角度上看 一个包捕获机制包含三个主要部分 首先是最底层针对特定操 作系统的包捕获机制 然后是最高层针对用户程序的接口 第三部分是包过滤机制 不 同的操作系统实现的底层包捕获机制可能是不一样的 但从形式上看大同小异 数据包 常规的传输路径依次为网卡 设备驱动层 数据链路层 IP 层 传输层 最后到达应用 程序 而包捕获机制是在数据链路层增加一个旁路处理 对发送和接收到的数据包做过 滤 缓冲等相关处理 最后直接传递到应用程序 值得注意的是 包捕获机制并不影响 操作系统对数据包的网络栈处理 对用户程序而言 包捕获机制提供了一个统一的接口 使用户程序只需要简单的调用若干函数就能获得所期望的数据包 这样一来 针对特定 操作系统的捕获机制对用户透明 使用户程序有比较好的可移植性 包过滤机制是对所 捕获到的数据包根据用户的要求进行筛选 最终只把满足过滤条件的数据包传递给用户 程序 4 2 3 网络数据包的捕获方法 2 3 1 原始套接字 套接字 3 Sock 是网络应用编程接口 应用程序可以使用它进行网络通信而不需 要知道底层发生的细节 有时候需要自己生成一些定制的数据包或者功能并希望绕开套 接字的功能 原始套接字 Raw Socket 就满足了这样的要求 原始套接字能够生成自 己的数据报文 包括报送和数据报本身的内容 通过原始套接字 可以更加自如地控制 Windows 下的多种协议 而且能够对网络底层的传输机制进行控制 原始套接字可以用来发送和接收 IP 层以上的原始数据包 比如 ICMP TCP UDP 而 且能够对网络底层的传输机制进行控制 原始套接字的作用主要有三个方面 1 接收发向本机的 ICMP IGMP 协议包 或者发送这些协议包 2 接收发向本机的 IP 包 3 发送自定义的 IP 包 2 3 2 LibPcap LibPcap 4 是一个广泛应用的系统抓包库 LibPcap 是一种与系统无关 采用分组捕 获机制的分组捕获函数库 用于访问数据链路层 它在不同的平台上采用统一的编程接口 使 用 LibPcap 编写的程序可以自由地跨平台使用 同时 LibPcap 是一个独立于系统接口的 用户级的抓包库 它为底层网络监听提供了可移植框架 它的应用包括网络统计集合 安 全监听 网络调试等 2 3 3 WinPcap WinPcap 5 是 LibPcap 的 Windows 版本 它是一个基于 Win32 的捕获数据包和网络 分析的体系结构 它包括一个内核级的包过滤器 一个底层的动态链接库 Packet dll 一个高层并且与系统无关的库 WPcap dll 基于 LibPcap0 6 2 版本 WinPcap 是集成 于 Windows95 98 ME NT 2000 和 XP 操作系统的设备驱动程序 它可以从网卡捕获或者 发送原始数据 同时能够过滤并且仓储数据包 开发 WinPcap 这个项目的目的在于为 Win32 应用程序提供访问网络底层的能力 它提供以下四项功能 5 1 捕获原始数据报 包括共享网络上各主机发送 接收的以及相互之间交换的数据 报 2 在数据报发往应用程序之前 按照自定义的规则将某些特殊的数据报过滤掉 3 在网络上发送原始的数据报 4 收集网络通信过程中的统计信息 2 3 4 JPcap JPcap 6 是一个能够捕获 发送网络数据包的 Java 类库包 这个包用到了 LibPcap 和原始套接字 API 目前 JPcap 在 FreeBSD 3 x Linux RedHat 6 1 Solaris 和 Microsoft Windows 2000 XP 系统上已经做过测试 并且支持 Ethernet IPv4 IPv6 ARP RARP TCP UDP ICMPv4 协议 JPcap 是一个 Java 类 集合 它为网络数据包的捕获提供接口和系统支持 最初版本是 2000 年 6 月发布的 JPcap0 01 版 此后几经修改 到现在最新的 JPcap0 7 版 2 4 WinPcap 研究 WinPcap 是 windows 平台下一个免费 公共的网络访问系统 是为 Linux 下的 Libpcap 移植到 Windows 平台下实现数据包捕获而设计的函数库 在设计 WinPcap 时参 照了 Libpcap 使用方法也与 Libpcap 相似 基于 Libpcap 的程序可以很容易的移植到 Windows 平台下 这个数据包捕获架构是由加州大学和 Lawrence Berkeley 实验室及其 投稿者联合开发的 他们在 1999 年 3 月 31 日推出了 1 0 版 提供了用户级 BPF 过滤 1999 年 8 月 21 日推出了 2 0 版 将 BPF 过滤增加到内核中并增加了内核缓存 2001 年 3 月 15 日推出了 2 1 版 该版对 libpcap 0 5 2 进行了升级 并可支持更多的网络类 型 2001 年 1 月 30 日推出了 2 2 版 2002 年 3 月 28 日推出了 2 3 版 2003 年 1 月 lO 日推出了 3 O 版 增加了 NPF 设备驱动的一些新的特性及优化方案 在 wpcap dll 中增加了一些函数等等功能 WinPcap 的最新版本是 4 1 4 WinPcap 的官方主页是 www wpcap org 可以在其主页上下载这个软件及其源代码 更重要的是 网站上还有 很多开发文档 对于利用 WinPcap 作为工具开发网络安全软件的编程人员有很大帮助 WinPcap 提供了四项功能 1 捕获原始数据报 包括共享网络上各主机发送 接收的以及相互之间交换的数据 6 报 2 在数据报发往应用程序之前 按照自定义的规则将某些特殊的数据报过滤掉 3 在网络上发送原始的数据报 4 收集网络通信过程中的统计信息 WinPcap 的主要功能在于独立于主机协议 如 TCP IP 而发送和接收原始数据包 也就是说 WinPcap 不能阻塞 过滤或控制其他应用程序数据包的发收 它仅仅只是监 听共享网络上传送的数据包 因此 它不能用于 QoS 调度程序或个人防火墙 目前 WinPcap 开发的主要对象是 windows NT 2000 XP 这主要是因为在使用 WinPcap 的用 户中只有一小部分是仅使用 Windows 95 98 Me 并且微软也已经放弃了对 win9x 的开发 有个软件叫 sniffer pro 可以作网管软件用 有很多功能 可监视网络运行情况 每台网 内机器的数据流量 实时反映每台机器所访问 IP 以及它们之间的数据流通情况 可以 抓包 可对过滤器进行设置 以便只抓取想要的包 比如 POP3 包 smtp 包 ftp 包等 并可从中找到邮箱用户名和密码 还有 ftp 用户名和密码 它还可以在使用交换机的网 络上监听 不过要在交换机上装它的一个软件 还有一个简单的监听软件叫 Passwordsniffer 可截获邮箱用户名和密码 还有 ftp 用户名和密码 它只能用在 HUB 网络上 著名软件 tcpdump 及 ids snort 都是基于 libpcap 编写的 此外 Nmap 扫描器也 是基于 libpcap 来捕获目标主机返回的数据包的 WinPcap 提供给用户两个不同级别的编程接口 一个基于 libpcap 的 wpcap dll 另 一个是较底层的 packet dll 对于一般的要与 unix 平台上 libpcap 兼容的开发来说 使用 wpcap dll 是当然的选择 2 5 WinPcap 内部结构 Winpcap 是针对 Win32 平台上的抓包和网络分析的一个架构 它由内核级的网络组 包过滤器 Netgroup Packet Filter NPF 用户级的动态链接库 Packet dll 和 Wpcap dlI 等 3 个模块组成 7 1 网络组包过滤器 它是运行于操作系统内核中的驱动程序 它直接与网卡驱动 程序进行交互 获取在网络上传输的原始数据包 NPF 与操作系统有关 WinPcap 开发 组针对不同的 Windows 操作系统提供了不同版本的 NPF 在 Win95 98 ME 系统中 它 以 VXD 文件形式存在 在 Windows NT 和 Windows 2000 系统中 它以 SYS 文件形式 7 存在 该模块提供了抓取数据包以及发送数据包的基本功能 此外还提供了一些高级功 能 如数据包过滤系统和检测引擎 2 低级动态链接库 Pactet dll 用于在 Win32 平台上为数据包驱动程序提供一个公 共的接口 不同的 Windows 版本在用户态和内核态之间提供互不相同的接口 而 Pactet dll 可以屏蔽这些接口区别 提供一个与系统无关的 API 基于 Pactet dll 开发的数 据包截获程序可以运行于不同的 Win32 平台而不必重新进行编译 Pactet dll 可以执行如 获取适配器名称 动态驱动器加载以及获得主机掩码及以太网冲突次数等低级操作 3 高级动态链接库 Wpcap dll 模块与 Unix 系统下的 BSD 截获架构提供的 Libpcap 库完全兼容 它提供了一组功能强大且跨平台的函数 利用这些函数可以不去 关心适配器和操作系统的类型 Wpcap dll 含有诸如产生过滤器 定义用户级缓冲以及 包注入等高级功能 编程人员既可以使用包含在 Pactet dll 中的低级函数直接进入内核级 调用 也可以使用由 Wpcap dll 提供的高级函数调用 这样功能更强 使用也更为方便 Wpcap dll 的函数调用会自动调用 Pactet dll 中的低级函数 并且可能被转换成若干个 NPF 系统调用 2 6 WinPcap 的主要函数库 Winpcap 函数库主要有如下函数 1 int pcap findalldevs pcap if t char 用来获得网卡的列表 2 void pcap freealldevs pcap if t 与 int pcap findalldevs pcap if t char 配套使用 当不需要网卡列表时 用此函数 释放空间 3 pcap t pcap open live const char int int int char 用来得到一个包抓取得描述符 4 Int pcap loop pcap t int pcap handler u char 捕获数据包 不会响应 pcap open live 中设置的超时时间 5 int pcap dispatch pcap t int pcap handler u char 捕获数据包 可以不被阻塞 6 int pcap next ex pcap t struct pcap pkthdr const u char 8 捕获数据包 7 int pcap compile pcap t struct bpf program const char int bpf u int32 编译一个过滤设备 与 pcap setfilter 配合使用 8 int pcap setfilter pcap t struct bpf program 用来联系一个在内核驱动上过滤的过滤器 这时所有网络数据包都将流经过滤器 并拷贝到应用程序中 9 3 系统设计 3 1 捕获数据的分析与还原 对捕获数据的解析 其主要依据是网络协议中定义的各种包的类型和包的格式 下 面依次对这些数据的格式与协议进行介绍与分析 3 1 1 802 3 标准的数据帧分析与还原 根据 TCP IP 协议 机器接收到一个以太网数据包时 数据从协议栈中由底向上升 同时去掉各层协议加上的报文首部 每层协议都要检查报文首部的协议表示 以确定数 据的上层协议 根据以太网数据链路层的帧格式 网络适配器的驱动程序会自动计算校 验和 并取走帧中的前同步码和校验和字段 因此 WinPcap 接收的数据包仅仅是其中 的帧头和载荷部分 即捕获到的是帧结构中的 目标 MAC 地址 源 MAC 地址 帧类型 帧中数据 这四部分 在这种情况下 要实现对数据帧的还原 只需要 将捕获的数据帧的前 12 个字节分别转换为十六进制数据 就可以清楚地看到 MAC 地址 并通过对比本机的 MAC 地址 还可以初步判断出该数据帧是本机发送的或是接收到的 3 1 2 IP 报文的分析与还原 首先来看下 IP 数据报格式 8 如图 3 1 所示 图 3 1 IP 数据报格式 版本 4 位 标识 IP 版本号 目前有 IPv4 IPv6 我们目前所用的 IP 协议基本都 是 IPv4 版本 10 首部长度 4 位 度指的是首部占 32bit 字的数目 包括任何选项 由图 3 1 可知 首部所占字节数为 4 4 8 16 16 3 13 8 8 16 32 32 0 160bit 正好是 32bit 的 5 倍 所以首部长度最小为 5 如果选项字段有其它数据 则这个值会大于 5 由上面 也可知 IP 首部最小长度为 20 字节 最大长度为 2 的 4 次方 1 32 8 60 字节 服务类型 8 位 其中 优先权 3 位 设置了数据包的重要性 取值越大数据越重要 取值范围为 0 正 常 7 网络控制 TOS 4 位 分别表示最小延时 最大吞吐量 最高可靠性 最小费用 如果 4 位 TOS 子字段均为 0 那么就意味着是一般服务 未使用 1 位 必须置 0 总长度 16 位 总长度指首部和数据之和的长度 以字节为单位 利用首部长度 字段和总长度字段 就可以知道 I P 数据报中数据内容的起始位置和长度 由于该字段 长 16 比特 所以 IP 数据报最长可达 65535 字节 标识 16 位 唯一地标识主机发送的每一份数据报 通常每发送一份报文它的值就 会加 1 IP 软件在存储器中维持一个计数器 每产生一个数据报 计数器就加 1 并将 此值赋给标识字段 但这个 标识 并不是序号 因为 IP 是无连接服务 数据报不存 在按序接收的问题 当数据报由于长度超过网络的 MTU 而必须分片时 这个标识字段的 值就被复制到所有的数据报的标识字段中 相同的标识字段的值使分片后的各数据报片 最后能正确地重装成为原来的数据报 在分片和重组技术中将会用到 标志 3 位 但目前只有 2 位有意义 标志字段中的最低位记为 MF More Fragment MF 1 即表示后面 还有分片 的数据报 MF 0 表示这已是若干数据报片 中的最后一个 标志字段中间的一位记为 DF Don t Fragment 意思是 不能分片 只有当 DF 0 时才允许分片 具体定义如下 1 保留位 1 位 2 DF 字段 1 位 取值 0 允许数据报分段 1 数据报不能分段 3 MF 字段 1 位 取值 0 数据包后面没有包 该包为最后的包 1 数据包 后面有更多的包 片偏移 13 位 片偏移指出 较长的分组在分片后 某片在原分组中的相对位置 也就是说 相对用户数据字段的起点 该片从何处开始 片偏移以 8 个字节为偏移单位 这就是说 每个分片的长度一定是 8 字节 64 位 的整数倍 11 生存时间 8 位 生存时间字段常用的的英文缩写是 TTL Time To Live 表明 是数据报在网络中的寿命 由发出数据报的源点设置这个字段 其目的是防止无法交付 的数据报无限制地在因特网中兜圈子 因而白白消耗网络资源 最初的设计是以秒作为 TTL 的单位 每经过一个路由器时 就把 TTL 减去数据报在路由器消耗掉的一段时间 若数据报在路由器消耗的时间小于 1 秒 就把 TTL 值减 1 当 TTL 值为 0 时 就丢弃这 个数据报 一般可以理解为经过路由器的最大数目 协议 8 位 协议字段指出此数据报携带的数据是使用何种协议 上层协议 以 便使目的主机的 IP 层知道应将数据部分上交给哪个处理过程 协议可包括 TCP UDP TELNET 等 1 ICMP 6 TCP 17 UDP 首部校验和 16 位 首部检验和字段是根据 IP 首部计算的检验和码 它不对首部 后面的数据进行计算 ICMP UDP TCP 在它们各自的首部中均含有同时覆盖首部和数 据检验和码 为了计算一份数据报的 IP 检验和 首先把检验和字段置为 0 然后对首 部中每个 16bit 进行二进制反码求和 整个首部看成是由一串 16 bit 的字组成 结 果存在检验和字段中 当收到一份 IP 数据报后 同样对首部中每个 16 bit 进行二进制 反码的求和 由于接收方在计算过程中包含了发送方存在首部中的检验和 因此 如果 首部在传输过程中没有发生任何差错 那么接收方计算的结果应该为全 1 如果结果不 是全 1 即检验和错误 那么 IP 就丢弃收到的数据报 但是不生成差错报文 由上 层去发现丢失的数据报并进行重传 源 IP 地址 32 位 发送 IP 的主机地址 目的 IP 地址 32 位 数据发往的 IP 主机地址 3 1 3 UDP 数据包的封装 UDP 是一个简单的面向数据报的运输层协议 8 进程的每个输出操作都正好产生一 个 UDP 数据报 并组装成一份待发送的 IP 数据报 UDP 数据报格式有首部和数据两个部分 如图 3 2 12 图 3 2 UDP 数据报格式 首部很简单 共 8 字节 如图 3 3 图 3 3 UDP 首部 包括 源端口 Source Port 2 字节 源端口号 目的端口 Destination Port 2 字节 目的端口号 长度 Length 2 字节 UDP 用户数据报的总长度 以字节为单位 检验和 Checksum 2 字节 用于校验 UDP 数据报的数字段和包含 UDP 数据报首部的 伪首部 尽管 UDP 校验和的基本计算方法与 IP 首部校验和的计算方法类似 16bit 字的二进制反码和 但是它们之间存在不同的地方 UDP 数据报长度可以为奇数字节 但是校验和的算法是把若干个 16bit 字相加 解决方法是必要时在最后增加填充字节 0 这只是为了校验和的计算 也就是说 可能增加的填充字节不被传送 UDP 数据报和 TCP 段都包含一个 12 字节长的伪首部 它是为了计算校验和而设置的 伪首部包含 IP 首部一些字段 其目的是让 UDP 两次检查数据是否已经正确到达目的地 例如 IP 有没有接受地址不是本主机的数据报 以及 IP 有没有把应传给另一高层的 数据报传送给 UDP UDP 数据报中的伪首部格式如图 3 4 所示 13 图 3 4 UDP 数据报的伪首部格式 3 1 4 TCP 数据包的封装 TCP 数据被封装在一个 IP 数据报中 8 如图 3 5 所示 图 3 5 TCP 数据在 IP 数据报中的封装 图 3 6 显示 TCP 首部的数据格式 如果不计任选字段 它通常是 20 个字节 图 3 6 TCP 包首部 14 3 1 5 ICMP 数据包的封装 IP 协议提供的是面向无连接的服务 不存在关于网络连接的建立和维护过程 也不 包括流量控制与差错控制功能 但需要对网络的状态有一些了解 因此在网际层提供了 因特网控制消息协议 Internet control message protocol 简称 ICMP 来检测网络 包括 路由 拥塞 服务质量等问题 在网络中 ICMP 报文将作为 IP 层数据报的数据 封装 在 IP 数据报中进行传输 如图 3 7 所示 但 ICMP 并不是高层协议 而仍被视为网络层 协议 图 3 7 ICMP 数据在 IP 数据报中的封装 ICMP 报文的类型很多 且各自又有各自的代码 因此 ICMP 并没有一个统一的 报文格式 不同的 ICMP 类别分别有不同的报文字段 ICMP 报文只是在前 4 个字节有 统一的格式 共有类型 代码和校验和 3 个字段 如图 3 8 所示 图 3 8 ICMP 报文的格式 其中类型字段表示 ICMP 报文的类型 代码字段是为了进一步区分某种类型的几种不同 情况 校验和字段用来检验整个 ICMP 报文 接着的 4 个字节的内容与 ICMP 的类型有关 再后面是数据字段 其长度取决于 ICMP 的类型 15 4 实现与分析 4 1 WinPcap 环境配置 4 1 1 WinPcap 下载 从http www winpcap org devel htm下载winpcap的开发库 从http www winpcap org install default htm下载winpcap驱动 4 1 2 WinPcap 配置 1 安装 WinPcap 驱动 安装完成后重启电脑 2 解压下载的 WinPcap 开发包 将 Include 文件夹里的文件全部复制到 VC 目录下 的 Include 文件夹中 同理复制开发包中 Lib 文件夹中的文件到 VC 目录下的 Lib 文件夹 中 3 把 WinPcap 的静态链接库 wsock32 lib 添加到 VC 中 步骤如下 进入 VC 中 选取 工程 按钮 选取 设置 点击 LINK 标签 在 对象 库模块 下添 加 wsock32 lib 至此 WinPcap 的环境配置完成 4 2 程序的实现 4 2 1 网络数据捕获的基本流程 一个完整的基于 WinPcap 的网络数据捕获程序应由两部分组成 9 内核部分和用户 分析部分 其中内核部分负责从网络中捕获和过滤数据 这可以通过调用 WinPcap 丰富 的接口函数实现 用户分析部分主要负责界面 数据转化与处理 格式化 协议分析等 实现流程如图 4 1 所示 16 图 4 1 基于 WinPcap 的网络数据捕获基本流程 简单地说来就是打开网卡 抓包 分析包 4 2 2 获取网卡信息 include pcap h void main pcap if t alldevs pcap if t d int i 0 char errbuf PCAP ERRBUF SIZE 未获取网卡 返回网卡列表 alldevs 指向表头 if pcap findalldevs ex PCAP SRC IF STRING NULL exit 1 17 打印列表 for d alldevs d d d next printf d s i d name if d description printf s n d description else printf No description available n if i 0 printf nNo interfaces found Make sure WinPcap is installed n return 不需要网卡列表 释放空间 pcap freealldevs alldevs 4 2 3 捕获数据包 打开设备 if adhandle pcap open d name 设备名 65536 保证能捕获到数据链路层上的每个数据包的全部内容 PCAP OPENFLAG PROMISCUOUS 混杂模式 1000 读取超时时间 NULL 远程机器验证 errbuf 错误缓冲池 NULL 开始捕获 pcap loop adhandle 0 packet handler NULL 18 return 0 void packet handler u char param const struct pcap pkthdr header const u char pkt data struct tm ltime char timestr 16 ip header ih udp header uh tcp header th icmp header ich u int ip len u short totallen myvector push back pkt data 把收到的包放到一个向量 myvector 里面 ltime localtime strftime timestr sizeof timestr H M S ltime ih ip header pkt data 14 从包中解开 IP 头并将其赋给 ih ip len ih ver ihl totallen ntohs ih tlen totallen 18 mycount push back totallen 将整个包的大小值放到一个向量 mycount 里面 PACKET pkt new PACKET strcpy pkt timestr timestr memcpy if int ih proto 17 如果是 UDP 包就从解开 UDP 头并将其赋给 uh uh udp header u char ih ip len memcpy if int ih proto 6 如果是 TCP 包就从解开 TCP 头并将其赋给 th 19 th tcp header u char ih ip len memcpy if int ih proto 1 如果是 ICMP 包就从解开 ICMP 头并将其赋给 ich ich icmp header u char ih ip len memcpy 4 2 4 分析数据包 这里列举 UDP 包的分析实现代码 char ip len 8 IP 头长 8bits char szLen 8 总长 8bits char identifier 16 标识 16bits char offset 12 分段偏移 12bits char live 8 生命周期 8bits char proto 8 协议 8bits char checksum 16 首部检验和 16bits char srcIP 16 源 IP 16bits char desIP 16 目的 IP 16bits char srcport 16 UDP 源端口 16bits char desport 16 UDP 目的端口 16bits char dramlen 16 UDP 长度 16bits char crc 16 UDP 检验和 16bits if pDoc GetCount 1 int mycon pDoc GetCount 读取存放在向量中的包头的信息 解开包的 IP 头 pDC TextOut 0 0 IP 头 20 pDC TextOut 0 height 版本号 pDC TextOut 7 width height 4 pDC TextOut 0 2 height IP 头长 sprintf ip len d mypacket mycon IpHead ver ihl pDC TextOut 7 width 2 height ip len pDC TextOut 0 3 height 服务类型 pDC TextOut 7 width 3 height mypacket mycon IpHead tos pDC TextOut 0 4 height 总长 sprintf szLen d ntohs mypacket mycon IpHead tlen 18 pDC TextOut 7 width 4 height szLen pDC TextOut 0 5 height 标识 sprintf identifier d ntohs mypacket mycon IpHead identification pDC TextOut 7 width 5 height identifier pDC TextOut 0 6 height 分段偏移 sprintf offset d char ntohs mypacket mycon IpHead flags fo pDC TextOut 7 width 6 height offset pDC TextOut 0 7 height 生命期 S sprintf live d int mypacket mycon IpHead ttl pDC TextOut 7 width 7 height live pDC TextOut 0 8 height 协议 sprintf proto d int mypacket mycon IpHead proto pDC TextOut 7 width 8 height proto if int mypacket mycon IpHead proto 17 pDC TextOut 8 width 8 height UDP pDC TextOut 0 9 height 头校验和 sprintf checksum d ntohs mypacket mycon IpHead crc pDC TextOut 7 width 9 height checksum pDC TextOut 0 10 height 源地址 sprintf srcIP d d d d mypacket mycon IpHead saddr byte1 21 mypacket mycon IpHead saddr byte2 mypacket mycon IpHead saddr byte3 mypacket mycon IpHead saddr byte4 pDC TextOut 7 width 10 height srcIP pDC TextOut 0 11 height 目的地址 sprintf desIP d d d d mypacket mycon IpHead daddr byte1 mypacket mycon IpHead daddr byte2 mypacket mycon IpHead daddr byte3 mypacket mycon IpHead daddr byte4 pDC TextOut 7 width 11 height desIP if int mypacket mycon IpHead proto 17 判断 如果 IP 包头的协议字段是 17 表示是 UDP 包 从存放在向量中的包头中读取并接口 UDP 头 pDC TextOut 0 13 height UDP 头 pDC TextOut 0 14 height 源端口 sprintf srcport d ntohs mypacket mycon UdpHead sport pDC TextOut 7 width 14 height srcport pDC TextOut 0 15 height 目的端口 sprintf desport d ntohs mypacket mycon UdpHead dport pDC TextOut 7 width 15 height desport pDC TextOut 0 16 height UDP 长度 sprintf dramlen d ntohs mypacket mycon UdpHead len pDC TextOut 7 width 16 height dramlen pDC TextOut 0 17 height UDP 校验和 sprintf crc d ntohs mypacket mycon UdpHead crc pDC TextOut 7 width 17 height crc 如此就完成 UDP 包的分析并显示在程序界面上了 22 4 3 程序编译中出现的问题 程序编译无法通过 错误提示如图 4 2 图 4 2 WinPcap 编译过程中出现的错误 这个 pcap stdinc h 是 WinPcap 开发包中的库文件 打开这个文件 查找第 79 行代码如 图 4 3 图 4 3 pcap stdinc h 第 79 行代码 并未出现错误提示中所说的缺少分号 而且这个库文件是从官方网站上下载的 别人下 载了使用都没事而只有我无法编译通过 可能问题是出在自身 4 4 问题的解决 上网查找资料后才得知 winpcap 4 1 1 开发包在 vc 6 环境下编译会出现这两个 错误 原因是 vc 6 0 并不完美支持 c 99 标准 在 64 位 cpu 中编译会有问题 将 winpcap 开发包换到 4 1 1 版本及以下错误消失 试着找了 4 0 2 版本的

温馨提示

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

评论

0/150

提交评论