[Wireshark] 11.6.新协议与解析器的方法(Functions For New Protocols And Dissectors)

2,899 阅读23分钟

本章中的类与方法允许Lua脚本为Wireshark对象创建新的协议;

Proto 协议对象可以有 Pref 偏好设置,可在详细信息视图树中显示的可筛选值的 ProtoField 字段、用于解析新协议的方法等;

可以通过 DissectorTable 将解析方法 (dissection function) 与现有的协议树挂钩,这样,新协议的解析方法就可以被该协议调用,而新的解析器(dissector)本身可以通过检索和调用 Dissector 对象来调用其他已存在的协议解析器;

Proto dissector也可以作为后置解析器(post-dissector),在每个数据帧解析结束时使用,或则作为启发式解析器(heuristic dissector)使用;

11.6.1. Dissector

解析器的一个引用, 用于针对一个数据包或该数据包的一部分调用解析器;

11.6.1.1. Dissector.get(name)

通过名称获取一个解析器;

  • 参数

    • name

      该解析器的名称;

  • 返回值

    • 如果通过名称检索到了该解析器,则返回其的一个引用,否则返回nil;

11.6.1.2. Dissector.list()

返回一个包含所有已注册 Dissector 名称的 Lua 数组;

ps:该操作开销巨大,应仅用于错误检测;

  • 返回值

    • 一个含有已注册解析器名称的数组表;

11.6.1.3. dissector:call(tvb, pinfo, tree)

针对给定的数据包或该数据包的一部分调用一个解析器;

  • 参数

    • tvb

      待解析的缓冲区(即报文内容 );

    • pinfo

      该数据包的信息

    • tree

      要添加协议项的协议树;

  • 返回值

    • 已解析字节数;

      ps: 一些解析器总是返回传入缓冲区的字节数,敬请留意;

11.6.1.4. dissector:__call(tvb, pinfo, tree)

针对给定的数据包或该数据包的一部分调用一个解析器;

  • 参数

    • tvb

      待解析的缓冲区(即报文内容 );

    • pinfo

      该数据包的信息

    • tree

      要添加协议项的协议树;

11.6.1.5. dissector:__tostring()

获取该 Dissector 的 协议短名称;

  • 返回值

    • 表示该协议短名称的字符串;

11.6.2. DissectorTable

一个具体协议所含有的子解析器(subdissector)表(例如, TCP 的子解析器 http, smtp, sip 就被添加到了表 "tcp.port" 中);

在表中添加更多的解析器, 那样他们就可以出现在“解码为...”( “Decode As…” )对话框中;

11.6.2.1. DissectorTable.new(tablename, [uiname], [type], [base], [proto])

新建一个 DissectorTable 给你的解析器使用;

  • 参数

    • tablename

      该表的简短名称;

      应使用小写字母、点、下划线(e.g., "ansi_map.tele_id" or "udp.port");

    • uiname (可选)

      在用户界面中显示的表名称;

      默认是 tablename 的值, 但是也可以赋予任何字符串值;

    • type (可选)

      ftypes.UINT8, ftypes.UINT16, ftypes.UINT24, ftypes.UINT32, 或者ftypes.STRING.;

      默认是 ftypes.UINT32

    • base (可选)

      base.NONE, base.DEC, base.HEX, base.OCT, base.DEC_HEX,或者base.HEX_DEC

      默认是 base.DEC

    • proto (可选)

      使用这个dissector tableProto 对象;

  • 返回值

    • 新创建的dissector table

11.6.2.2. DissectorTable.list()

获取一个包含所有 DissectorTable 名称的Lua数组表 - 即, 你可以在 DissectorTable.get() 的第一个参数中使用得到的名称字符串;

ps:该操作开销巨大,应仅在错误检测时使用;

  • 返回值

    • 包含已注册 DissectorTable 名称的数组表;

11.6.2.3. DissectorTable.heuristic_list()

获取一个包含所有启发式解析器名称的Lua数组表 - 即, 你可以在 Proto:register_heuristic() 的第一个参数中使用得到的名称字符串;

ps:该操作开销巨大,应仅在错误检测时使用;

  • 返回值

    • 包含已注册启发式解析器(heuristic dissector)名称的数组表;

11.6.3.4. Pref.string(label, default, descr)

