tshark提供的原始数据是否完整?
Are raw data provided by tshark full?
因为用tshark保存捕获的数据时不支持显示过滤器
我正在尝试创建可以在 Wireshark 中读取的有效上限文件。
我使用
捕获数据
tshark -i wlan2 -V -x -q -Y "radiotap.channel.freq > 2400 && radiotap.channel.freq < 2500"
在 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 时,我没有看到正常的数据包:
Frame 1: 260 bytes on wire (2080
bits), 260 bytes captured (2080 bits)
Encapsulation type: JavaScript Object Notation (175)
Frame Number: 1
Frame Length: 260 bytes (2080 bits)
Capture Length: 260 bytes (2080 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: json:data-text-lines] JavaScript
Object Notation Line-based text data
(1 lines)
[truncated][=15=]0[=15=]0 [=15=]06@[=15=]00 \b[=15=]00
\b[=15=]0[=15=]00[=15=]2l\t0[=15=]06[=15=]0d[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]10[=15=]0[=15=]0[=15=]0777777434J26434J26p!01+A'[=15=]0[=15=]0[=15=]0d[=15=]01[=15=]4[=15=]0\
tshark提供的原始数据是否完整?
如何将它们转换回 Wireshark 可读文件?
或者我做错了什么?
捕获格式
数据包捕获是组织数据包和元数据的文件格式。 *shark 家族主要使用两种格式:
- pcap: Format popularized by tcpdump, which is based on libpcap
- pcapng:支持保存更多元数据(如数据包统计、接口名称、捕获OS等)的现代格式,*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
因为用tshark保存捕获的数据时不支持显示过滤器 我正在尝试创建可以在 Wireshark 中读取的有效上限文件。
我使用
捕获数据tshark -i wlan2 -V -x -q -Y "radiotap.channel.freq > 2400 && radiotap.channel.freq < 2500"
在 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 时,我没有看到正常的数据包:
Frame 1: 260 bytes on wire (2080 bits), 260 bytes captured (2080 bits) Encapsulation type: JavaScript Object Notation (175) Frame Number: 1 Frame Length: 260 bytes (2080 bits) Capture Length: 260 bytes (2080 bits) [Frame is marked: False] [Frame is ignored: False] [Protocols in frame: json:data-text-lines] JavaScript Object Notation Line-based text data (1 lines) [truncated][=15=]0[=15=]0 [=15=]06@[=15=]00 \b[=15=]00 \b[=15=]0[=15=]00[=15=]2l\t0[=15=]06[=15=]0d[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]10[=15=]0[=15=]0[=15=]0777777434J26434J26p!01+A'[=15=]0[=15=]0[=15=]0d[=15=]01[=15=]4[=15=]0\
tshark提供的原始数据是否完整?
如何将它们转换回 Wireshark 可读文件?
或者我做错了什么?
捕获格式
数据包捕获是组织数据包和元数据的文件格式。 *shark 家族主要使用两种格式:
- pcap: Format popularized by tcpdump, which is based on libpcap
- pcapng:支持保存更多元数据(如数据包统计、接口名称、捕获OS等)的现代格式,*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