[Wireshark] 11.8. 处理数据包中数据的方法

1,796 阅读11分钟

11.8.1. ByteArray

11.8.1.1. ByteArray.new([hexbytes], [separator])

新建一个 ByteArray 对象;

从1.11.3版本开始,如果第二个参数是一个布尔值 "true",那么第一个参数就被当作一个原始的Lua字节字符串来使用,而不是一个十六进制的字符串;

11.8.1.2. 示例

    local empty = ByteArray.new()
    local b1 = ByteArray.new("a1 b2 c3 d4")
    local b2 = ByteArray.new("112233")
  • 参数

    • hexbytes (可选)

      一个由十六进制字节组成的字符串,如 "00 B1 A2 "或 "1a2b3c4d";

    • separator (可选)

      十六进制字节/字之间的字符串分隔符(默认=" "),如果使用布尔值true,则第一个参数被视为原始二进制数据;

  • 返回值

    • 一个新的 ByteArray 对象;

11.8.1.3. bytearray:__concat(first, second)

连接两个 ByteArray 对象;

  • 参数

    • first

      第一个数组;

    • second

      第二个数组;

  • 返回值

    • 一个新的,连接后的 ByteArray

11.8.1.4. bytearray:__eq(first, second)

比较两个 ByteArray 的值;

  • 参数

    • first

      第一个数组;

    • second

      第二个数组;

11.8.1.5. bytearray:prepend(prepended)

在该 ByteArray 的前部添加一个 ByteArray

  • 参数

    • prepended

      需要被添加到前面的 ByteArray

11.8.1.6. bytearray:append(appended)

向该 ByteArray 添加一个 ByteArray

  • 参数

    • appended

      需要添加的 ByteArray ;

11.8.1.7. bytearray:set_size(size)

设置ByteArray的大小,如果比之前的小,则截断它,如果比之前的大,则用零填充它;

  • 参数

    • size

      该数组的新大小;

  • 可能出现的错误

    • ByteArray size must be non-negative

11.8.1.8. bytearray:set_index(index, value)

设置一个ByteArray 的索引值;

  • 参数

    • index

      要设置的字节的位置;

    • value

      要设置的字符值[0-255];

11.8.1.9. bytearray:get_index(index)

获取一个ByteArray 的索引值;

  • 参数

    • index

      要获取的字节的位置;

  • 返回值

    • 该字节的[0-255]的值;

11.8.1.10. bytearray:len()

获取一个 ByteArray 的长度;

  • 返回值

    • ByteArray 的长度;

11.8.1.11. bytearray:subset(offset, length)

获取 ByteArray 的一段,生成一个新的 ByteArray ;

  • 参数

    • offset

      起始字节的位置 (索引从0开始).

    • length

      要获取的长度;

  • 返回值

    • 一个符合要求的新 ByteArray ;

11.8.1.12. bytearray:base64_decode()

获取一个 Base64 解码的 ByteArray

  • 返回值

    • 创建的 ByteArray ;

11.8.1.13. bytearray:raw([offset], [length])

以 Lua 字符串的形式获取到一个 ByteArray 中的二进制字节;

  • 参数

    • offset (可选)

      The position of the first byte (default=0/first).

    • length (可选)

      The length of the segment to get (default=all).

  • 返回值

    • 该 ByteArray 中的二进制字节的Lua字符串;

11.8.1.14. bytearray:tohex([lowercase], [separator])

给定分隔符,以十六进制 ASCII 码(hex-ascii)的形式获取到 ByteArray 中的字节的Lua 字符串;

  • 参数

    • lowercase (可选)

      True 则使用小写十六进制字符 (默认为 False).

    • separator (可选)

      需要插入十六进制字节之间的字符串分隔符 (默认为nil).

  • 返回值

    • 一个 ByteArray 的hex-ascii字符串表示;

11.8.1.15. bytearray:__tostring()

获得一个包含 ByteArray 中的字节的Lua字符串,以便在显示过滤器中使用。(e.g. "01FE456789AB").

  • 返回值

    • 一个 ByteArray 的hex-ascii字符串表示;

