文档详情

Wireshark网络协议分析的原理和新协议的添加方法.doc

发布:2017-07-03约4.72千字共11页下载文档
文本预览下载声明
Wireshark网络协议解析原理与新协议添加方法 摘要:为了快速对自定义网络协议进行协议解析,对wireshark网络协议解析原理与添加方法进行了深入的分析。在此基础上,对wireshark添加自定义网络协议的解析器。由于有效地利用了wireshark已有框架,该方式相对传统自行开发协议分析工具具有工作量少、功能强大与兼容性好的优点。 关键词:协议解析;wireshark; 网络分析 0引言 网络协议分析器(network analyzer)是对通用协议的数据包进行解码,并以人可读的格式显示网络流量内容的软件或设备。由于网络协议种类繁多,各种新协议层出不穷,因此分析器必须具有良好的可扩展性,可方便地支持新的协议。 wireshark是一款免费开源的协议分析器,是目前应用最广泛的网络协议分析软件之一。本文介绍了wireshark网络协议解析的原理与新协议添加的方法,并分析了向wireshark中添加新协议解析器的两种方法,并对自定义的网络协议给出添加步骤。 1wireshark系统结构 wireshark的系统结构如图1所示,主要功能模块如下:①gtk 1/2:图形窗口工具,操控所有的用户输入/输出界面;②core:将其它模块连接起来,起到综合调度的作用;③epan:wireshark协议解析器;④capture:数据包捕获引擎,依赖于底层库winpcap/libpcap库;⑤wiretap:从磁盘读写数据包文件的引擎。 2数据包协议解析原理 2.1协议树 基于osi的7层协议模型,协议数据是从上到下封装后发送的,而对于协议解析需要从下至上进行。首先对网络层的协议识别后进行组包还原,然后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行下去,直到应用层。 由于网络协议种类很多,就wireshark所识别的500多种协议来说,为使协议和协议间层次关系明晰,从而对数据流中各层次的协议能够逐层处理,wireshark系统采用了协议树的方式,如图2中所示。图2中udp协议的所有数据都是封装在ip协议中的,那么udp协议就是ip协议的一个协议子节点,具有相同父节点的协议成为兄弟节点,如tcp与udp节点。 图1wireshark的系统结构图图2一个简单的协议树 wireshark采用协议的特征字来识别拥有同样父协议的兄弟节点协议。每个协议注册自己的特征字,这些特征字给子节点协议提供可以互相区分开来的标识。在wireshark中注册一个协议解析器首先需要指出它的父协议是什么,另外还需指出自己区别于父节点下所有兄弟节点协议的特征字。 由于采用了协议树加特征字的设计,wireshark在协议解析上具备了很强的扩展性,增加一个协议只需要将该协议相关的解析函数挂到协议树上相应的节点即可。 2.2添加协议解析器的方式 向wireshark添加新协议解析器有两种方式:内置型(builtin)和插件型(plugin)。 2.2.1插件型(plugin) 插件型是构建一个插件(如一个动态连接库),并把它自己注册到主程序中,执行解析工作。 插件技术,就是在程序的设计开发过程中,把整个应用程序分成宿主程序和插件两个部分,宿主程序与插件能够相互通信。并且,在宿主程序不变的情况下,可通过增减插件或修改插件来调整应用程序的功能。运用插件技术可以开发出伸缩性良好、便于维护的应用程序。 由于现在网络协议种类繁多,为了可以随时增加新的协议解析器,wireshark也采用了插件技术。如果需要对一个新的协议进行解析,只需要开发这个协议解析器,并调用注册函数向主程序注册就可以了。 2.2.2内置型(builtin) 内置型是把一个协议解析器编译进主程序中,它将一直可用。 内置型与组件型的差异很小,只不过内置型的重构周期比组件型的长很多,同时没有插件型那么灵活。 3数据包解析器代码结构 新增加一个协议解析器的步骤一般分为注册协议,初始化解析器,实际解析处理3个步骤,下面以自定义协议演示如何增加一个协议解析器。插件型与内置型两种方式的代码结构基本相同,此处不做区别。自定义协议(foo protocol)格式如表1所示。 表1自定义协议格式 数据包类型标识序号ip地址该协议为udp协议的子协议,端口为1234,其中: 数据包类型—— 一个字节,可能取值:1—初始化,2—终止,3—数据。 标识—— 一个字节, 可能取值:0x01—开始数据包, 0x02—结束数据包, 0x04—优先数据包。 序号—— 两个字节。 ip地址—— 四个字节。 3.1注册协议 主要调用proto_register_protocol函数来注册协议。 #define foo_port 1234 static int proto_foo = -1; static gint ett_foo = -1;
显示全部
相似文档