wireshark lua string:byte()错误

时间:2016-02-05 10:07:23

标签: lua wireshark

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

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

调试时,tvb看起来相同

enter image description here

偏移 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,这是一个错误吗?

2 个答案:

答案 0 :(得分:4)

我对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])函数来获取值。 e.g。

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,可以做你想做的事情,但我找不到任何好的参考资料。

答案 1 :(得分:3)

假设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())