Wireshark Dissector:如何解码变长字段

时间:2017-10-05 13:56:13

标签: wireshark-dissector

我是编码的新手,' c' Wireshark解剖器,所以我有一个非常基本的问题,关于解码具有可变长度的字段的方法,这意味着在某些数据包中它可以是1字节,而在其他数据包中它可以是8字节。

是否有处理此问题的模式?最好的方法是什么?例子真棒!

感谢。

2 个答案:

答案 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;
    ...