Pyshark:如果相同的键名(字段名称)显示具有不同值的多个条目,则只能获得第一个字段值

时间:2017-04-28 02:09:15

标签: python python-3.x wireshark wireshark-dissector pyshark

我正在使用Pyshark来解析Wireshark嗅探器日志,并且我使用导出的Json格式文件(基于pcapny文件)来查找使用' get_field_value'函数来检索字段值。

例如,为了获得BSSID值:

  • 在Json格式文件中,此信息显示为

    tidyr
  • 然后我可以使用:

    library(tidyverse)
    
    # Create example data frame
    dt <- data.frame(a = c(1241.3233, 5632.2344, 1313.8643))
    
    # Separate the column a into col1 and col2
    dt2 <- dt %>%
      separate(a, into = c("col1", "col2"))
    
  • 预期结果:

    "wlan.bssid": "11:22:33:44:55:66"
    
  • 对于这种情况,它工作正常。

但是当我搬到&#39; wlan_mgt&#39;信标包中的部分如下所示: - 在Json格式文件中,它显示:

value = packet['wlan'].get_field_value('bssid')

正如我们所看到的,&#34; wlan_mgt.supported_rates&#34;有多个条目,字段名称(键)相同,每个条目的值都不同,我需要将它们全部输入。但如果我使用: - 如果我使用:

value == '11:22:33:44:55:66'

- 然后它只给了我价值&#39; 24&#39;这是第一个条目的价值。我不知道如何检索其他条目值,因为密钥名称是相同的。

是否应该返回所有值的列表,例如[&#39; 24&#39;,&#39; 164&#39;,&#39; 48&#39;&#39; 72&#39;,& #39; 96&#39; 108&#39;],而不仅仅是第一个条目值? 因为基于嗅探器日志(Json格式),所以存在许多具有相同字段名称的其他条目  &#39; wlan_mgt.tag.number&#39;,但是字段值不同,所以这个问题对我来说是一个阻碍。

请告知如何获取所有数据,并提前多多谢谢!

BR,
亚历

3 个答案:

答案 0 :(得分:1)

首先,您不必使用item subset和get_field_value来获取字段值。 而不是

value = packet['wlan_mgt'].get_field_value('supported_rates')

您可以使用:

value = packet.wlan_mgt.supported_rates

为了在JSON模式下获取wifi数据包上的标签,您可以使用packet.wlan_mgt.tagged.all.tag。这为您提供了所有标签的列表,您可以使用python过滤它以仅查找支持的费率标签。 我打算专门针对这样的WiFi内容进行扩展,因为它很麻烦,但我还没有机会。如果你看看wireshark上的字段,你可以看到类别是tagged.all。

此外,在查找字段等时,我建议使用具有自动完成功能的解释器(例如IPython),这样您就可以看到哪些字段可用,或者只使用packet_layer.field_names查看所有可用字段。 / p>

答案 1 :(得分:1)

我遇到了类似的问题,我正在检查字段option_len,并且只得到一个值而不是一个数组,并且无法直接找到简单的答案;我最终使用的解决方案是访问字段内部可用的替代字段,如以下代码所示:

ol_arr = []
for x in cap[3].tcp._all_fields.values():
    if x.name == 'tcp.option_len':
        print(x.all_fields)
        for k in x.all_fields:
            print(k.get_default_value())
            ol_arr.append(k.get_default_value())
        break
print(ol_arr)

我希望这会有所帮助

答案 2 :(得分:1)

这是一个严重的问题,在“ wireshark工具”中的更多地方都存在。

例如,使用tshark读取pcap文件时。

tshark -r some_file.pcap -T json

它还返回包含一些多个键的json。

这也发布在Wireshark-dev and someone repair this中,但是尚未插入代码。

您可以使用以下代码解决此问题:

import json

def parse_object_pairs(pairs):
    """
    This function get list of tuple's
    and check if have duplicate keys.
    if have then return the pairs list itself.
    but if haven't return dict that contain pairs.

    >>> parse_object_pairs([("color": "red"), ("size": 3)])
    {"color": "red", "size": 3}

    >>> parse_object_pairs([("color": "red"), ("size": 3), ("color": "blue")])
    [("color": "red"), ("size": 3), ("color": "blue")]

    :param pairs: list of tuples.
    :return dict or list that contain pairs.
    """
    dict_without_duplicate = dict()
    for k, v in pairs:
        if k in dict_without_duplicate:
            return pairs
        else:
            dict_without_duplicate[k] = v

    return dict_without_duplicate

decoder = json.JSONDecoder(object_pairs_hook=parse_object_pairs)

str_json_can_be_with_duplicate_keys = '{"color": "red", "size": 3, "color": "red"}'

data_after_decode = decoder.decode(str_json_can_be_with_duplicate_keys)