曹利 王丹丹
摘 要: 在分析Wireshark体系结构和功能的基础上,研究了Wireshark环境下协议解析器开发的方法和流程,以一个简单的私有协议amin进行了验证性开发,实验结果说明Wireshark的开放性架构有效的满足了新解析插件添加和对新协议的分析。对业界非标准新协议的拓展研究有借鉴意义。
关键词: Wireshark; 协议解析; 插件开发; 网络协议
中图分类号:TP393 文献标志码:A 文章编号:1006-8228(2015)06-13-03
Abstract: The Wireshark's function, architecture, components are analyzed, and the method and process of protocol parser development is also studied. At the same time, a validation of development has been done on a simple protocol Amin. Experimental results show that the open architecture of Wireshark is effective to a newly added protocol parser plug-ins and to new protocol parsing, this paper provided a reference for the expanded research of non-standard protocol.
Key words: Wireshark; protocol parsing; plug-in development; network protocol
0 引言
网络协议分析软件的功能是撷取网络数据包的协议头及相关负载信息,通过分析,尽可能为用户显示出最为详细的网络协议资料,从而了解信息及相关数据包在产生和传输中的行为。由于网络协议层出不穷,一个好的网络协议分析软件必须既能对标准协议进行有效分析,又能提供接口允许用户添加新的协议解析方法[1]。Wireshark(前称Ethereal)是目前应用最广泛的网络协议分析软件之一,由密苏里大学计算机专业的Gerald combs出于项目需要而开发,于1998年以GPL开源许可证发布,Wireshark的使用者可以免费取得该软件和其源代码,并根据自身协议解析的需求对其进行定制和扩展。
本文在分析Wireshark的系统结构的基础上,研究了Wireshark的开发环境,方法和步骤,并进行了新协议解析插件开发验证,为新协议的拓展研究打下基础。
1 Wireshark体系结构分析
Wireshark的结构主要由Capture Core、win-/libpcap、WireTap、Dissector几个核心模块构成。综合调度模块Capture Core调用底层抓包工具win-/libpcap获得网络数据,并调用磁盘读写包模块WireTap写入本地磁盘。因为数据是二进制文件,所以必须调用解析器模块Dissector对二进制数据进行协议解读,并把协议部分的各个字段信息进行详细地呈现。解析器Dissector的核心工作就在于数据包详细内容窗口部分的树形结构的维护,并结合过滤器、数据包列表等部分,进行筛选与信息的呈现。当用户需要对新协议进行开发,实质上就是对Dissector进行拓展,Dissector可以是内置形式的(Build-in),也可以是插件形式的(Plug-in),所以,基于Wireshark的协议解析器开发有两种模式,即:Build-in、Plug-in[2]。其系统结构如图1所示。
2 Wireshark开发环境设置
在Windows环境下进行Wireshark开发需要的工具有:
⑴ Visual C++ 2005 Express Edition(C编译器);
⑵ Cygwin(一个Win32上的仿Unix平台);
⑶ Python(一种面向对象的高级脚本语言);
⑷ Subvertion Client(TortoiseSVN)(可选);
⑸ Wireshark依赖的开发包。
安装步骤及开发环境设置如下[3]。
⑴ 安装VS2005/VS2003 等C语言编译器,同时必须确认下载并安装本操作系统的SDK。
⑵ 安装Cygwin,在Wireshark插件开发中需要用到的安装包有:Archive/unzip、Devel/bison、Devel/flex、Interpreters/perl、Utils/patch、Web/wget,在”Select Package”页需要改变下载选项,将以上安装包选中安装。
⑶ 安装Python,版本符合Wireshark源代码包中的config.nmake文件中的PYTHON_VER中定义的版本(例如PYTHON_VER=27,则选择python-2.7.*的版本)。
⑷ 安装Subvertion Client,可以下载使用TortoiseSVN,安装后重启,浏览文件夹时右键会获取源代码树,方便程序开发。
⑸ 编译Wireshark。使用svn客户端TortoiseSVN将Wireshark源代码下载到本地磁盘,修改源码的config.nmake文件来指定对应的工具以及相关信息,主要做以下几项修改:
WIRESHARK_TARGET_PLATFORM:指定编译目标平台;
VERSION_EXTRA:指定自定义编译个人版本信息,字符串形式。
WIRESHARK_LIBS:依赖库的路径,依赖库可以通过makefile文件自动获取。
cygwin的安装路径:CYGWIN_PATH=C:\cygwin\bin
python的路径PYTHON="C:/python25/python.exe"
设置nsis打包工具的路MAKENSIS="d:\Program Files\
nsis\makensis.exe"
编译输出文件路径INSTALL2_DIR=E:\MyCode\wire-
shark\Wireshark-gtk2
设置命令行环境:在命令行中直接运行nmake -f Makefile verify_tools
如果所有必需安装的软件包都安装好了,则会出现如图2所示的界面。
⑹ 编译Wireshark需要的依赖库文件:nmake -f Makefile.nmake setup
⑺ 清理无用文件:nmake -f Makefile.nmake distclean
⑻ 编译nmake -f Makefile.nmake all
3 Wireshark解析协议的开发
3.1 Wireshark协议解析原理
基于TCP/IP的协议数据包在发送端是从上往下进行层层封装,接收者对协议的解析需从下往上,首先对数据帧的协议分析,脱去协议头,然后将数据交由网络层分析,网络层协议识别后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行下去,直到应用层。为使协议和协议间层次关系明晰,从而对数据流中各层次的协议能够逐层处理,Wireshark系统采用了图3所示协议树的方式。Wireshark采用协议的特征字来识别拥有同样父协议的兄弟节点协议。每个协议注册自己的特征字,这些特征字给子节点协议提供可以互相区分开来的标识。在Wireshark中注册一个协议解析器首先需要指出它的父协议是什么,另外还需指出自己区别于父节点下所有兄弟节点协议的特征字。
由于采用了协议树加特征字的设计,Wireshark在协议解析上具备了很强的扩展性,增加一个协议只需要将该协议相关的解析函数挂到协议树上相应的节点即可[4]。
3.2 插件型解析器开发
Wireshark默认支持1170多种业界通用网络协议,在Wireshark主菜单“Internals>Support Protocols ”可查看当前支持的所有协议。当Wireshark需要解析非业界通用协议时,就必须使用内置件形式或插件技术进行协议解析的拓展,内置件形式需要了解Wireshark的组织构建,了解源文件的存放位置和编译运行方式等,难度较大。而插件技术是通过提供通用接口调用插件的方式开发解析协议,在指定源代码目录\plugins\下增加编译好的库文件(*.dll)。运用插件技术可以开发出伸缩性良好、便于维护的应用程序,相对来说简单易行。本文主要分析插件型解析器开发技术。
协议解析器的核心逻辑流程包括以下部分[5]。
⑴ 注册协议:注册协议的名称,过滤字符串及其他相关所需的结构。
⑵ 提供协议解析函数:这是关键部分,此函数由Wireshark核心调用,处理协议的解析及显示工作。
Wireshark启动时会加载所有$installdir/plugins/$buildversion/*.dll,并且调用每个dll导出的两个函数proto_reg_handoff_xxx和proto_register_xxx。插件在这两个函数里完成 解析器dissector的注册和初始化工作,其中plugin_registe注册插件,plugin_reg_handoff注册协议。
插件型解析器开发的具体过程如下。
第一步,在Wireshark的plugins目录下创建一个目录,一般以需要解析的协议名作为目录名。
5 结束语
随着网络技术的迅速发展。网络协议的种类也越来越多,对新协议的研究需要一个可扩展的协议分析器进行协议解析,而Wireshark以其开源性和良好的二次开发架构满足了该需求。本文在分析Wireshark体系结构的基础上,研究了Wireshark环境下协议解析器开发的方法和流程,同时以一个简单的私有协议amin进行了验证性开发,实验结果说明Wireshark的开放性架构有效的满足了新解析插件添加和对新协议的解析。这将为网络设计和研究中的新协议拓展带来很大的便利。
参考文献:
[1] 蒋波,李方军,郝军.数据包的截获与网络协议分析[J].重庆三峡学院
学报,2006.22(3):26-28
[2] Wireshark技术文档4.0.1[EB/OL].http://www.winpcap.org,
2014-06-03.
[3] 罗青林,徐克付,'臧文羽,刘金刚. 1 Wireshark 环境下的网络协议解
析与验证方法[J].计算机工程与设计,2011.32(3):770-773
[4] MoinMoi, Python.doc/README. developer[EB/OL]. http://wiki.
Wireshark.org/Development,2009.
[5] KenThompson. Creating your own custom Wireshark dissector
[EB/OL].http://www.codeproject.com/KB/IP/custom_dissector.aspx,
2009.