上下文
我有一个包含许多WLAN探测请求的* .pcap文件。我的目标是将每个探测请求的WLAN管理帧提取为原始字节(即,没有标头,没有额外信息 - 只有像原始捕获的原始字节一样)。
在Wireshark中,我只需右键单击管理框架并选择“Export Packet Bytes ...”:
如果我选择“RAW”作为文件格式,Wireshark会给我我想要的内容:一个只包含所选字节的文件。
问题:
我需要以编程方式自动执行此任务。我遇到了tshark
,tcpdump
,capedit
等工具。但是,这些工具似乎都不允许我提取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
要提取原始字节,我可以将此输出简单地输入grep
,sed
和xxd
:
$ tcpdump -r capture.pcap -c 1 -x | grep "0x00" | sed 's/0x[[:xdigit:]]*:[[:space:]]*//g' | xxd -r -p > rawbytefile
显然,这是一种完成我想要的东西,而且必须有更好的方法。没有人想要的代码高度依赖于其他人的程序以人为中心的输出。
问题:
答案 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中“导出原始文件”的结果相同。