Wireshark网络协议解析原理与新协议添加方法_第1页
Wireshark网络协议解析原理与新协议添加方法_第2页
Wireshark网络协议解析原理与新协议添加方法_第3页
Wireshark网络协议解析原理与新协议添加方法_第4页
Wireshark网络协议解析原理与新协议添加方法_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、Wireshark网络协议解析原理与新协议添加方法1 / 13摘要:为了快速对自定义网络协议进行协议解析,对wireshark网络协议解析原理与添加方法进行了深入的分析。在此基础上,对wireshark添加自定义网络协议的解析器。由于有效地利用了wireshark已有框架,该方式相对传统自行开发协议分析工具具有工作量少、功能强大与兼容性好的优点。关键词:协议解析;wireshark; 网络分析0引言网络协议分析器(network analyzer)是对通用协议的数据包进行解码,并以人可读的格式显示网络流量内容的软件或设备。由于网络协议种类繁多,各种新协议层出不穷,因此分析器必须具有良好的可扩展

2、性,可方便地支持新的协议。wireshark是一款免费开源的协议分析器,是目前应用最广泛的网络协议分析软件之一。本文介绍了wireshark网络协议解析的原理与新协议添加的方法,并分析了向wireshark中添加新协议解析器的两种方法,并对自定义的网络协议给出添加步骤。1wireshark系统结构wireshark的系统结构如图1所示,主要功能模块如下:gtk 1/2:图形窗口工具,操控所有的用户输入/输出界面;core:将其它模块连接起来,起到综合调度的作用;epan:wireshark协议解析器;capture:数据包捕获引擎,依赖于底层库winpcap/libpcap库;wiretap:

3、从磁盘读写数据包文件的引擎。2数据包协议解析原理2.1协议树基于osi的7层协议模型,协议数据是从上到下封装后发送的,而对于协议解析需要从下至上进行。首先对网络层的协议识别后进行组包还原,然后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行下去,直到应用层。由于网络协议种类很多,就wireshark所识别的500多种协议来说,为使协议和协议间层次关系明晰,从而对数据流中各层次的协议能够逐层处理,wireshark系统采用了协议树的方式,如图2中所示。图2中udp协议的所有数据都是封装在ip协议中的,那么udp协议就是ip协议的一个协议子节点,具有相同父节点的协议成为兄弟节点,如tcp

4、与udp节点。图1wireshark的系统结构图图2一个简单的协议树wireshark采用协议的特征字来识别拥有同样父协议的兄弟节点协议。每个协议注册自己的特征字,这些特征字给子节点协议提供可以互相区分开来的标识。在wireshark中注册一个协议解析器首先需要指出它的父协议是什么,另外还需指出自己区别于父节点下所有兄弟节点协议的特征字。由于采用了协议树加特征字的设计,wireshark在协议解析上具备了很强的扩展性,增加一个协议只需要将该协议相关的解析函数挂到协议树上相应的节点即可。2.2添加协议解析器的方式向wireshark添加新协议解析器有两种方式:内置型(builtin)和插件型(p

5、lugin)。2.2.1插件型(plugin)插件型是构建一个插件(如一个动态连接库),并把它自己注册到主程序中,执行解析工作。插件技术,就是在程序的设计开发过程中,把整个应用程序分成宿主程序和插件两个部分,宿主程序与插件能够相互通信。并且,在宿主程序不变的情况下,可通过增减插件或修改插件来调整应用程序的功能。运用插件技术可以开发出伸缩性良好、便于维护的应用程序。由于现在网络协议种类繁多,为了可以随时增加新的协议解析器,wireshark也采用了插件技术。如果需要对一个新的协议进行解析,只需要开发这个协议解析器,并调用注册函数向主程序注册就可以了。2.2.2内置型(builtin)内置型是把一

6、个协议解析器编译进主程序中,它将一直可用。内置型与组件型的差异很小,只不过内置型的重构周期比组件型的长很多,同时没有插件型那么灵活。3数据包解析器代码结构新增加一个协议解析器的步骤一般分为注册协议,初始化解析器,实际解析处理3个步骤,下面以自定义协议演示如何增加一个协议解析器。插件型与内置型两种方式的代码结构基本相同,此处不做区别。自定义协议(foo protocol)格式如表1所示。表1自定义协议格式数据包类型标识序号ip地址该协议为udp协议的子协议,端口为1234,其中:数据包类型 一个字节,可能取值:1初始化,2终止,3数据。标识 一个字节, 可能取值:0x01开始数据包, 0x02结

