编写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,这是一个错误吗?
答案 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())