创建一个字符串型偏好给 Proto.prefs Lua表;

  • 参数

    • label

      该偏好的标签 (偏好设置输入的右值文本) ;

    • default

      要设置的偏好在Lua中的默认值;

    • descr

      对于该偏好的描述;

11.6.3.5. Pref.enum(label, default, descr, enum, radio)

创建一个枚举型偏好给 Proto.prefs Lua表;

11.6.3.6. 示例:

    local OUTPUT_OFF        = 0
    local OUTPUT_DEBUG      = 1
    local OUTPUT_INFO       = 2
    local OUTPUT_WARN       = 3
    local OUTPUT_ERROR      = 4
​
    local output_tab = {
            { 1, "Off"              , OUTPUT_OFF },
            { 2, "Debug"            , OUTPUT_DEBUG },
            { 3, "Information"      , OUTPUT_INFO },
            { 4, "Warning"          , OUTPUT_WARN },
            { 5, "Error"            , OUTPUT_ERROR },
    }
​
    -- Create enum preference that shows as Combo Box under
    -- Foo Protocol's preferences
    proto_foo.prefs.outputlevel = Pref.enum(
            "Output Level",                 -- label
            OUTPUT_INFO,                    -- default value
            "Verbosity of log output",      -- description
            output_tab,                     -- enum table
            false                           -- show as combo box
    )
​
    -- Then, we can query the value of the selected preference.
    -- This line prints "Output Level: 3" assuming the selected
    -- output level is _INFO.
    debug( "Output Level: " .. proto_foo.prefs.outputlevel )
  • 参数

    • label

      该偏好的标签 (偏好设置输入的右值文本) ;

    • default

      要设置的偏好在Lua中的默认值;

    • descr

      对于该偏好的描述;

    • enum

      一个 Lua 的枚举表;

    • radio

      Radio button (true) or Combobox (false);

11.6.3.7. Pref.range(label, default, descr, max)

创建一个数值区间型偏好给 Proto.prefs Lua表;

  • 参数

    • label

      该偏好的标签 (偏好设置输入的右值文本) ;

    • default

      要设置的偏好在Lua中的默认值;

    • descr

      对于该偏好的描述;

    • max

      最大值;

11.6.3.8. Pref.statictext(label, descr)

创建一个静态文本字符串偏好给 Proto.prefs Lua表;

  • 参数

    • label

      静态文本;

    • descr

      静态文本描述;

11.6.4. Prefs

该协议的偏好设置表;

11.6.4.1. prefs:__newindex(name, pref)

新建一个偏好;

  • 参数

    • name

      该偏好的缩略名;

    • pref

      一个有效但是还未赋值的 Pref 对象;

  • 可能出现的错误

    • Unknown Pref type

11.6.4.2. prefs:__index(name)

获取一个偏好设置的值;

11.6.4.3. 示例

-- print the value of Foo's preference named "bar"
    debug( "bar = " .. proto_foo.prefs.bar )
  • 参数

    • name

      该偏好的缩略名;

  • 返回值

    • 该偏好的当前值;
  • 可能出现的错误

    • Unknown Pref type

11.6.5. Proto

Wireshark中的一个新协议;

这些协议(Protocols) 有好几种用途, 最为主要的一个就是用来解析某个协议,此外它们也可以作为一个用于注册偏好的仿真(dummy) 而用于其它目的;

11.6.5.1. Proto.new(name, desc)

新建一个 Proto 对象;

  • 参数

    • name

      该协议的名称;

    • desc

      关于该协议的一个较长文本描述 (通常是小写);

  • 返回值

    • 一个新建的 Proto 对象;

11.6.5.2. proto:__call(name, desc)

创建一个Proto 对象;

  • 参数

    • name

      该协议的名称;

    • desc

      关于该协议的一个较长文本描述 (通常是小写);

  • 返回值

    • 一个新建的 Proto 对象;

11.6.5.3. proto:register_heuristic(listname, func)

为该 Proto 协议注册一个给定启发式表名(heuristic list name)的启发式解析器方法( heuristic dissector function );

在之后调用该方法时,传入的 func 需要被给定以下参数:

  1. 一个 Tvb 对象;
  2. 一个 Pinfo 对象;
  3. 一个 TreeItem 对象;

如果有效载荷(payload)适用于该方法,则该方法必须返回 true,否则返回false