11.8.1.16. bytearray:tvb(name)

从一个 ByteArray 创建一个新的 Tvb,该 Tvb 将被添加到当前帧中;

11.8.1.17. 示例

    function proto_foo.dissector(buf, pinfo, tree)
            -- Create a new tab named "My Tvb" and add some data to it
            local b = ByteArray.new("11223344")
            local tvb = ByteArray.tvb(b, "My Tvb")
​
            -- Create a tree item that, when clicked, automatically shows the tab we just created
            tree:add( tvb(1,2), "Foo" )
    end
  • 参数

    • name

      赋予新数据源的名称;

  • 返回值

    • 一个新建的 Tvb

11.8.2. Tvb

一个 Tvb 代表了数据包的缓冲区。它被作为参数传递给监听器(listener)和解析器(dissector),可以用来从数据包的数据中提取信息(通过TvbRange)。

要创建一个 TvbRange,必须以 offsetlength 作为可选的参数来调用 Tvboffset默认为0,length默认为tvb:capted_len()

警告
Tvbs 只能被当前的监听器或解析器调用,并且在监听器或解析器返回时被销毁,所以一旦方法返回,对它们的引用就无法使用;

11.8.2.1. tvb:__tostring()

将 Tvb 的字节转化为字符串;

这主要是为了调试的目的,因为如果字符串太长,就会被截断;

  • 返回值

    • 字符串;

11.8.2.2. tvb:reported_len()

获取一个Tvb的报告长度(网络上的长度);

  • 返回值

    • Tvb 的报告长度;

11.8.2.3. tvb:captured_len()

获取 Tvb 的捕获长度(捕获过程中保存的数量)。

  • 返回值

    • Tvb 的捕获长度;

11.8.2.4. tvb:len()

获取一个 Tvb 的捕获长度(在捕获过程中保存的数量)。与capture_len相同,只是为了向后兼容而保留。

  • 返回值

    • Tvb 的捕获长度;

11.8.2.5. tvb:reported_length_remaining()

获得报告的(不是捕获的)到 Tvb 结尾的数据包的长度,如果偏移量超过 Tvb 结尾,则为0。

  • 返回值

    • Tvb 的捕获长度;

11.8.2.6. tvb:bytes([offset], [length])

从一个 Tvb 获得一个 ByteArray

  • 参数

    • offset (可选)

      从 Tvb 起始处的偏移量(以8-bit为单位),默认为0;

    • length (可选)

      范围的长度(以8-bit为单位),默认为到 Tvb 结束为止;

  • 返回值

    • 一个 ByteArray 对象或为nil

11.8.2.7. tvb:offset()

返回子 Tvb 的原始偏移量(从源 Tvb 的开始);

  • 返回值

    • Tvb 的原始偏移量;

11.8.2.8. tvb:__call()

等同于 tvb:range(…)

11.8.2.9. tvb:range([offset], [length])

从这个 Tvb 中创建一个 TvbRange

  • 参数

    • offset (可选)

      从 Tvb 起始处的偏移量(以8-bit为单位),默认为0;

    • length (可选)

      范围的长度(以8-bit为单位),默认为-1,指定Tvb中的剩余字节;

  • 返回值

    • 创建的 TvbRange

11.8.2.10. tvb:raw([offset], [length])

获取一个 Tvb 中二进制字节的Lua字符串;

  • 参数

    • offset (可选)

      第一个字节的位置,默认为0,或者说第一个字节;

    • length (可选)

      要获取的该段的长度,默认为 -1, 或者说 Tvb 中剩下的字节;

  • 返回值

    • Tvb 中二进制字节的 Lua 字符串;

11.8.2.11. tvb:__eq()

检测两个 Tvb 是否相等;

11.8.3. TvbRange

TvbRange 表示一个 Tvb 的可使用范围,用于从生成它的 Tvb 中提取数据;

TvbRange 是通过调用一个 Tvb (例如 'tvb(offset,length)') 来创建的。如果 TvbRange 的跨度超出了 Tvb 的范围,创建时将导致运行时错误。

11.8.3.1. tvbrange:tvb()

