在tshark,tcpdump或类似文件中导出原始数据包字节?

时间:2016-12-19 20:35:25

标签: wifi extract wireshark pcap tshark

上下文

我有一个包含许多WLAN探测请求的* .pcap文件。我的目标是将每个探测请求的WLAN管理帧提取为原始字节(即,没有标头,没有额外信息 - 只有像原始捕获的原始字节一样)。

在Wireshark中,我只需右键单击管理框架并选择“Export Packet Bytes ...”: Wireshark Raw Packet Byte Extraction

如果我选择“RAW”作为文件格式,Wireshark会给我我想要的内容:一个只包含所选字节的文件。

问题:

我需要以编程方式自动执行此任务。我遇到了tsharktcpdumpcapedit等工具。但是,这些工具似乎都不允许我提取WLAN管理框架,仅此而已。

虽然我能够使用tcpdump在stdout上获得所需的字节作为ASCII,但我无法将它们保存到文件或变量中。另外,我只能针对单个探测请求执行此操作,而不是针对* .pcap文件中的所有探测请求。

当前方法:

如上所述,我能够在stdout上获得所需的ASCII字节:

$ tcpdump -r capture.pcap -c 1 -x
reading from file capture.pcap, link-type IEEE802_11_RADIO (802.11 plus radiotap header)
11:24:52.933799 1.0 Mb/s 2457 MHz 11b -77dBm signal antenna 1 Probe Request () [1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 Mbit]
    0x0000:  0000 0108 8284 8b0c 1296 1824 3204 3048
    0x0010:  606c 2d1a ac01 02ff ff00 0000 0000 0000
    0x0020:  0000 0000 0000 0000 0000 0000 0000

要提取原始字节,我可以将此输出简单地输入grepsedxxd

$ tcpdump -r capture.pcap -c 1 -x | grep "0x00" | sed  's/0x[[:xdigit:]]*:[[:space:]]*//g' | xxd -r -p > rawbytefile

显然,这是一种完成我想要的东西,而且必须有更好的方法。没有人想要的代码高度依赖于其他人的程序以人为中心的输出。

问题:

  1. 如何以正确的方式提取WLAN管理帧? (在命令行/以编程方式 - 使用Bash,Python等)
  2. 如何在* .pcap文件中为每个探测请求执行此操作? (同样,以适当的方式 - 通过解析ASCII输出构建另一个hacky循环并不是真正应该做的......)

4 个答案:

答案 0 :(得分:2)

您可以使用我的Java库Pcap4J来实现它。

sed -e ':a;N;$!ba;s/LOAD_FILE\n/LOAD_FILE\nDELIMITER AS \x27|\x27\n/g'pcap4j-core.jar添加到您的类路径并执行如下代码:

pcap4j-packetfactory-static.jar

答案 1 :(得分:2)

与kaitoy的答案类似,但使用Python的scapy库:

from scapy.all import *

with PcapReader('/root/capture.pcap') as pcap_reader:
    for pkt in pcap_reader:
        if pkt.haslayer(Dot11ProbeReq):
            probe_req = pkt.getlayer(Dot11ProbeReq)
            raw_probe_req = bytes(probe_req)
            hexdump(raw_probe_req)

答案 2 :(得分:2)

我想你已经找到了解决方案,但我想我会发布一个可能的替代解决方案,它可能满足你的需求,也可能不满足tshark。如果禁用“ wlan_mgt ”协议,则“ wlan ”有效负载将传递给可以打印的通用“数据”解析器。例如:

tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data

...或者如果您愿意,可以在字节之间使用冒号分隔符:

tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data.data

较早版本的tshark不允许您在命令行上禁用特定协议,因此在这种情况下您必须在Wireshark中禁用“ wlan_mgt ”解剖器首先或创建一个单独的Wireshark配置文件,然后通过tshark选项告知-C <configuration profile>使用该配置文件。

我正在运行旧版本的Wireshark(1.12.13),在我的测试中似乎存在一个错误,因为只打印了一部分探测请求数据包。也许这个bug在较新版本的Wireshark中得到修复,但如果没有,可以提交Wireshark bug report请求修复此问题。

答案 3 :(得分:1)

以下示例从特定字段中提取所有已过滤数据包中的二进制转储。如果需要从其他字段中提取,请替换“ nfs.data”字段名称。要快速获取正确的字段名称,请打开WireShark,将数据包扩展到所需的位置,右键单击字段->复制->“字段名称”。

tshark -r <trace file> -Y "<whatever combination of filters>" -T fields -e nfs.data | tr -d '\n',':' | xxd -r -ps > out.bin

tshark以文本格式生成十六进制转储,其中单个数据包的字节之间用分号分隔符,而块之间用换行符分隔

“ tr -d'\ n',':'“删除了所有换行符和分号

“ xxd -r -ps”最终将十六进制文本转储的连续流转换为二进制,这与从WireShark中“导出原始文件”的结果相同。