Wireshark初探

  1. Wireshark整体结构
  2. Wireshark的初始化
    1. WireTap模块初始化
    2. Epan的初始化
      1. 基础服务初始化
      2. 协议分析初始化
  3. Reference

Wireshark整体结构

wireshark总体架构

Wireshark主要由6个模块构成,分别是:

  • GUI:这个模块主要用于用户图形界面显示
  • CORE:这个模块包含了将其它各个模块联结起来的共同工作的核心逻辑
  • Epan:这个模块是数据包分析的核心部分,其中包含了协议栈,以及各个协议分析的实现以及过滤器等
  • Wiretap:这个模块实现了读写各种数据包文件的接口及逻辑抽象
  • Dumpcap:wireshark的抓包引擎,其底层调用winpcap或libpcap
  • Capture:这个模块实现了抓包引擎的接口

Wireshark的初始化

谈到Wrieshark的初始化就涉及到许多方面,同时由于Wireshark支持众多平台,不同版本,因此其中也涉及到一些平台相关的初始化内容。在这里为了使叙述逻辑更清晰,将不会设计平台相关的初始化部分以及不同实现版本所特有的初始化部分,而只描述其重要功能模块的初始化过程。先从下图了解从Wireshark启动开始其经历了哪些初始化阶段。

![][2]

图中灰色部分暂且不叙述,因为每个平台的初始化方式都不一样,对应wireshark的协议分析功能来讲也不是必须的,因为在接下来的文章当中会将重点放在Wireshark是如何实现协议分析的上面,因此对于初始化的描述也将围绕这个来展开。而对于数据的输入仅以Wireshark读取抓包文件为示例,因其在各平台上都是通用的。

为了不引起不必要的担忧——没说明Capture部分是否就漏过了许多内容,在这儿做个说明:实时抓包获得数据后将数据传给Wireshark分析其过程基本上是大同小异的,唯一的区别就是因数据来源不一样,因此数据的获取接口以及相关的一些输入参数有一定区别,因此理解其中一种后,对于另一种的理解将没有任何难度。

WireTap模块初始化

WireTap模块是用于数据包的文件读写的,其中标准的系统I/O的基础上进行了封装,使得面向使用者的接口不用再关心每种文件类型应该怎么读写。首先来看看其初始化入口函数,

1
2
3
4
5
6
void wtap_init(gboolean load_wiretap_plugins)
{
init_open_routines();
wtap_opttypes_initialize();
wtap_init_encap_types();
}

init_open_routines这个函数是个相当简单的函数,从其字面意思就能知道它是用于初始化各种文件的open函数例程的。在WireTap模块中实现了多种文件格式的打开方法。而在这初始化阶段就是将这些各种方法以特定结构存储在一个数组中方便在其它地方使用统一的接口进行调用。从file_access.c文件的全局数据open_info_base就能够知道wireshark支持的所有文件类型及打开方式。

wtap_opttypes_initialize函数初始化了blocktype_list这么一个数组。

wtap_init_encap_types这同样初始化了一个数组encap_table_base的信息,这里面保存着所有支持的2层协议的数据封装类型。

好了到这儿其实可以看出Wiretap没有做任何逻辑上的初始化操作,仅仅是初始化了一些数据以供在其它位置查询与使用。

Epan的初始化

Epan的全称为Ethereal Packet ANalyzer,意思是最好的报文分析器。从起名称能够知道Epan其实就是报文分析的模块,相比起WireTap的初始化,Epan的初始化过程要复杂得多。下面通过一张流程图来看看Epan初始化经历了哪些步骤。

![][3]

基础服务初始化

这一部分是Wireshark中与协议无关部分的初始化,但这些部分在Wireshark中却起到了非常大的作用,是Wireshark协议分析实现所依赖的基础。

  • 内存管理初始化

Wireshark实现了一套完整的内存管理框架,同时也提供了许多方便的数据结构操作接口,通过这些接口可以很快速的实现许多常用的功能。

  • GUID初始化

这一部分初始化了一个树状结构,用于保存一些全球唯一的uuid,在源码中使用到的场景比较少。

  • 地址解析初始化

地址解析这块分为五部分,

  • 应用服务
  • 物理地址
  • IPXNET
  • Vlan
  • 企业

应用服务,初始化了一些常用应用的端口,协议和名称,通过从一个配置文件读入一个Hash表方便在协议分析的时候使用,这个文件名叫services,在Wireshark源码根目录下可以找到。

物理地址,从配置文件中读取物理地址与厂商的对应关系,以及初始化一些知名的物理地址。这两个配置文件分别是manuf与wka,也在源码根目录下可以找到,当然也可以仿照相应格式进行修改与配置。这些信息会被读入Hash表中。

IPXNET,这一步简单的设置了IPXNET配置文件的路径,如/etc/ipxnets

Vlan,设置Vlan配置文件路径,vlan和Ipxnet的信息都不会读入Hash表,都是在需要的时候直接从文件解析获取。

企业,这儿初始化了全球著名企业的信息并存入Hash表,这些企业信息的出处为Enterprise Numbers

  • 异常初始化

Wireshark使用C实现,其没有如C++这样的异常处理机制,因此Wireshark实现了一套独立的异常处理框架。

  • 插件初始化

Wireshark包含多种扩展形式,用Lua脚本,用动态库,因此其实现了一套插件机制。在这初始化部分将会扫描插件目录将所有插件加载到Wireshark中。

  • 加密算法库初始化

Wireshark使用了Libgcrypt库做各种加解密,而gcry_control就是Libgcrypt库的初始化接口。

协议分析初始化

好了对于Wireshark的基础服务部分的初始化部分以及介绍完毕,那么接下来将看看Wireshark最重要的协议解析部分都有哪些重要部分需要初始化。

  • TAP

TAP是Wireshark中重要的子系统,可以通过其方便的实现信息收集和报文统计等功能。在初始化阶段没有任何数据结构等的初始化。

  • Prefs与Expert

这两个模块主要是提供协议详情描述方面的描述信息,比如点开Wireshark能够看到的如Checksum,Disabled,Unknown等字段都是由这两个模块提供。

  • Packet

Wireshark当中协议与协议之间的跳转完全依赖于Hash表结构,在每个协议的初始化阶段都会将其与其它协议的依赖关系注册到相应Hash表中。而这些不同的Hash表则在Packet中实现(源码路径epan/packet.c),而在这初始化部分则主要对相应的Hash表进行初始化

  • Conversation

Wireshark实现了一个通用的会话管理模块。在协议处理中通常将拥有对称的五元组信息的数据包归入同一条流,而Wireshark则只使用地址/端口来识别数据包是否同属于一条流。同时为了应对特殊的解析需求,地址/端口的形式又分为如下四种,

  • 地址1/端口1-地址2/端口2
  • 地址1/端口1-端口2
  • 地址1/端口1-地址2
  • 地址1/端口1

上面的地址/端口的搭配形式表明了可以用不同的信息来标识一条流,而这种实现的产生是由于在某些场景可能只能获取到单向的地址和端口号(及只能获取地址1,端口1),在这种场景下,仍然要求用两个地址和两个端口一起来标识一条流显然是不现实的。Wireshark为了存储这样的不同场景下的流一共构建了4张Hash表。而在这个初始化阶段就是对这4张Hash表的初始化。

  • Capture Dissector

Capture Dissector的实现与Packet模块的实现基本一致,其作用一样只是应用场景不同。同样是初始化了两个Hash表,可以将不同的Dissecotr保存到其中用于在各个不同Dissector之间跳转。在这Dissector就是指协议分析器,也是Wireshark中协议栈的具体实现。

  • Reassembly Tables

这儿主要是对各个协议的重组相关数据结构的初始化,每个协议在实现的时候如果有重组相关的需求,就需要向这个模块注册相应重组功能的初始化函数。

  • Protocol

WireShark有一个协议管理模块,这里面管理着Wireshark支持的所有协议的细节。在初始化阶段会依次调用各个协议的注册回调,通过这样将所有协议注册的信息保存到一个数组中并为每个已分配的协议分配一个唯一的协议ID,在这儿每个协议ID是等同于相应协议在数组中的索引号的。

同时这个模块是Wireshark协议的核心模块,在proto.c中实现了对Protocol的初始化,同时还提供了丰富的协议树的操作接口。

  • Dfilter

Dfilter同样是Wireshark中很有特色的一个模块,其提供了独立的报文字段匹配过滤的框架,通过它可以很方便的指定不同协议的不同字段来过滤相应报文。在这个初始化阶段也仅是初始化一些必要的数据结构。

Reference

  1. Wireshark wiki
  2. Wireshark Developer Guide
  3. WireShark Source Code

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:Wireshark初探

本文作者:红尘追风

发布时间:2017-09-12, 22:14:46

原始链接:http://www.micernel.com/2017/09/12/Wireshark%E5%88%9D%E6%8E%A2/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录