因为使用tshark保存捕获的数据时不支持显示过滤器 我正在尝试创建可以在Wireshark中读取的有效帽文件。
我用
捕获数据tshark -x
在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对象表示法(175) 框架号:1 帧长:260字节(2080位) 捕获长度:260个字节(2080位) [标有框:False] [框架被忽略:错误] [框架中的协议:json:data-text-lines] JavaScript 基于对象表示法行的文本数据 (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 \ 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可读文件?
还是我做错了什么?
答案 0 :(得分:1)
数据包捕获是将数据包和元数据组织在一起的文件格式。 * shark系列主要使用两种格式:
如果要查看pcap的文件字节(包括文件头)的外观,请this article用2个ARP数据包来解构捕获。
有许多python解析器可以创建Wireshark可以读取的捕获文件。最通用的是Scapy,用于读取和生成数据包。您可以读写pcap,而不必担心文件头:
首先使用tshark生成一个1数据包文件:
tshark -w example.pcap -c 1
然后用capy阅读。在这里,我们使用扩展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