【问题标题】:wireshark lua string:byte() errorwireshark lua 字符串:字节()错误
【发布时间】:2017-07-04 20:44:49
【问题描述】:

我在编写 lua 解析器时遇到了字符串问题。我的数据包看起来像:

0000   00 00 00 69 00 10 00 01 00 00 00 ed 00 00 00 0c
0010   bf a6 5f ...

调试时tvb看起来一样

偏移0x10处的字节是0xbf,但在我的解析器函数中我得到了不同的结果,这是我的代码:

local str = buf(0x10):string()
local x = string.byte(str, 1)

变量x应该是0xbf,但它是0xef,其他一些偏移量也是0xef:

local str = buf(0x11):string()
local x = string.byte(str, 1) -- also get 0xef, should be 0xa6

local str = buf(11):string()
local x = string.byte(str, 1) -- also get 0xef, should be 0xed

似乎大值总是会得到 0xef 作为结果,比如 0xa6/0xbf/0xed...

小值是正确的,比如 0x69/0x5f/0x0c...

我正在使用最新的wireshark 2.0,这是一个错误吗?

【问题讨论】:

  • 什么是:string()
  • 对不起,我解释得不好,帖子更新了。 :string() 是wireshark内置函数,可以将tvb转换为字符串
  • 尝试检查值:buf(0x10), buf(0x10):string()

标签: lua wireshark


【解决方案1】:

我对 Wireshark 知之甚少,但我很清楚发生了什么。

您正在使用 Wireshark 的 tvbrange:string([encoding]) 函数。我在 Wireshark 网站上找到的文档说默认编码是 ENC_ASCII。 0x80-0xFF 范围内的字节(您已报告问题)不是有效的 ASCII。

Wireshark 可能正在做的是将这些转换为 U+FFFD,即 Unicode 的“替换字符”。这是在 Unicode 字符串中表示未知字符的标准做法。

那么,Wireshark 可能在返回 Lua 时将此字符串编码为 UTF-8。 U+FFFD的UTF-8编码的第一个字节是0xEF,所以你看到的就是这个。

如果您想从 TVB 获取原始字节值,可以尝试使用 tvbrange:bytes([encoding]) 函数来获取值。例如

local bytes = buf(0x10):bytes()
local x = bytes:get_index(0) -- maybe 1, I'm not sure if it would be 0 or 1 indexed

您还可以将一些编码传递给tvbrange:string,以实现您想要的,但我找不到任何好的参考。

【讨论】:

    【解决方案2】:

    假设buf 指的是传递给你的解剖例程的参数,它的类型是Tvb。当您调用它时(如buf(0x10)),您将创建一个TvbRange 实例。它们都记录在这里: https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Tvb.html

    tehtmi 指出了您获得错误结果的原因,tvbrange:string() 使用 ASCII 编码返回一个字符串(因为省略了编码参数)。

    获取原始字节缓冲区(而不是将其转换为 ASCII 或 UTF-8 字符串)的方法是:

    local x = buf:raw(0x10, 1)
    

    (使用偏移量 16 和长度 1。)

    如果您考虑过直接使用buf(0x10):raw(),请注意,出于某种原因,这将返回支持此 Tvb 的完整数据源。也许是一个错误或功能......解决方法:

    local bytes = buf(0x10)
    local x = bytes:raw(bytes:offset(), bytes:len())
    

    【讨论】:

    • 谢谢,raw 函数应该让事情变得更容易!我正在查看 wiki 上的文档 wiki.wireshark.org/LuaAPI/Tvb,其中似乎没有提到 raw
    • @legoscia Wireshark 的 Lua API 参考手册总是比 wiki 更准确,因为它是直接从 Wireshark C 代码中的文档生成的。另见wiki.wireshark.org/LuaAPI上方的注释
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2019-03-11
    • 1970-01-01
    • 2011-05-05
    • 2012-04-15
    相关资源
    最近更新 更多