Wireshark(2)-协议分析的起点

本文详细介绍了Wireshark如何进行数据的读入,包括网卡输入和离线数据包输入,以及数据分析前的预处理。重点解析了Wireshark中Dissector之间的跳转机制,通过全局Hash表实现协议解析的高效跳转。此外,还探讨了为何使用多张不同表以优化查找效率。
摘要由CSDN通过智能技术生成

数据的读入

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中的过程,数据读入指实际从网卡或文件读入:



从上面的步骤能够能够看出如果要进行协议分析需要做两件重要的准备:

  1. 准备一个Epan Dissect分析器的实例
  2. 待分析的数据

怎么准备?上面的代码片段已经给出了答案,实际上所有的参数都可以从capture_file中直接或间接地得到。capture_file结构定义如下:


                
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值