思维导图

Wireshark原理: 概述 - 图1

软件结构

下图是官方开发手册中的结构图:
Wireshark原理: 概述 - 图2

以下是我自己画的结构图:
Wireshark原理: 概述 - 图3
上图只画出了关键部分, 一些依赖库或 Wireshark 软件模块并未画出. 其中,

  • glib, libpcap, Qt 是 Wireshark 依赖库
  • wiretap, wsutil, epan 实现为动态库, epan 的库文件名是 libwireshark.so
  • UI 还有其他一些 Wireshark 代码未实现为动态库
  • tshark 和 wireshark 是可执行程序, 其中 wireshark 带有图形界面, 它是通过 Qt 实现的, 而 tshark 为命令行程序

    相关文档

  • 开发手册

  • 源码中的 doc 子目录

doc 子目录中有一组 README 文件, 它们的内容分别是:

文件 说明
README.capture the capture engine internals
README.design Wireshark software design - incomplete
README.developer 编码规范
README.dissector How to dissect a packet
README.display_filter Display Filter Engine
README.idl2wrs CORBA IDL converter
README.packaging how to distribute a software package containing WS
README.regression regression testing of WS and TS
README.stats_tree a tree statistics counting specific packets
README.tapping “tap” a dissector to get protocol specific events
README.xml-output how to work with the PDML exported output
wiretap/README.developer how to add additional capture file types to Wiretap
README.heuristic what are heuristic dissectors and how to write them
README.plugins how to “pluginize” a dissector
README.request_response_tracking how to track req./resp. times and such
README.wmem how to obtain “memory leak free” memory

阅读这些文档可以获得很多信息. 本文只编译其中的 README.design 和 README.developer, 因为其内容比较”整体”, 其他文档内容则在特定原理文章中提及.

学习方法

要学习和理解 Wireshark 原理, 阅读源码, 看文档, 编译调试等当然是众所周知的好方法. 除此之外, 我还通过在自己的代码中调用 Wireshark 来帮助理解. 主要思想是调用 Wireshark 的动态库, 如 libwireshark.so.

然而这种方式也有一些限制, 比如 libwireshark.so 有可能没有导出我们想要的函数, 这时就需要修改一下代码. 我对于修改代码的原则是尽量只做最小的修改, 比如对于导出函数, 只需将此函数声明中的 WS_DLL_LOCAL 修改为 WS_DLL_PUBLIC 就可以了. 经过修改后的 Wireshark 代码在我的 GitHub: https://github.com/zzqcn/wireshark, zzqcn分支, 目前它基于 3.4.5 版本.

我建立了一个开源工程, 用于存放这些代码, 地址: https://github.com/zzqcn/wsdev. 在后续原理分析相关文档中, 会引用此工程中的代码来讲解.

参考