该方法应尽可能多地进行验证,以确保有效载荷是为它准备的,然后在该有效载荷是为它准备的情况下才对数据包进行解析(包括设置TreeItem信息等),然后再返回Ture或者False;

从 1.99.1 版本开始,该方法也接受一个 Dissector 对象作为第二个参数, 以允许对一段 function proto.dissector(…) 对象的Lua 代码的重用 。在这种情况下,该 Dissector必须返回一个表示消耗/解析(consumed/parsed)字节数的 Lua 数字: 如果返回0,它将被视为启发式解析的False返回;如果返回一个正数或负数,那么它将被视为启发式的True返回,意味着该数据包正是为这个协议准备的,然后将不再尝试其他启发式解析器;

  • 参数

    • listname

      该函数的启发式列表名称(e.g., "udp" or "infiniband.payload");

    • func

      一个将被调用来进行启发式解析的Lua方法;

11.6.5.4. proto.dissector

模式:仅用于检索与赋值(Mode: Retrieve or assign);

该协议的解析器,一个你定义的方法;

之后调用该方法时,以下参数需要被指定:

  1. 一个 Tvb 对象;
  2. 一个 Pinfo 对象;
  3. 一个 TreeItem 对象;

11.6.5.5. proto.prefs

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

该解析器的偏好设置;

11.6.5.6. proto.prefs_changed

模式:仅用于赋值(Mode: Assign only);

该解析器的偏好更改例行程序( preferences changed routine), 一个由你定义的Lua方法;

11.6.5.7. proto.init

模式:仅用于赋值(Mode: Assign only);

该解析器的初始化例行程序,一个由你定义的Lua方法;

调用 init 方法不需要传入任何参数;

11.6.5.8. proto.name

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

赋予该解析器的名称;

11.6.5.9. proto.description

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

赋予对该解析器的描述;

11.6.5.10. proto.fields

模式:仅用于检索与赋值(Mode: Retrieve or assign);

该解析器的 ProtoField 的Lua 表;

11.6.5.11. proto.experts

模式:仅用于检索与赋值(Mode: Retrieve or assign);

Proto 的专家信息Lua表;

11.6.6. ProtoExpert

一个协议的专家信息域,在要向解析树中添加项时使用;

11.6.6.1. ProtoExpert.new(abbr, text, group, severity)

新建一个 ProtoExpert 对象,用于协议的专家级信息通知;

  • 参数

    • abbr

      Filter name of the expert info field (the string that is used in filters).

    • text

      该专家域的默认文本;

    • group

      专家组(Expert group)类型,可以是: expert.group.CHECKSUM, expert.group.SEQUENCE, expert.group.RESPONSE_CODE, expert.group.REQUEST_CODE, expert.group.UNDECODED, expert.group.REASSEMBLE, expert.group.MALFORMED, expert.group.DEBUG, expert.group.PROTOCOL, expert.group.SECURITY, expert.group.COMMENTS_GROUP, expert.group.DECRYPTION, expert.group.ASSUMPTION or expert.group.DEPRECATED.

    • severity

      专家程度(Expert severity) 类型,可以是: expert.severity.COMMENT, expert.severity.CHAT, expert.severity.NOTE, expert.severity.WARN, or expert.severity.ERROR.

  • 返回值

    • 一个新建的 ProtoExpert 对象;

11.6.6.2. protoexpert:__tostring()

返回一个 ProtoExpert 对象调试信息的字符串;

11.6.7. ProtoField

一个协议字段(Protocol field)(当需要向解析树中添加项时使用);

11.6.7.1. ProtoField.new(name, abbr, type, [valuestring], [base], [mask], [descr])

