3

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

例如,为了获得 BSSID 值:

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

    "wlan.bssid": "11:22:33:44:55:66"
    
  • 然后我可以使用:

    value = packet['wlan'].get_field_value('bssid')
    
  • 预期结果:

    value == '11:22:33:44:55:66'
    
  • 对于这种情况,它工作正常。

但是当我移动到信标数据包中的“wlan_mgt”部分时,我遇到了以下情况的问题,如下所示: - 在 Json 格式文件中,它显示:

      "wlan_mgt.tagged.all": {
        "wlan_mgt.tag": {
          "wlan_mgt.tag.number": "0",
          "wlan_mgt.tag.length": "5",
          "wlan_mgt.ssid": "MWIFI"
        },
        "wlan_mgt.tag": {
          "wlan_mgt.tag.number": "1",
          "wlan_mgt.tag.length": "6",
          "wlan_mgt.supported_rates": "24",
          "wlan_mgt.supported_rates": "164",
          "wlan_mgt.supported_rates": "48",
          "wlan_mgt.supported_rates": "72",
          "wlan_mgt.supported_rates": "96",
          "wlan_mgt.supported_rates": "108"
        },
        "wlan_mgt.tag": {
          "wlan_mgt.tag.number": "5",
          "wlan_mgt.tag.length": "7",
          "wlan_mgt.tim.dtim_count": "0",
          "wlan_mgt.tim.dtim_period": "1",
          "wlan_mgt.tim.bmapctl": "0x00000000",
          "wlan_mgt.tim.bmapctl_tree": {
            "wlan_mgt.tim.bmapctl.multicast": "0",
            "wlan_mgt.tim.bmapctl.offset": "0x00000000"
          },
          "wlan_mgt.tim.partial_virtual_bitmap": "00:10:00:00",
          "wlan.tim.aid": "0x0000000c"
        },

正如我们所见,“wlan_mgt.supported_rates”有多个条目,字段名称(键)相同,每个条目的值不同,我需要将它们全部获取。但是如果我使用: - 如果我使用:

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

- 然后它只给我值'24',这是第一个条目的值。而且我不知道如何检索其他条目值,因为键名是相同的。

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

请建议如何获取所有数据,并提前非常感谢!

BR,
亚历克斯

4

3 回答 3

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查看所有可用字段。

于 2017-04-28T06:23:34.653 回答
1

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

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

tshark -r some_file.pcap -T json

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

这个也在Wireshark-dev上发布,有人修复了这个,但是代码还没有插入。

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

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)
于 2019-01-15T14:55:41.277 回答
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)

我希望这个对你有用

于 2018-07-25T15:02:05.337 回答