我是编码的新手,' c' Wireshark解剖器,所以我有一个非常基本的问题,关于解码具有可变长度的字段的方法,这意味着在某些数据包中它可以是1字节,而在其他数据包中它可以是8字节。
是否有处理此问题的模式?最好的方法是什么?例子真棒!
感谢。
答案 0 :(得分:2)
指定将项目添加到树时的长度。例如,在最常见的情况下,您可以使用proto_tree_add_item()
中声明的
WS_DLL_PUBLIC proto_item *
proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
const gint start, gint length, const guint encoding);
作为:
proto_tree_add_item(tree, hfindex, tvb, start, 1, encoding);
所以在一个案例中:
proto_tree_add_item(tree, hfindex, tvb, start, 8, encoding);
......而在另一种情况下:
{{1}}
Wireshark代码库包含许多解剖器,因此您可以使用许多示例来帮助您,因此您可以随意浏览代码以及各种自述文件。
答案 1 :(得分:0)
如Christopher Maynard帖子所述。要指定协议项,请使用proto_tree_add_item()
方法。如果此项具有可变的数据长度,并且此长度是接收到的数据包的一部分,则可以从解剖器传递的tvb缓冲区中提取它。
示例:
static int dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
gint msglen, offset = 0;
proto_item *ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, ENC_NA);
proto_tree *foo_tree = proto_item_add_subtree(ti, ett_foo);
//first item - fixed length - byte contains next item length
proto_tree_add_item(foo_tree, hf_foo_len, tvb, offset, 1, ENC_BIG_ENDIAN);
//extract value from buffer
msglen = tvb_get_guint8(tvb, offset++);
//second item - variable length
proto_tree_add_item(foo_tree, hf_foo_name, tvb, offset, msglen, ENC_BIG_ENDIAN);
offset += msglen;
...