Wireshark网络协议解析原理与新协议添加方法

Wireshark网络协议解析原理与新协议添加方法
摘要:为了快速对自定义网络协议进行协议解析,对wireshark网络协议解析原理与添加方法进行了深入的分析。在此基础上,对wireshark添加自定义网络协议的解析器。由于有效地利用了wireshark已有框架,该方式相对传统自行开发协议分析工具具有工作量少、功能强大与兼容性好的优点。
关键词:协议解析;wireshark; 网络分析
0引言
网络协议分析器(network analyzer)是对通用协议的数据包进行解码,并以人可读的格式显示网络流量内容的软件或设备。由于网络协议种类繁多,各种新协议层出不穷,因此分析器必须具有良好的可扩展性,可方便地支持新的协议。
wireshark是一款免费开源的协议分析器,是目前应用最广泛的网络协议分析软件之一。本文介绍了wireshark网络协议解析的原理与新协议添加的方法,并分析了向wireshark中添加新协议解析器的两种方法,并对自定义的网络协议给出添加步骤。
1wireshark系统结构
wireshark的系统结构如图1所示,主要功能模块如下:①gtk 1/2:图形窗口工具,操控所有的用户输入/输出界面;②core:将其它模块连接起来,起到综合调度的作用;③epanwireshark协议解析器;④capturedv观察:数据包捕获引擎,依赖于底层库winpcap/libpcap库;⑤wiretap:从磁盘读写数据包文件的引擎。
2数据包协议解析原理
2.1协议树
基于osi7层协议模型,协议数据是从上到下封装后发送的,而对于协议解析需要从下至上进行。首先对网络层的协议识别后进行组包还原,然后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行下去,直到应用层。
由于网络协议种类很多,就wireshark所识别的500多种协议来说,为使协议和协议间层次关系明晰,从而对数据流中各层次的协议能够逐层处理,wireshark系统采用了协议树的方式,如图2中所示。图2udp协议的所有数据都是封装在ip协议中的,那么udp协议就是ip
协议的一个协议子节点,具有相同父节点的协议成为兄弟节点,如tcpudp节点。
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;
硫铁矿制硫酸
void proto_register_foo(void)
{
static hf_register_info hf[] = {
{ &hf_foo_pdu_type,
{ foo pdu type, pe,
ft_uint8, base_dec,
null, 0x0,
null, hfill }
}
{ &hf_foo_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 }
}
};
/* 设置协议子树数组*/
static gint *ett[] = {
&ett_foo
};
/*调用proto_register_protocol函数注册协议*/
proto_foo = proto_register_protocol (
foo protocol,    /* 协议名称      */

本文发布于:2024-09-22 06:56:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/136839.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:协议   插件   数据包   解析器   解析   进行
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议