【发布时间】:2020-07-09 05:49:20
【问题描述】:
我在为我们在 Lua 中的自定义协议编写解析器时磕磕绊绊。虽然我有基本的字段提取工作,但我们的许多字段都有与之相关的比例因子。除了原始提取值之外,我还想展示缩放值。
在我看来tree_item:add_packet_field 是为此目的量身定做的。除非我不能让它工作。
我发现 Mika's blog 非常有帮助,并按照他的模式将我的解剖器分成不同的文件等。这一切都有效。
给定一个数据包类型“my_packet”,我有一个 14 位有符号整数“AOA”,我可以很好地提取它
local pref = "my_packet"
local m = {
aoa = ProtoField.new("AOA", pref .. ".aoa", ftypes.INT16, nil, base.DEC, 0x3FFF, "angle of arrival measurement"),
}
local option=2
local aoa_scale = 0.1
function m.parse(tree_arg, buffer)
if option == 1 then
-- basic field extraction. This works just fine. The field is extracted and added to the tree
tree_arg:add(m.aoa, buffer)
elseif option == 2 then
-- This parses and runs. The item is decoded and added to the tree,
-- but the value of 'v' is always nil
local c,v = tree_arg:add_packet_field(m.aoa, buffer, ENC_BIG_ENDIAN)
-- this results in an error, doing arithmetic on 'nil'
c:append_text(" (scaled= " .. tostring(v*aoa_scale) .. ")")
end
end
(我使用ProtoField.new 而不是任何特定类型的变体,以保持声明我的字段的一致性)
add_packet_field 的 documentation 表示编码参数是强制性的。
源代码中有一个README 表示应该为网络字节顺序数据指定 ENC_BIG_ENDIAN(我的是)。我知道该部分是针对proto_tree_add_item 的,但我跟踪代码足够远,看到add_packet_field 最终将编码传递给proto_tree_add_item。
基本上,在这一点上,我迷路了。我确实从 2014 年发现 this post 建议对 add_packet_field 的支持有限,但现在肯定支持像整数值这样基本的东西吗?
另外,我确实知道如何声明Field 并在tree:add 进行解析后提取值;最坏的情况我会退回到那个,但是肯定有更方便的方法来访问刚刚解析的添加到树的值?
Wireshark 版本
3.2.4 (v3.2.4-0-g893b5a5e1e3e)
Compiled (64-bit) with Qt 5.12.8, with WinPcap SDK (WpdPack) 4.1.2, with GLib
2.52.3, with zlib 1.2.11, with SMI 0.4.8, with c-ares 1.15.0, with Lua 5.2.4,
with GnuTLS 3.6.3 and PKCS #11 support, with Gcrypt 1.8.3, with MIT Kerberos,
with MaxMind DB resolver, with nghttp2 1.39.2, with brotli, with LZ4, with
Zstandard, with Snappy, with libxml2 2.9.9, with QtMultimedia, with automatic
updates using WinSparkle 0.5.7, with AirPcap, with SpeexDSP (using bundled
resampler), with SBC, with SpanDSP, with bcg729.
Running on 64-bit Windows 10 (1803), build 17134, with Intel(R) Xeon(R) CPU
E3-1505M v6 @ 3.00GHz (with SSE4.2), with 32558 MB of physical memory, with
locale English_United States.1252, with light display mode, without HiDPI, with
Npcap version 0.9991, based on libpcap version 1.9.1, with GnuTLS 3.6.3, with
Gcrypt 1.8.3, with brotli 1.0.2, without AirPcap, binary plugins supported (19
loaded).
Built using Microsoft Visual Studio 2019 (VC++ 14.25, build 28614).
【问题讨论】:
-
我不确定传递给 m.parse 的是什么,但是如果您指定缓冲区范围,它有什么不同吗?例如:local c,v = tree_arg:add_packet_field(m.aoa, buffer(0, 2), ENC_BIG_ENDIAN) 如果不是,您使用的是哪个版本的 Wireshark(来自Help->About Wireshark,点击“复制到剪贴板”并粘贴该信息)?
-
m.parse从协议解析器中调用;它传递了当前树项和 tvb 范围。是的,它以包含该字段的最小范围被调用,例如buffer(0,2)。不,这对我不起作用。
标签: lua wireshark wireshark-dissector