Wireshark:添加一个基础的解析器_第1页
Wireshark:添加一个基础的解析器_第2页
Wireshark:添加一个基础的解析器_第3页
Wireshark:添加一个基础的解析器_第4页
Wireshark:添加一个基础的解析器_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

翻译翻译 Wireshark Wireshark 添加一个基础的解析器 添加一个基础的解析器 Tag 编程 翻译 Wireshark snmp org 版权声明 转载时请以超链接形式标明文章原始出处和作者信息及本声明 9 2 9 2 添加一个基础的解析器添加一个基础的解析器 下面我们将循序渐进地设计一个基础的解析器 首先我们来虚构一个简单的网络协议 foo 它依次包含如下构成要素 包类型字段 占用 8 比特位 可能的值为 1 初始 2 终结 3 数据 标志集字段 占用 8 比特位 0 x01 开始包 0 x02 结束包 0 x04 优先包 序列号字段 占用 16 比特位 IP 地址字段 占用 32 比特位 9 2 1 9 2 1 创建解析器创建解析器 首先您需要选择解析器的类型 内置型 包含在主程序中 或插件型 对于初学者来说插件是容易编写的 所以我们还是先做一个插件型解析器吧 温馨提示 解析 器由插件型转为内置型是件轻松的事情 所以我们不会因此而失去什么 例例 9 1 9 1 解析器初始设定解析器初始设定 ifdef HAVE CONFIG H include config h endif include include forward reference void proto register foo void proto reg handoff foo static void dissect foo tvbuff t tvb packet info pinfo proto tree tree static int proto foo 1 static int global foo port 1234 static dissector handle t foo handle void proto register foo void if proto foo 1 proto foo proto register protocol FOO Protocol name FOO short name foo abbrev 现在来逐一分析这段代码 首先我们有一些常规的包含文件 最好依惯例在文件开始包含进来 随后是一些函数的前置声明 我们稍后定义它们 接下来我们定义了一个整型变量 proto foo 用于记录我们的协议注册信息 它被初始化为 1 当解析器注册到主程序中后 其值便会得到更新 这样做可保证我们方便地判断是否 已经做了初始工作 将所有不打算对外输出的全局变量和函数声明为 static 是一个良好的 习惯 因为这可以保证命名空间不被污染 通常这是容易做到的 除非您的解析器非常庞大以 致跨越多个文件 之后的模块变量 global foo port 则包含了协议使用的 UDP 端口号 我们会对通过该端口的 数据流进行解析 当然这只是一个假设 紧随其后的是解析器句柄 foo handle 我们稍后对它进行初始化 至此我们已经拥有了和主程序交互的基本元素 接下来最好再把那些预声明的函数定义一下 就从注册函数 proto register foo 开始吧 首先调用函数 proto register protocol 注册协议 我们能够给协议起 3 个名字以适用不同 的地方 全名和短名用在诸如 首选项 Preferences 和 已激活协议 Enabled protocols 对话框以及记录中已生成的域名列表内 缩略名则用于过滤器 下面我们需要一个切换函数 例例 9 2 9 2 解析器切换解析器切换 void proto reg handoff foo void static gboolean initialized FALSE if initialized foo handle create dissector handle dissect foo proto foo dissector add udp port global foo port foo handle initialized TRUE 这段代码做了什么呢 如果解析器尚未初始化 则对它进行初始化 首先创建解析器 这时注 册了了函数 dissect foo 用于完成实际的解析工作 之后将该解析器与 UDP 端口号相关联 以使主程序收到该端口的 UDP 数据流时通知该解析器 至此我们终于可以写一些解析代码了 不过目前我们仅写点儿基本功能占个位置 例例 9 3 9 3 解析解析 static void dissect foo tvbuff t tvb packet info pinfo proto tree tree if check col pinfo cinfo COL PROTOCOL col set str pinfo cinfo COL PROTOCOL FOO Clear out stuff in the info column if check col pinfo cinfo COL INFO col clear pinfo cinfo COL INFO 该函数用于解析传递给它的数据包 包数据由 tvb 参数指向的特殊缓冲区保管 现在我们已 深入到协议的细节 对它们您肯定是了若指掌 包信息结构参数 pinfo 包含了协议的基本数 据 以供我们更新 参数 tree 则指明了详细解析发生的地方 这里我们仅做了保证通过的少量工作 前两行检查 UI 中 协议 Protocol 列是否已显示 如果该列已存在 就在这儿显示我们的协议名称 这样人们就知道它被识别出来了 另外 如 果 信息 INFO 列已显示 我们就将它的内容清除 至此我们已经准备好一个可以编译和安装的基本解析器 不过它目前只能识别和标示协议 为了编译解析器并创建插件 还需要在解析器代码文件 packet foo c 所在目录下创建一些 提供支持的文件 Makefile am UNIX Linux 的 makefile 模板 Mmon 包含了插件文件的名称 Makefile nmake 包含了针对 Windows 平台的 Wireshark 插件 makefile moduleinfo h 包含了插件版本信息 moduleinfo nmake 包含了针对 Windows 平台的 DLL 版本信息 packet foo c 这是您的解析器原代码文件 plugin rc in 包含了针对 Windows 平台的 DLL 资源模板 在 agentx 插件的目录下 plugins agentx 目录下 您能够找到关于这些文件的一个好 的例子 Mmon 和 Makefile am 文件中涉及到相关文件和解析器名称的地方 一定要修改正确 moduldeinfo h 和 moduleinfo nmake 文件中的版本信息也需要正确填 充 一切准备妥善后就可以将解析器编译为 DLL 或共享库文件了 使用 nmake 工具 将编译 的结果拷贝到 Wireshark 安装目录中的 plugin 文件夹下 它就可以正常工作了 9 2 2 9 2 2 解析协议细节解析协议细节 现在我们已经有了一个可以运用的简单解析器 让我们再为它添点儿什么吧 首先想到的应该就是标示数据包的有 效信息了 解析器在这方面给我们提供了支持 首先要做的事情是创建一个子树以容纳我们的解析结果 这会使协议的细节显示得井井有条 现在解析器在两种情 况下被调用 其一 用于获得数据包的概要信息 其二 用于获得数据包的详细信息 这两种情况可以通过 树指针参数 tree 来进行区分 如果树指针为 NULL 我们只需要提供概要信息 反之 我们就需要拆解协 议完成细节的显示了 基于此 让我们来增强这个解析器吧 例例 9 4 9 4 插入数据包解析插入数据包解析 static void dissect foo tvbuff t tvb packet info pinfo proto tree tree if check col pinfo cinfo COL PROTOCOL col set str pinfo cinfo COL PROTOCOL FOO Clear out stuff in the info column if check col pinfo cinfo COL INFO col clear pinfo cinfo COL INFO if tree we are being asked for details proto item ti NULL ti proto tree add item tree proto foo tvb 0 1 FALSE 这里我们为解析添加一个子树 它将用于保管协议的细节 仅在必要时显示这些内容 我们还要标识被协议占据的数据区域 在我们的这种情况下 协议占据了传入数据的全部 因为我们假设协议没有 封装其它内容 因此 我们用 proto tree add item 函数添加新的树结点 将它添加到传入的协议树 tree 中 用协议句柄 proto foo 标识它 用传入的缓冲区 tvb 作为数据 并将有效数据范围的起 点设为 0 长度设为 1 表示缓冲区内的全部数据 至于最后的参数 FALSE 我们暂且忽略 做了这个更改之后 在包明细面板区中应该会出现一个针对该协议的标签 选择该标签后 在包字节面板区中包的 剩余内容就会高亮显示 现在进入下一步 添加一些协议解析功能 在这一步我们需要构建一组帮助解析的表结构 这需要对 proto register foo 函数做些修改 首先定义一组静态数组 例例 9 5 9 5 定义数据结构定义数据结构 static hf register info hf Setup protocol subtree array static gint ett 接下来 在协议注册代码之后 我们对这些数组进行注册 例例 9 6 9 6 注册数据结构注册数据结构 proto register field array proto foo hf array length hf proto register subtree array ett array length ett 变量 hf foo pdu type 和 ett foo 依然需要在文件顶部的某处予以声明 函数 proto item add subtree 的调用在协议树中添加了一个子树 我们就在这里进行细节解析 子树 的展开受控于变量 ett foo 当您在协议间切换时 由它记录子树是否展开 正像您从下面的函数调 用中看到的那样 随后的所有解析都会添加到该子树中 函数 proto tree add item 用于为子树 foo tree 添加项 这次调用使用变量 hf foo pdu type 控制项格式 PDU 协议数据单元 类型是 一个单字节数据 位于数据包的首字节 我们将有效数据范围的起点设为 0 长度设为 1 我们假 设它依照网络字节顺序 所以将最后一个参数设为 FALSE TRUE 表示 little endian FALSE 表示 big endian 尽管对于单字节数据无所谓字节顺序 但我们最好还是保持指定字节 顺序的良好习惯 如果详细查看静态数组中 hf foo pdu type 的声明 我们能够获悉定义的明细 hf foo pdu type 节点索引 FOO PDU Type 项标示 foo type 过滤字符串 我们可以在过滤框中输入诸如 foo type 1 的结构 FT UNIT8 指定该项数据是一个 8 比特位的无符号整型 这和我们之前调用函数时设 置的一字节有效数据是相一致的 BASE DEC 针对整型数据 指定将其作为十进制数显示 当然视具体情况也可以设置 为 BASE HEX 十六进制 和 BASE OCT 八进制 以使数据更易辨识 至于结构中余下的部分我们暂且忽略 如果您现在安装并试用这个插件 就会发现一些有用的东西了 接下来让我们完成这个简单协议的解析工作吧 我们需要再添加一些 hf 数组成员和程序调用 例例 9 9 9 9 完成数据包解析完成数据包解析 添加到文件开始的某个地方 作为全局变量 static int hf foo flags 1 static int hf foo sequenceno 1 static int hf foo initialip 1 添加到 proto register foo 函数中的 hf 数组中 作为数组的 成员 ti proto tree add item tree proto foo tvb 0 1 FALSE foo tree proto item add subtree ti ett foo proto tree add item foo tree hf foo pdu type tvb offset 1 FALS E offset 1 proto tree add item foo tree hf foo flags tvb offset 1 FALSE offset 1 proto tree add item foo tree hf foo sequenceno tvb offset 2 FA LSE offset 2 proto tree add item foo tree hf foo initialip tvb offset 4 FAL SE offset 4 这段代码解析了这个简单的虚构协议的全部内容 我们引入了一个新的变量 offset 以记录数 据包解析的位置 将这些额外的代码块放入合适的位置 整个协议就可以得到全面的解析 9 2 3 9 2 3 改善解析信息改善解析信息 我们可以添加一些数据来改善协议的显示 第一步是添加一些文本标签 我们先来标示数据包类型 对于这类情况 添加一些额外的数据是有好 处的 首先我们添加一个简单的类型名表 例例 9 10 9 10 命名数据包类型命名数据包类型 static const value string packettypenames 1 Initialise 2 Terminate 3 Data 0 NULL 该数据结构可以方便地查询到值所对应的名称 有对其直接操作的函数 不过我们不需调用它们 因为这已经由相关的支持代码实现了 我们仅 需使用 VALS 宏在数据的适当部分指定细节即可 例例 9 11 9 11 为协议添加名称为协议添加名称 static int hf foo endflag 1 static int hf foo prior

温馨提示

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

评论

0/150

提交评论