新建一个ProtoField 对象,给一个协议字段使用;

  • 参数

    • name

      该字段的实际名称 (将出现在解析树中的字符串);

    • abbr

      该字段的过滤名称 (在过滤器中使用的字符串);

    • type

      字段类型(Field Type),可以是: ftypes.BOOLEAN, ftypes.CHAR, ftypes.UINT8, ftypes.UINT16, ftypes.UINT24, ftypes.UINT32, ftypes.UINT64, ftypes.INT8, ftypes.INT16, ftypes.INT24, ftypes.INT32, ftypes.INT64, ftypes.FLOAT, ftypes.DOUBLE , ftypes.ABSOLUTE_TIME, ftypes.RELATIVE_TIME, ftypes.STRING, ftypes.STRINGZ, ftypes.UINT_STRING, ftypes.ETHER, ftypes.BYTES, ftypes.UINT_BYTES, ftypes.IPv4, ftypes.IPv6, ftypes.IPXNET, ftypes.FRAMENUM, ftypes.PCRE, ftypes.GUID, ftypes.OID, ftypes.PROTOCOL, ftypes.REL_OID, ftypes.SYSTEM_ID, ftypes.EUI64 or ftypes.NONE.

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值相对应的文本的表;如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;如果字段类型是ftypes.FRAMENUM,则是frametype.NONEframetype.REQUESTframetype.RESPONSEframetype.ACKframetype.DUP_ACK中的一个。

    • base (可选)

      表示方式,可以是: base.NONE, base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING.

    • mask (可选)

      该字段的的位掩码;

    • descr (可选)

      对该字段的描述;

  • 返回值

    • 一个新建的 ProtoField 对象;

