cti*_*tze 5 extract pcap wireshark wifi tshark
语境:
我有一个包含许多 WLAN 探测请求的 *.pcap 文件。我的目标是将每个探测请求的 WLAN 管理帧提取为原始字节(即,没有标头,也没有额外信息 - 只有像最初捕获的原始字节)。
在 Wireshark 中,我只需右键单击管理框架并选择“导出数据包字节...”:

如果我选择“RAW”作为文件格式,Wireshark 就会给出我想要的内容:一个仅包含所选字节的文件。
问题:
我需要以编程方式自动执行此任务。我遇到过诸如tshark、tcpdump、capedit等工具。但是,这些工具似乎都不允许我提取 WLAN 管理框架,仅此而已。
虽然我能够使用 stdout 以 ASCII 形式获取所需的字节tcpdump,但我无法将它们保存到文件或变量中。此外,我只能针对单个探测请求执行此操作,而无法针对 *.pcap 文件中的所有探测请求执行此操作。
目前的方法:
如上所述,我能够在标准输出上以 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
Run Code Online (Sandbox Code Playgroud)
要提取原始字节,我可以简单地将此输出传输到grep、sed和xxd:
$ tcpdump -r capture.pcap -c 1 -x | grep "0x00" | sed 's/0x[[:xdigit:]]*:[[:space:]]*//g' | xxd -r -p > rawbytefile
Run Code Online (Sandbox Code Playgroud)
显然,这是实现我想要的东西的一种相当老套的方法,并且必须有更好的方法。没有人想要高度依赖于其他人的程序以人为中心的输出的代码。
问题:
我想您已经找到了一个解决方案,但我想我会发布一个可能的替代解决方案,该解决方案可能会也可能不会满足您的需求,并且仅使用tshark. 如果禁用“ wlan_mgt ”协议,“ wlan ”有效负载将传递到通用“ data ”解析器,可以打印该解析器。例如:
tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data
Run Code Online (Sandbox Code Playgroud)
...或者如果您愿意的话,可以在字节之间使用冒号分隔符:
tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data.data
Run Code Online (Sandbox Code Playgroud)
旧版本tshark不允许您在命令行上禁用特定协议,因此在这种情况下,您必须首先在 Wireshark 中禁用“ wlan_mgt ”解析器,或者创建一个单独的 Wireshark 配置文件,在其中禁用它,然后告诉tshark通过选项使用该配置文件-C <configuration profile>。
我正在运行旧版本的 Wireshark (1.12.13),在我的测试中似乎存在错误,因为仅打印了探测请求数据包的子集。也许该错误已在较新版本的 Wireshark 中得到修复,但如果没有,则可以提交Wireshark 错误报告,请求修复此问题。
您可以使用我的 Java 库Pcap4J来实现它。
将pcap4j-core.jar和添加pcap4j-packetfactory-static.jar到您的类路径并执行如下代码:
PcapHandle handle = Pcaps.openOffline("/path/to/your.pcap");
while (true) {
try {
Packet packet = handle.getNextPacketEx();
Dot11ProbeRequestPacket probe = packet.get(Dot11ProbeRequestPacket.class);
if (probe == null) { continue; }
byte[] mgmtFrame = ByteArrays.getSubArray(
probe.getRawData(),
probe.getHeader().getFrameControl().isOrder() ? 28 : 24
);
System.out.println(ByteArrays.toHexString(mgmtFrame, ""));
} catch (EOFException e) {
break;
} catch (PcapNativeException | TimeoutException | NotOpenException e) {
e.printStackTrace();
}
}
handle.close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15573 次 |
| 最近记录: |