从一个 TvbRange 创建一个新的 Tvb

11.8.3.2. tvbrange:uint()

TvbRange 中获取一个大端序(Big Endian)(网络顺序)无符号整数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个无符号整数;

11.8.3.3. tvbrange:le_uint()

TvbRange 中获取一个小端序(Little Endian)(网络顺序)无符号整数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个无符号整数;

11.8.3.4. tvbrange:uint64()

TvbRange 中获取一个大端序(Big Endian)(网络顺序)无符号64位整数,作为一个 UINT64 对象;

范围必须是1-8个8-bit长;

  • 返回值

    • 一个 UINT64 对象;

11.8.3.5. tvbrange:le_uint64()

TvbRange 中获取一个小端序(Little Endian)(网络顺序)无符号64位整数,作为一个 UINT64 对象;

范围必须是1-8个8-bit长;

  • 返回值

    • 一个 UINT64 对象;

11.8.3.6. tvbrange:int()

TvbRange 中获取一个大端序(Big Endian)(网络顺序)带符号整数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个带符号整数;

11.8.3.7. tvbrange:le_int()

TvbRange 中获取一个小端序(Little Endian)(网络顺序)带符号整数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个带符号整数;

11.8.3.8. tvbrange:int64()

TvbRange 中获取一个大端序(Big Endian)(网络顺序)带符号64位整数,作为一个 INT64 对象;

范围必须是1-8个8-bit长;

  • 返回值

    • 一个 Int64 对象;

11.8.3.9. tvbrange:le_int64()

TvbRange 中获取一个小端序(Little Endian)(网络顺序)带符号64位整数,作为一个 INT64 对象;

范围必须是1-8个8-bit长;

  • 返回值

    • 一个 Int64 对象;

11.8.3.10. tvbrange:float()

TvbRange 中获取一个大端序(Big Endian)(网络顺序)浮点数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个浮点数;

11.8.3.11. tvbrange:le_float()

TvbRange 中获取一个小端序(Little Endian)(网络顺序)浮点数,范围必须是1-4个8-bit长;

  • 返回值

    • 一个浮点数;

11.8.3.12. tvbrange:ipv4()

TvbRange 中获取一个 IPv4 地址,作为一个Address 对象;

  • 返回值

    • 一个 IPv4 Address 对象;

11.8.3.13. tvbrange:le_ipv4()

TvbRange 中获取一个小端序(Little Endian)(网络顺序) IPv4 地址,作为一个Address 对象;

  • 返回值

    • 一个 IPv4 Address 对象;

11.8.3.14. tvbrange:ipv6()

TvbRange 中获取一个 IPv6 地址,作为一个Address 对象;

  • 返回值

    • 一个 IPv6 Address 对象;

11.8.3.15. tvbrange:ether()

TvbRange 中获取一个 Ethernet 地址,作为一个Address 对象;

  • 返回值

    • 一个 以太网 Address 对象;
  • 可能出现的错误

    • The range must be 6 bytes long

11.8.3.16. tvbrange:nstime([encoding])

TvbRange 获取一个 time_t 结构,作为一个 NSTime 对象;

  • 参数

    • encoding (可选)

      一个可选的用来编码的 ENC_* 值;

  • 返回值

    • NSTime 对象以及用到的字节数,当失败时为nil;
  • 可能出现的错误

    • The range must be 4 or 8 bytes long

11.8.3.17. tvbrange:le_nstime()

TvbRange 获取一个 time_t 结构,作为一个 NSTime 对象;

  • 返回值

    • NSTime 对象;
  • 可能出现的错误

    • The range must be 4 or 8 bytes long

11.8.3.18. tvbrange:string([encoding])

TvbRange 获取一个字符串;

  • 参数

    • encoding (可选)

      用来编码的方式,默认是 ENC_ASCII

  • 返回值

    • 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");

11.8.3.19. tvbrange:ustring()

从一个 TvbRange 中获取一个大端序(网络顺序)的 UTF-16 编码的字符串。

  • 返回值

    • 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");

11.8.3.20. tvbrange:le_ustring()