7、束数据包, 0x04优先数据包。序号 两个字节。ip地址 四个字节。3.1注册协议主要调用proto_register_protocol函数来注册协议。#define foo_port 1234static int proto_foo = -1;static gint ett_foo = -1;void proto_register_foo(void)static hf_register_info hf = &hf_foo_pdu_type, “foo pdu type”, “foo.type”,ft_uint8, base_dec,null, 0x0,null, hfill , &hf_fo

8、o_flags, “foo pdu flags”, “foo.flags”,ft_uint8, base_hex,null, 0x0,null, hfill , &hf_foo_sequenceno, “foo pdu sequence number”, “foo.seqn”,ft_uint16, base_dec,null, 0x0,null, hfill , &hf_foo_initialip, “foo pdu initial ip”, “foo.initialip”,ft_ipv4, base_none,null, 0x0,null, hfill ;/* 设置协议子树数组*/stati

9、c gint *ett = &ett_foo;/*调用proto_register_protocol函数注册协议*/proto_foo = proto_register_protocol (“foo protocol”,/* 协议名称 */“foo”,/* 短名称(short name) */“foo”/* 协议简写名称*/);proto_register_field_array(proto_foo, hf, array_length(hf);proto_register_subtree_array(ett, array_length(ett);3.2初始化解析器把udp端口进行绑定,所以主程

10、序在接收到该端口的udp数据包后就调用该解析器。其中dissect_foo为做实际解析工作的函数。void proto_reg_handoff_foo(void)static dissector_handle_t foo_handle;foo_handle = create_dissector_handle(dissect_foo, proto_foo);dissector_add(“udp.port”, foo_port, foo_handle);3.3实际解析处理添加对具体协议各字段的解析。static int hf_foo_pdu_type = -1;static int hf_foo_

11、flags = -1;static int hf_foo_sequenceno = -1;static int hf_foo_initialip = -1;static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)gint offset = 0;/*检查协议列是否可以在用户界面显示*/if (check_col(pinfo-cinfo, col_protocol)col_set_str(pinfo-cinfo, col_protocol, “foo”);/* 如果能显示,清除info列中的数据*/if

12、 (check_col(pinfo-cinfo,col_info)col_clear(pinfo-cinfo,col_info);/* 添加一个子协议,并对协议进行解析*/if (tree) proto_item *ti = null;proto_tree *foo_tree = null;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,

13、 tvb, offset, 1, false); 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, false); offset += 2;proto_tree_add_item(foo_tree, hf_foo_initialip, tvb, offset, 4, false); offset += 4;有关协议解析器添加更详细、更

14、具体的内容参见文献2。4解析器代码的编译插件型与内置型解析器代码的编译区别较大,对此分别说明。4.1.1插件型(plugin)为了编译该解析器代码来创建该插件,除了解析器的源代码packet-foo.c外,还需要在该源代码文件所在目录下创建下列一些文件,其包含了windows平台与unix/linux平台下的各自所需文件。makefile.am unix/linux的makefile 模板;mon 包含插件文件的名称;makefile.nmake 包含wireshark插件的windows平台下的makefile;moduleinfo.h 包含插件版本信息;moduleinfo.nmake 包

15、含windows 平台下动态链接库(dll)的版本信息;packetfoo.c 自定义协议解析器的源代码;plugin.rc.in 包含windows 平台下的dll资源模板。mon与makefile.am文件必须修改,来反映相关的文件与解析器名称。moduleinfo.h 与moduleinfo.nmake文件必须填写版本信息。把该解析器编译成一个动态连接库或共享库,并复制到已安装wireshark的plugin目录下,即可使用。4.1.2内置型(builtin)内置型协议解析器源代码都在目录wireshark-1.2.0epandissectors下。此处,我们以添加udp协议为例,说明内

16、置型添加协议解析器的步骤:第一步:将要添加的协议解析器源文件packet-udp.c和头文件packet-udp.h放在此目录下;第二步:在此目录下修改mon文件,分别将源文件和头文件名添加到对应的dissector_src和dissector_include宏下面。dissector_src = packetudp.cdissector_includes =packetudp.h第三步:最后对整个工程进行编译连接,就可以把要添加的协议解析器,如同wireshark大多数内置解析器一起被整合编译到libwireshark中。5结束语在自行开发自定义协议分析器时,除了需要处理大量底层数据捕获、缓存与存储的开发工作外,还涉及到复杂的数据包过滤、网络信息统计与数据包内容显示的开发工作,并且很难提供足够的实用功能。通过有效利用wireshark已有框架,使得自定义协议解析器的开发量可显著减少,并可提供功能强大与兼容性更好的协议解析器,从而为网

温馨提示

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

评论

0/150

提交评论