如何在Wireshark Lua解析器中使用add_packet_字段?

如何在Wireshark Lua解析器中使用add_packet_字段?,lua,wireshark,wireshark-dissector,Lua,Wireshark,Wireshark Dissector,我正在为我们在Lua中的定制协议编写一个剖析器,这是一个绊脚石。虽然我有基本的字段提取工作,但我们的许多字段都有与之相关的比例因子。除了原始提取值之外,我还想显示缩放值 在我看来,tree\u item:add\u packet\u field是专门为此而设计的。除了我不能让它工作 我发现他帮了我很大的忙,并按照他的模式把我的解剖器分成不同的文件,等等。这些都很有效 给定一个数据包类型“my_packet”,我有一个14位有符号整数“AOA”,可以很好地提取出来 local pref=“我的数据

我正在为我们在Lua中的定制协议编写一个剖析器,这是一个绊脚石。虽然我有基本的字段提取工作,但我们的许多字段都有与之相关的比例因子。除了原始提取值之外,我还想显示缩放值

在我看来,
tree\u item:add\u packet\u field
是专门为此而设计的。除了我不能让它工作

我发现他帮了我很大的忙,并按照他的模式把我的解剖器分成不同的文件,等等。这些都很有效

给定一个数据包类型“my_packet”,我有一个14位有符号整数“AOA”,可以很好地提取出来

local pref=“我的数据包”
局部m={
aoa=ProtoField.new(“aoa”,pref...aoa”,ftypes.INT16,nil,base.DEC,0x3FFF,“到达角测量”),
}
本地选项=2
本地aoa_比例=0.1
函数m.parse(树参数,缓冲区)
如果选项==1,则
--基本字段提取。这个很好用。该字段将被提取并添加到树中
树参数:添加(m.aoa,缓冲区)
elseif选项==2,则
--这将解析并运行。项目被解码并添加到树中,
--但“v”的值始终为零
本地c,v=树参数:添加数据包字段(m.aoa,buffer,ENC\u BIG\u ENDIAN)
--这会导致一个错误,在“nil”上进行算术运算
c:追加文本(((scaled=“…tostring(v*aoa_scale)…))
结束
结束
(我使用
ProtoField.new
而不是任何类型特定的变体,以确保声明我的字段的一致性)

for
add\u packet\u字段
表示编码参数是必需的

源代码中有一段代码说应该为网络字节顺序数据指定ENC_BIG_ENDIAN(我的是)。我知道该部分用于
proto\u tree\u add\u item
,但我对代码进行了深入的跟踪,发现
add\u packet\u字段
最终将编码传递给
proto\u tree\u add\u item

基本上,在这一点上,我迷路了。从2014年开始,我确实发现建议对
add_packet_field
提供有限的支持,但现在肯定支持像整数值这样的基本功能了吗

另外,我知道如何声明
字段
并在
树之后提取值: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).
从源代码来看,只支持某些
FT\uu
类型,即:

  • FT\u字节
  • FT\u UINT\u字节
  • FT\u OID
  • FT\u REL\u OID
  • FT\u系统ID
  • FT\u绝对时间
  • FT\u相对时间
其他类型的
FT\u
都不受支持,包括您感兴趣的
FT\u UINT16
,也就是说,任何其他类型的操作都需要以老式的方式完成


如果您希望实现此功能,我建议您在上提交Wireshark增强bug请求。

我不确定传递给m.parse的是什么,但如果您指定缓冲区范围,会有什么不同吗?例如:local c,v=tree_arg:add_packet_field(m.aoa,buffer(0,2),ENC_BIG_ENDIAN)如果不是,您正在使用哪个版本的Wireshark(从帮助->关于Wireshark,单击“复制到剪贴板”并粘贴该信息)?
m.parse
从协议解析器中调用;它被传递当前树项和tvb范围。是的,它是用包含字段的最小范围调用的,如
缓冲区(0,2)
。不,这对我不起作用。事实上,这可能已经在