11.6.7.2. ProtoField.char(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个8比特的 ASCII 字符 ProtoField

  • 参数

    • abbr

      该字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:`base.NONE, base.HEX, base.OCT or base.RANGE_STRING.

    • valuestring (可选)

      一个包含与数值相对应的文本的表格,如果 basebase.RANGE_STRING,则是一个包含与数值相对应的范围字符串值的表格({min, max, "string"});

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.3. ProtoField.uint8(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个8比特的无符号整型 ProtoField(即, a byte);

  • 参数

    • abbr

      该字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是: base.DEC, base.HEX or base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING.

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.4. ProtoField.uint16(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个16比特的无符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.5. ProtoField.uint24(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个24比特的无符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.6. ProtoField.uint32(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个32比特的无符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.7. ProtoField.uint64(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个64比特的无符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.8. ProtoField.int8(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个8比特的带符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.9. ProtoField.int16(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个16比特的带符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.10. ProtoField.int24(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个24比特的带符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.11. ProtoField.int32(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个32比特的带符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.12. ProtoField.int64(abbr, [name], [base], [valuestring], [mask], [desc])

创建一个64比特的带符号整型 ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是:base.DEC, base.UNIT_STRING, or base.RANGE_STRING

    • valuestring (可选)

      如果 basebase.RANGE_STRING,则是一个包含与数值对应的文本的表,或者是一个包含与数值对应的范围字符串的表({min, max, "string"}),如果 basebase.UNIT_STRING,则是一个包含数值的单位名称的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.13. ProtoField.framenum(abbr, [name], [base], [frametype], [mask], [desc])

为帧号创建一个 ProtoField(用于帧之间的超链接);

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      对于 framenum 来说只能是 base.NONE;

    • frametype (可选)

      可以是: frametype.NONE, frametype.REQUEST, frametype.RESPONSE, frametype.ACK or frametype.DUP_ACK

    • mask (可选)

      该字段的整型掩码,对于 framenum 只能是0;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.14. ProtoField.bool(abbr, [name], [display], [valuestring], [mask], [desc])

创建一个布尔型的True/False 的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      父位域的宽度是多少(NULL-value使用base.NONE);

    • valuestring (可选)

      一个包含与数值对应的文本的表;

    • mask (可选)

      该字段的整型掩码;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.15. ProtoField.absolute_time(abbr, [name], [base], [desc])

创建一个 Time_t 结构值的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • base (可选)

      可以是: base.LOCAL, base.UTC or base.DOY_UTC

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.16. ProtoField.relative_time(abbr, [name], [desc])

创建一个 Time_t 结构值的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.17. ProtoField.float(abbr, [name], [valuestring], [desc])

创建一个浮点数型的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • valuestring (可选)

      一个包含与数值对应的文本的表;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.18. ProtoField.double(abbr, [name], [valuestring], [desc])

创建一个双精度浮点数型的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • valuestring (可选)

      一个包含与数值对应的文本的表;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.19. ProtoField.string(abbr, [name], [display], [desc])

创建一个字符串值型的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      可以是:base.ASCIIbase.UNICODE

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.20. ProtoField.stringz(abbr, [name], [display], [desc])

创建一个以零结尾的字符串值的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      可以是:base.ASCIIbase.UNICODE

    • valuestring (可选)

      一个包含与数值对应的文本的表;

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.21. ProtoField.bytes(abbr, [name], [display], [desc])

为任意数量的字节创建一个ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      可以是: base.NONE, base.DOT, base.DASH, base.COLON or base.SPACE

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.22. ProtoField.ubytes(abbr, [name], [display], [desc])

为任意数量的无符号字节创建一个ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      可以是: base.NONE, base.DOT, base.DASH, base.COLON or base.SPACE

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.23. ProtoField.none(abbr, [name], [desc])

创建一个无结构类型的ProtoField;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • display (可选)

      可以是: base.NONE, base.DOT, base.DASH, base.COLON or base.SPACE

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.24. ProtoField.ipv4(abbr, [name], [desc])

创建一个 IPv4地址的 ProtoField (4字节);

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.25. ProtoField.ipv6(abbr, [name], [desc])

创建一个 IPv6地址的 ProtoField (16字节);

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.26. ProtoField.ether(abbr, [name], [desc])

创建一个以太网地址的 ProtoField (6字节);

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.27. ProtoField.guid(abbr, [name], [desc])

为一个全球唯一识别码(Globally Unique IDentifier,GUID)创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.28. ProtoField.oid(abbr, [name], [desc])

为一个 ASN.1 Organizational IDentified (OID) 创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.29. ProtoField.protocol(abbr, [name], [desc])

为某个子协议创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.30. ProtoField.rel_oid(abbr, [name], [desc])

为一个 ASN.1 Relative-OID 创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.31. ProtoField.systemid(abbr, [name], [desc])

为一个 OSI System ID 创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.32. ProtoField.eui64(abbr, [name], [desc])

为一个 EUI64 创建一个 ProtoField ;

  • 参数

    • abbr

      字段的缩略名(在过滤器中使用的字符串);

    • name(可选)

      该字段的实际名称 (将出现在解析树中的字符串);

    • desc (可选)

      对该字段的描述;

  • 返回值

    • 一个 ProtoField 对象,将被添加到设置为 Proto.fields 属性的表中;

11.6.7.33. protofield:__tostring()

返回一个 protofield 的字符串信息 (为调试使用);

11.6.8. Global Functions

11.6.8.1. register_postdissector(proto, [allfields])

让一个 Proto 协议 (带解析方法) 成为一个后置解析器(post-dissector).;

它将在每一个数据帧都被解析后调用;

  • 参数

    • proto

      要用作后置解析器的协议;

    • allfields(可选)

      是否生成所有字段;

      ps: 这很影响性能 (默认false)

11.6.8.2. dissect_tcp_pdus(tvb, tree, min_header_size, get_len_func, dissect_func, [desegment])

使TCP层为TCP数据段(segment)中的每个PDU调用给定的 Lua方法, 其长度由给定的 get_len_func 方法返回;

这个方法对于基于TCP的协议很有用 ,这些协议要么是固定长度的, 要么有一个最小部分(minimum portion),里面编码了一个表示长度的字段,可以用来识别协议的全长;

对于这样的协议,他们的协议解析器方法可以调用 dissect_tcp_pdus() 方法来更加方便的解析他们协议的消息 (即, 他们的协议数据单元 (PDU));

这个方法不能用于PDU长度没有被固定的最小部分限定的协议,例如HTTP或Telnet;

  • 参数

    • tvb

      解析PDU的缓存区 ;

    • tree

      解析PDU的缓存区 ;

    • min_header_size

      PDU中定长部分的字节数(The number of bytes in the fixed-length part of the PDU);

    • get_len_func

      一个将被每个 PDU 调用来决定整个 PDU 长度的 Lua 方法;

      被调用的方法将被赋予:

      (1) 整个 TvbTvb 对象(可能被重新组装)

      (2) Pinfo 对象

      (3) 一个表偏移量的数字,是该 PDU 第一个字节的索引(即,它的第一个头部字节)

    • dissect_func

      一个将被每个 PDU 调用来解析 PDU 的 Lua 方法;

      被调用的方法将被赋予:

      (1) PDU 的 Tvb 对象(可能被重新组装)

      (2) Pinfo 对象

      (3) TreeItem 对象

      这个Lua函数必须返回一个读取/处理的字节数的Lua数字,通常是Tvb:len();

    • desegment (可选)

      是否按照 TCP 数据段的边界将 PDUs 重新组装起来(默认为true);