python - tshark 提供的原始数据是否完整?
问题描述
因为使用 tshark 保存捕获的数据时不支持显示过滤器,所以我正在尝试创建可以在 Wireshark 中读取的有效 cap 文件。
我用
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 时,我看不到正常的数据包数据:
帧 1:线上 260 字节(2080 位),捕获 260 字节(2080 位) 封装类型:JavaScript 对象表示法(175) 帧号:1 帧长度:260 字节(2080 位) 捕获长度:260 字节(2080 位) [框架标记:False] [框架被忽略:False] [框架中的协议:json:data-text-lines] JavaScript Object Notation 基于行的文本数据(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\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 可读文件?
或者我做错了什么?
解决方案
捕获格式
数据包捕获是与元数据一起组织数据包的文件格式。*shark 家族主要使用两种格式:
如果您想查看 pcap 的文件字节(包括文件头),本文将使用 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
推荐阅读
- azure - 如何使用 Arm 模板更新现有 Azure Vm 规模集
- vb.net - Keyboard.SendKeys 是 Forms.Sendkeys 的更新?
- angular - Cordova + Angular 4 + GTM(谷歌标签管理器)需要的项目?
- sublimetext3 - 从目录路径安装 Sublime 包
- javascript - Firefox、触摸事件和“平滑”滚动行为——导致不滚动
- r - 差异表达基因分析:如何对不同临床矩阵的表达矩阵进行t.test?
- amazon-web-services - 如何跨多个服务器实例保留“计数器”变量?
- php - 有没有办法将每个循环中的对象传递到 swiftmailer 消息中?
- javascript - 有没有办法执行从 JavaScript 中的输入标签抓取的代码?
- android - 在 IO 线程上调用 doOnSubscribe