关于wiretap库

关于wiretap库

在wireshark作者的计划中wiretap将替代libpcap做数据包捕获,但目前它仅用作读取各种类型捕获文件(例如libpcap,sniffer,snoop等)的库。关于作者关于wiretap功能上的规划可以看wireshark/wiretap/README这个文件。

在wireshark/wiretap/README.developer这个文件中,说明了如何为这个模块添加功能以解析一个新类型的捕获文件。要注意当前版本的文档应该略有过时,需要对照wireshark/wiretap目录下的几个文件wtap.h/wtap.c/file_access.c/libpacp.h/libpacp.c中的代码以作深入了解。下面是对这个文件的翻译。

------------------------------------------------华丽的分隔符-----------------------------------------------------

这是一个非常快速粗略的指南,用于添加对新的支持捕获文件格式。如果您发现任何错误或有任何改进,请提交补丁 - 免费软件是社区的努力...

要添加读取新捕获文件格式的功能,您必须:

  • 为文件类型添加一个新的 WTAP_FILE_ 值到“wiretap/wtap.h”;
  • 编写一个“open”例程,它可以读取捕获文件的头部并通过查看开头的幻数(译注:magic number, 用于声明文件类型,例如‘PE’之于EXE类型文件)或使用某种形式的启发式方法来确定它是否是该格式的文件(如果文件格式有一个幻数那就应该使用它);
  • 编写一个“read”例程,该例程可以从文件中读取数据包并提供数据包长度、捕获的数据长度、时间戳、数据包伪标头(如果有)和数据,并让“open”例程设置“wtap.subtype_read”为该read例程(译注:wtap为保存当前读取文件的数据的结构,定义在wtap-int.h,其中包含了文件句柄和各种read/seek等例程);
  • 编写一个“seek and read”例程,该例程可以在文件中的指定位置查找包并提供包伪标头(如果有)和数据,并在“open”例程中设置“wtap”结构的 subtype_seek_read” 成员为该例程;
  • 如有必要则编写一个“close”例程(例如“open”例程分配了内存),并将“wtap”结构的“subtype_close”成员设置为指向它,否则将其设置为 NULL;
  • 将指向“open”例程的指针添加到“wiretap/file_access.c”中的“open_routines_base[]”表 - 如果它使用幻数,则将其放在该列表的第一部分,如果它使用启发式则放在第二段,最好把二进制文件的启发式例程放在文本文件的启发式例程之前(译注:主要目的是为了方便管理代码。通常新增一个类型的时候使用幻数更为简单明了,至少用二进制编辑器打开的时候可以方便知道是什么类型的文件);
  • (译注:未能在代码中找到下面这条对应的代码,应该是文档过期了,下面这段仅作参考。从描述上最类似下文中dump_open_table_base[]的是static const struct file_type_subtype_info* file_type_subtype_table;这个结构也有"The file type description."," The file type name", "the default file extension"和"can_write_encap"等对应的成员,不同的是当前版本的代码中使用的是GArray而不是静态的数组)在“wiretap/file_access.c”的“dump_open_table_base[]”中为该文件类型添加一个条目,给出一个描述性名称,一个便于在命令行上输入的短名称(请不要使用空格或大写字母),要打开和保存的常用文件扩展名,一个是否可以用 gzip(当前未使用)压缩的标志,如果支持写入该文件则设置指向“can_write_encap”和“dump_open”例程的指针否则置为空指针。

Wiretap程序通常首先在数据捕获文件上执行顺序读取,然后可能对单个帧进行“seek and read(搜索和读取)”。 “read”例程应将变量data_offset(译注:目前是read例程的输出参数)设置为数据捕获文件中的(当前)偏移量,“seek and read”例程将从这个字节偏移量开始读取(译注:这里的描述有些问题,实际上“seek and read”例程通过参数"seek_off"可以从任意帧的边界开始读取)。 如果捕获记录包括:

  • capture record header
  • pseudo-header (e.g., for ATM)
  • frame data

那么data_offset应该指向pseudo-header。 第一次顺序读取将处理和存储捕获记录capture record header,但不会存储pseudo-header。 请注意,seek_and_read 例程应该使用传入的 wtap.random_fh文件句柄(译注:随机读取句柄的意思),而不是正常read例程中使用的wtap.fh文件句柄。

以上部分为读取新捕获格式文件的功能,如要加入写文件的功能,你必须这样做:

  • 添加“can_write_encap”例程,该例程返回新文件格式是否支持给定数据包封装格式的标识;
  • 添加开始写入文件的“dump_open”例程(写入标头、分配数据结构等);
  • 添加“dump”例程以将数据包写入文件,并在“dump_open”例程中设置“wtap_dumper.subtype_write”为此例程;
  • 如有必要,添加“dump_close”例程(例如“dump_open”例程分配了内存,或者某些文件头只能在写入所有数据包后才能写入),并让“dump_open” 例程将“wtap_dumpe.subtype_close”成员设置为此例程;
  • (译注:找不到dump_open_table_base,目前最相近的是file_type_subtype_info类型)在该文件类型的“dump_open_table_base[]”条目中放置指向“can_write_encap”和“dump_open”例程的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值