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」などの同じフィールド名を持つ他の多くのエントリがありますが、フィールド値は異なるため、この問題は私にとってはブロッカーです。

Pls はすべてのデータを取得する方法をアドバイスし、事前に感謝します!

BR、
アレックス

4

3 に答える 3

1

これは深刻な問題であり、「wireshark ツール」のより多くの場所に存在します。

たとえば、pcap ファイルの読み取りに tshark を使用する場合。

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 に答える