[Wireshark] 11.2.获取解析的数据

832 阅读4分钟

11.2.1.Field

一个字段提取器(Field extractor),用来获取字段值。一个字段对象能且只能在 dissectors、post-dissectors、heuristic-dissectorstaps 的回调函数之外创建;

一旦创建,它就可以在回调函数中使用,以生成一个 FieldInfo 对象;

11.2.1.1.Field.new(fieldname)

创建一个字段提取器;

  • 参数

    • fieldname

      所创建的字段过滤器(field filter)的名称(例如,ip.addr)

  • 返回值

    • 一个字段提取器;
  • 可能出现的错误

    • A Field extractor must be defined before Taps or Dissectors get called

11.2.1.2.Field.list()

用于获取一个包含所有已注册字段过滤器名称的Lua数组表(Lua array table);

PS:该操作开销十分巨大,应仅在错误排查时使用;

  • 返回值

    • 一个包含所有字段过滤器名称的数组表;

11.2.1.3.field:__call()

获取调用该方法的字段的所有值(详见FieldInfo);

  • 返回值

    • 该field中的所有值;
  • 可能出现的错误

    • Fields cannot be used outside dissectors or taps

11.2.1.4.field:__tostring()

获取一个带有字段过滤器名称的字符串;

11.2.1.5.field.name

模式:仅用于检索(Mode:Retrieve only);

该字段过滤器的名称,不存在则为空;

11.2.1.6.field.display

模式:仅用于检索(Mode:Retrieve only);

该字段的完整显示名称,不存在则为空;

11.2.1.7.field.type

模式:仅用于检索(Mode:Retrieve only);

该字段的ftype,不存在则为空;

11.2.2.FieldInfo

一个从已解析的数据包中提取的字段;

FieldInfo 对象只能在dissectorspost-dissectorsheuristic-dissectorstaps的回调函数中使用;

FieldInfo 可以通过事先使用 Field.new()Field() 在现有的Wireshark 字段上调用,也可以通过Lua从 ProtoField 创建的新字段上调用;

11.2.2.1.fieldinfo:__len()

获取该字段的长度;

11.2.2.2.fieldinfo:__unm()

获取该字段的偏移量;

11.2.2.3.fieldinfo:__call()

获取该字段的值;

在1.11.4版本之前,这个函数就用于为绝大部分的字段类型来检索值,但是对于 ftypes.UINT_BYTES 这一类型,它检索的是整个字段的报文数据可用范围(Tvbrange)的字节数组(ByteArray)。换句话说,它返回的ByteArray包括了前导字节(leading length byte(s) )的长度,而不是仅仅包含值的字节。那是一个Bug,在1.11.4版本中已被修复。此外,对于 ftupes.GUID 这种类型也是同样的情况;

如果你仍然希望得到一个 TvbRangeByteArray ,请使用 FieldInfo:get_range() 来获取,然后使用 Tvb:bytes() 将其转换为 Bytearray

11.2.2.4.fieldinfo:__tostring()

该字段的一个字符串表示;

11.2.2.5.fieldinfo:__eq()

检查等式左值(lhs)是否在等式右值(rhs)之内;

11.2.2.6.fieldinfo:__le()

检查等式左值(lhs)的结束字节是否在等式右值(rhs)的结束字节之前;

  • 可能出现的错误

    • Data source must be the same for both fields

11.2.2.7.fieldinfo::__lt()

检查等式右值(rhs)的结束字节是否在等式右值(rhs)的起始字节之前;

  • 可能出现的错误

    • Data source must be the same for both fields

11.2.2.8.fieldinfo.len

模式:仅用于检索(Mode: Retrieve only);

该字段的长度;

11.2.2.9.fieldinfo.offset

模式:仅用于检索(Mode: Retrieve only);

该字段的偏移量;

11.2.2.10.fieldinfo.value

模式:仅用于检索(Mode: Retrieve only);

该字段的值;

11.2.2.11.fieldinfo.label

模式:仅用于检索(Mode: Retrieve only);

一个代表该字段的字符串;

11.2.2.12.fieldinfo.display

模式:仅用于检索(Mode: Retrieve only);

一个字符串,含义是该字段将在GUI中以什么名称展示;

11.2.2.13.fieldinfo.type

模式:仅用于检索(Mode: Retrieve only);

内部字段类型,一个与 init.lua 中的 ftype 值匹配的数字;

11.2.2.14.fieldinfo.source

模式:仅用于检索(Mode: Retrieve only);

Fieldinfo 的源报文数据(Tvb)对象,不存在则为空;

11.2.2.15.fieldinfo.range

模式:仅用于检索(Mode: Retrieve only);

TvbRange ,即 Tvb 中该field覆盖的字节数,不存在则为空;

11.2.2.16.fieldinfo.generated

模式:仅用于检索(Mode: Retrieve only);

该字段是否被标记为已生成(布尔型);

11.2.2.17.fieldinfo.hidden

模式:仅用于检索(Mode: Retrieve only);

该字段是否被标记为隐藏(布尔型);

11.2.2.18.fieldinfo.is_url

模式:仅用于检索(Mode: Retrieve only);

该字段是否被标记为一个URL(布尔型);

11.2.2.19.fieldinfo.little_endian

模式:仅用于检索(Mode: Retrieve only);

该字段是否为小数位编码(little-endian encoded)(布尔型);

11.2.2.20.fieldinfo.big_endian

模式:仅用于检索(Mode: Retrieve only);

该字段是否为大数位编码(big-endian encoded)(布尔型);

11.2.2.21.fieldinfo.name

模式:仅用于检索(Mode: Retrieve only);

该字段的过滤器名称;

11.2.3.Global Functions

11.2.3.1.all_field_infos()

获取当前协议树(current tree)上的所有字段。请注意,这个函数只获取底层解析器(underlyting dissectors)为这个数据包(packet)所填充的字段——或许还有一些适用于这个数据包的字段没有被填充(至协议树),因为在此时此刻它们并没有被需要(not needed for anything)。这个函数只获得C端(C-side)代码当前填充的内容,而不是完整的列表。

  • 可能出现的错误

    • Cannot be called outside a listener or dissector