从一个 TvbRange 中获取一个小端序(网络顺序)的 UTF-16 编码的字符串;

  • 返回值

    • 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");

11.8.3.21. tvbrange:stringz([encoding])

从一个 TvbRange 中获取一个零结尾的字符串。

  • 参数

    • encoding (可选)

      用来编码的方式,默认是 ENC_ASCII

  • 返回值

    • 包含 TvbRange 的所有字节的字符串,直到遇到第一个0结束;

11.8.3.22. tvbrange:strsize([encoding])

从一个 TvbRange 中查找一个以0为结尾的字符串的大小,字符串的大小也包括结尾的0;

  • 参数

    • encoding (可选)

      用来编码的方式,默认是 ENC_ASCII

  • 返回值

    • 该以0结尾的字符串的长度;

11.8.3.23. tvbrange:ustringz()

从一个 TvbRange 中获取一个大端序(网络顺序)的 UTF-16 编码的以0结尾的字符串;

  • 返回值

    • 两个返回值:该以0结尾的字符串及其长度;

11.8.3.24. tvbrange:le_ustringz()

从一个 TvbRange 中获取一个小端序(网络顺序)的 UTF-16 编码的以0结尾的字符串;

  • 返回值

    • 两个返回值:该以0结尾的字符串及其长度;

11.8.3.25. tvbrange:bytes([encoding])

从一个 TvbRange 中获取一个 ByteArray

从1.11.4开始,这个函数还需要一个可选的编码参数,可以设置为 ENC_STR_HEX,将 TvbRange 中的十六进制字符串解码为返回的 ByteArray ;

编码可以使用一个或多个分隔符编码,例如 ENC_SEP_COLON,以允许在每一对十六进制字符之间出现分隔符,该编码可以是按位或(bitwise-or'ed) ;

现在,返回值也会返回所使用的字节数来作为第二个返回值;

在失败或出错时,两个返回值都会返回nil;

[Note]注意
该十六进制字符串的编码方式也需要设置, 比如 ENC_ASCIIENC_UTF_8, 以及 ENC_STR_HEX.
  • 参数

    • encoding (可选)

      一个可选的用来编码的 ENC_* 值;

  • 返回值

    • ByteArray 对象或者是nil, 以及使用到的字节数或者是nil

11.8.3.26. tvbrange:bitfield([position], [length])

TvbRange 中获取一个位域;

  • 参数

    • position (可选)

      TvbRange 开始的位的偏移量,默认为0;

    • length (可选)

      该位域的长度,默认为1;

  • 返回值

    • 该位域;

11.8.3.27. tvbrange:range([offset], [length])

从当前 TvbRange 创建一个子-TvbRange ;

  • 参数

    • offset (可选)

      TvbRange 开始的位的偏移量(以8bit计),默认为0;

    • length (可选)

      该位域的长度(以8bit计),默认至该 TvbRange 结束;

  • 返回值

    • 该子-TvbRange

11.8.3.28. tvbrange:uncompress(name)

从一个 TvbRange 中获取一个未经压缩的 TvbRange

  • 参数

    • name

      赋予新数据源的名称;

  • 返回值

    TvbRange

11.8.3.29. tvbrange:len()

获取一个 TvbRange 的长度;

11.8.3.30. tvbrange:offset()

获取一个 TvbRange 中的偏移量;

11.8.3.31. tvbrange:raw([offset], [length])

获取一个 TvbRange 中二进制字节的Lua字符串;

  • 参数

    • offset (可选)

      range 中第一个字节的位置,默认为0,或者说第一个字节;

    • length (可选)

      要获取的该段的长度,默认为 -1, 或者说 Tvb 中剩下的字节;

  • 返回值

    • TvbRange 中二进制字节的 Lua 字符串;

11.8.3.32. tvbrange:__eq()

检测两个 TvbRange 的内容是否相等;

11.8.3.33. tvbrange:__tostring()

TvbRange 转换为一个字符串,字符串可以被截断,所以这主要用于调试或希望截断的情况,例如 "67:89:AB:...";

  • 返回值

    • 被截断为24个字节的 TvbRange 的Lua十六进制字符串;