数据的读入
Wireshark数据的读入分为两种,一种是直接从网卡读入实时的报文数据,另一种是读取被保存为文件的报文数据。先来分别看下这两种方式有何区别。
网卡输入
从网卡流如的数据是通过dumpcap调用libpcap或winpcap抓取的,而抓取到数据后其通过管道将数据传输到主进程再进行处理,其过程大概如下:
从上图可以看到,在Wireshark抓包时,数据包实际上是由另一个进程抓取再通过管道的形式传输到主进程。这样设计的原因从官网的说法是避免Wireshark运行时权限太高,因为数据包的抓取需要Root权限,而这种方式实现则只需要将Root权限授予dumpcap就可以,而在协议分析阶段只使用正常的用户权限。
离线数据包输入
先来看下如下流程图,
从上图能够看出,离线的本地数据包文件直接由WireTap模块直接读取。
数据分析前的预处理
数据包怎么从管道读取过来的与数据包是怎么通过Wtap读取到的这些内容在这将不会详述了,跟着代码逻辑其过程很容易理解。而数据包应该怎么传入Epan去做分析,传入Epan模块之前又有什么要求?这才是阅读Wireshark源码应该关注的重点。
先来看其读取数据并开始处理的代码片段,
capture_file *cf = xxx
...
edt = epan_dissect_new(cf->epan, create_proto_tree, print_packet_info && print_details);
while (to_read-- && cf->provider.wth) {
wtap_cleareof(cf->provider.wth);
ret = wtap_read(cf->provider.wth, &err, &err_info, &data_offset);
reset_epan_mem(cf, edt, create_proto_tree, print_packet_info && print_details);
ret = process_packet_single_pass(cf, edt, data_offset,
wtap_phdr(cf->provider.wth),
wtap_buf_ptr(cf->provider.wth), tap_flags);
}
其对应的流程图为,其中从初始化Frame数据开始为process_packet_single_pass中的过程,数据读入指实际从网卡或文件读入:
从上面的步骤能够能够看出如果要进行协议分析需要做两件重要的准备:
- 准备一个Epan Dissect分析器的实例
- 待分析的数据
怎么准备?上面的代码片段已经给出了答案,实际上所有的参数都可以从capture_file中直接或间接地得到。capture_file结构定义如下: