Pyshark用法介绍(pyshark用法)

一、安装与环境配置

Pyshark是一款Python封装的Wireshark网络协议分析工具。使用Pyshark能够方便地在Python代码中读入pcap文件或者在线抓包进行高效地网络数据分析。

使用pyshark前需要安装Wireshark,并添加Wireshark环境变量。可以在命令行运行wireshark查看是否安装成功。在Windows中配置时,需要在环境变量中添加Wireshark的相关路径。

# 快速安装pyshark
pip install pyshark

二、基础用法

在使用Pyshark时,先创建一个Pcap对象,用于打开pcap文件或者在线抓包,然后对该对象进行配置,在进行操作。

可以使用filter参数提供Berkeley包过滤器语法进行过滤解析,也可以直接设置追踪的协议。通过parse方法将抓到的网络数据转化成Packets对象进行操作。

如果只处理少量的数据包的话,可以直接遍历Packets对象访问各个数据包。

import pyshark

# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')

# 配置过滤器
cap.set_display_filter('http')

# 遍历抓到的数据包
for packet in cap:
    print(packet.http)

三、协议解析

Pyshark支持的协议解析非常的丰富,包括TCP、UDP、ICMP、HTTP、SMB、SMTP、POP3等。对于每个协议,都有对应的属性和方法可以进行访问和操作。

以HTTP协议为例,可以访问HTTP对象的方法和属性,获取HTTP数据的相关信息,比如请求类型、请求地址、请求头、请求内容、响应类型、响应头、响应内容等。

import pyshark

# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')

# 配置过滤器
cap.set_display_filter('http')

# 遍历抓到的HTTP数据包
for packet in cap.http:
    print(packet.http.request.method)
    print(packet.http.request.uri)
    print(packet.http.request_full_uri)
    print(packet.http.cookie)

四、SSL解密

在HTTPS中,数据是进行加密传输的,普通的抓包工具是无法解析和捕获到数据的。但是,使用Wireshark可以捕获到加密过的数据,并将其导出成pcap文件。

Pyshark提供了SSL解密的方式,先需要在Wireshark中对SSL进行配置,生成TLS密钥文件。接下来在Pyshark中将TLS密钥文件导入,即可进行SSL解密操作。

import pyshark

# 加载TLS密钥文件
pyshark.tshark.tshark.get_tshark_interfaces()[-1].ssl_keylog_file = '/path/to/your/keylog/file'

# 打开加密的pcap文件
cap = pyshark.FileCapture('test-ssl.pcap', ssl_keylog='/path/to/your/keylog/file')

# 配置过滤器
cap.set_display_filter('http')

# 遍历抓到的HTTP数据包
for packet in cap.http:
    print(packet.http.request.method)
    print(packet.http.request.uri)
    print(packet.http.request_full_uri)
    print(packet.http.cookie)

五、协议定制

Pyshark支持对其它具有特定协议的数据包进行解析。以HTTP为例,可以生成一个HTTP协议的数据包类,通过inherited_fields参数进行相关方法和属性的继承和增加。

import pyshark

# 定义自定义协议类
class MyHTTPPacket(pyshark.packet.Packet):
    """定义HTTP数据包"""
    decode_as = {
        # 指定解码类型为HTTP协议
        pyshark.LayerType.PDNS: 'http'
    }

    def __init__(self, *args, **kwargs):
        super(MyHTTPPacket, self).__init__(*args, **kwargs)

    @property
    def method(self):
        return self.http.request.method

# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')

# 配置过滤器
cap.set_display_filter('http')

# 遍历抓到的HTTP数据包
for packet in cap:
    if packet.http:
        my_packet = MyHTTPPacket(packet)
        print(my_packet.method)

六、高效抓包

可以使用Pyshark的LiveCapture类进行高效在线抓包,指定网卡名称或者网卡地址等信息进行抓包。

在抓包时可以使用BPF过滤器进行抓包范围的配置,避免大量无用数据的传输,提升抓包效率。

import pyshark

# 指定所需抓包的网卡和过滤器
capture = pyshark.LiveCapture(interface='en0', display_filter='http')

# 持续抓包
for packet in capture.sniff_continuously():
    print(packet.http)

七、参考资料

1、Pyshark官方文档:https://kiminewt.github.io/pyshark/

2、Wireshark官方网站:https://www.wireshark.org/

Published by

风君子

独自遨游何稽首 揭天掀地慰生平