思维导图
软件结构
下图是官方开发手册中的结构图:
以下是我自己画的结构图:
上图只画出了关键部分, 一些依赖库或 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. 在后续原理分析相关文档中, 会引用此工程中的代码来讲解.
参考
- Wireshark Developer’s Guide
- wireshark源码:
doc/
子目录 - GitHub: 我修改过的Wireshark代码(zzqcn分支)
- GitHub: Wireshark调用代码