【问题标题】:Are raw data provided by tshark full?tshark 提供的原始数据是否完整?
【发布时间】:2020-01-02 22:42:30
【问题描述】:

因为使用 tshark 保存捕获的数据时不支持显示过滤器 我正在尝试创建可以在 Wireshark 中读取的有效 cap 文件。

我用

捕获数据

tshark -i wlan2 -V -x -q -Y "radiotap.channel.freq > 2400 && radiotap.channel.freq

在 python 中,我使用以下方法抓取原始数据:

for line in io.TextIOWrapper(tshark_process.stdout, encoding="utf-8"):
   substring = oneline[5:53]    
   clean = ''.join([c for c in substring if 34 < ord(c) < 127])    
   raw_packet += clean

我正在将这些数据转换回原始十六进制数据:

newFile = open("filename.cap", "wb")
newFile.write(bytes.fromhex(raw_packet))   

我也试过了:

newFile.write(bytearray(binascii.unhexlify(raw_packet)))

newFile.write(binascii.unhexlify(raw_packet))

但是当我在 Wireshark 中打开 filename.cap 时,我看不到正常的数据包数据:

第 1 帧:线路上 260 字节(2080 位),捕获 260 字节(2080 位) 封装类型:JavaScript Object Notation (175) 帧数:1 帧长:260 字节(2080 位) 捕获长度:260 字节(2080 位) [框架标记:假] [框架被忽略:假] [框架中的协议:json:data-text-lines] JavaScript Object Notation 基于行的文本数据 (1 行) [截断]\000\000 \000\256@\000\240 \b\000\240 \b\000\000\020\002l\t\240\000\336\000d\000\000\000\000\000\000\001\200\000\000\000\377\377\377\377 \377\377\264\373\344J\352\346\264\373\344J\352\346p!\200\201+A'\000\000\000d\0001\004\000\

tshark 提供的原始数据是否完整?

如何将它们转换回 Wireshark 可读文件?

或者我做错了什么?

【问题讨论】:

    标签: python wireshark


    【解决方案1】:

    捕获格式

    数据包捕获是与元数据一起组织数据包的文件格式。 *shark 家族主要使用两种格式:

    • pcap:tcpdump 推广的格式,基于libpcap
    • pcapng:支持保存更多元数据的现代格式(如数据包统计信息、接口名称、捕获操作系统等)默认情况下,*shark 保存为这种格式。

    如果您想查看 pcap 的文件字节,包括文件头,this article 会使用 2 个 ARP 数据包解构捕获。

    Python 和数据包

    有许多 python 解析器可以创建 Wireshark 可以读取的捕获文件。最通用的是Scapy,它既用于读取数据包,也用于生成数据包。您可以读取和写入 pcap 而无需担心文件头:

    产生流量

    先用tshark生成一个1包文件:

    tshark -w example.pcap -c 1
    

    读取捕获

    然后用 scapy 阅读。这里我们使用扩展 Python 解释器的 Scapy 解释器。您可以通过在脚本中添加from scapy.all import * 来做同样的事情。请注意,Scapy 提供了更多工具来操作数据包。

    >>> capture = rdpcap("example.pcap")
    >>> len(capture)
    1
    >>> for pkt in capture:
    ...:     pkt.show()
    ###[ Ethernet ]###
      dst= 6c:96:cf:d8:7f:e7
      src= ac:86:74:a9:56:42
      type= 0x800
    ###[ IP ]###
         version= 4
         ihl= 5
         tos= 0x20
         len= 60
         id= 0
         flags= DF
         frag= 0
         ttl= 55
         proto= tcp
         chksum= 0x1abd
         src= 17.253.17.209
         dst= 10.255.250.18
         \options\
    ###[ TCP ]###
            sport= http
            dport= 50653
            seq= 616207835
            ack= 2603062618
            dataofs= 10
            reserved= 0
            flags= SA
            window= 28880
            chksum= 0x21e6
            urgptr= 0
            options= [('MSS', 1456), ('SAckOK', b''), ('Timestamp', (4160359186, 
    1059821791)), ('NOP', None), ('WScale', 8)]
    

    写捕获

    写回 pcap 也同样简单:

    >>> wrpcap('written.pcap', capture)
    

    验证

    检查 Tshark 是否可以读取生成的written.pcap,我们看到它可以:

    $ tshark -r written.pcap
        1   0.000000 usscz2-vip-bx-009.aaplimg.com → 10.255.250.18 TCP  74 http(80) → 50653 [SYN, ACK] Seq=0 Ack=1 Win=28880 Len=0 MSS=1456 SACK_PERM=1 TSval=4160359186 TSecr=1059821791 WS=256 6c:96:cf:d8:7f:e7 ← ac:86:74:a9:56:42
    

    【讨论】:

    • 请注意,您也可以在 Scapy 中使用 sniff() 然后 wrpcap 进行捕获(请参阅上面的最佳答案)
    • @Ross Jacobs 非常感谢您的出色回答,但我的问题是,我不能使用 tshark -w 选项,因为我需要使用更多具有不同频率滤波器的 WiFi 适配器,而频率滤波器是只是显示过滤器,不能与-w 选项结合使用。所以我需要手动检查数据包,如果它有正确的频率然后写入可读的原始数据。
    • 如果您的完整 tshark 命令是相关的,您可能需要将其添加到您的问题中。
    • @Vladimír 提及以防它没有注册为通知
    • 这是我完整的 tshark 命令tshark -i wlan2 -V -x -q -Y "radiotap.channel.freq &gt; 2400 &amp;&amp; radiotap.channel.freq &lt; 2500"
    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2023-04-02
    • 2014-04-27
    • 2018-10-10
    • 2021-05-29
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多